Why is superclass method called while that method is overriden? (from OCA practice test)
本问题已经有最佳答案,请猛点这里访问。
从这些OCA实践问题(pdf)中的问题3开始:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | abstract class Writer { public static void write() { System.out.println("Writing..."); } } class Author extends Writer { public static void write() { System.out.println("Writing book"); } } public class Programmer extends Writer { public static void write() { System.out.println("Writing code"); } public static void main(String[] args) { Writer w = new Programmer(); w.write(); } } |
输出为
我不明白为什么。由于
为什么?
你必须理解两点。
对于
和
如我们所知,不能重写
当
现在,在运行时,编译器只检查引用类型(因为它是一个静态方法,所以编译器不关心为调用该方法而创建的对象。记住,静态方法是类方法)。因此,编译器检查并发现引用
引用的类型是
这种机制称为方法隐藏。
查看这些案例:
1 2 3 4 5 6 7 |
我自己找到了答案。
在Java中没有重写静态方法的事情。这就是为什么从超类引用调用静态方法时,将调用超类静态方法。
所以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class SuperClass { public static void write() { System.out.println("Writing Super"); } public void writeMore() { System.out.println("super something"); } } public class SubClass extends SuperClass { public static void write() { System.out.println("Writing Sub"); } public void writeMore() { System.out.println("sub something"); } } public class Test { public static void main(String[] args) { SuperClass super = new SubClass(); super.write(); super.writeMore(); } } |
意志输出
1 2 | Writing super sub something |
如果要从子类调用static write()方法。你必须从一个子类中引用它。例如。:
1 2 | SubClass sub = new Subclass(); sub.write(); |
我了解到的一些信息来源:https://www.geeksforgeks.org/can-we-overload-or-override-static-methods-in-java/为什么Java不允许重写静态方法?