Test3.java:
public class Test3 {
public static void main(String[] args) {
A a = new A();
}
}
class A extends B {
A() {
System.out.println("Now in A()");
}
void m() {
System.out.println("Now in m() of A");
}
}
class B {
B() {
System.out.println("Now in B()");
m();
}
void m() {
System.out.println("Now in m() of B");
}
}
输出:
$ java Test3
Now in B()
Now in m() of A
Now in A()
为什么不"现在在B"的m()中在第二行输出?
答案 0 :(得分:3)
因为m
中的方法A
被覆盖了。因此,当它转到超级构造函数和类m
时,该对象仍然是A
的实例,因此它调用A
中的方法。
答案 1 :(得分:2)
因为Java中的方法默认为virtual
,所以如果使用Java 6或更高版本,建议您使用@Override
注释,这会使事情变得更清晰。
第一个问题是:为什么第一行是
Now in B()
原因是:当你可以用Java扩展一个类时,编译器会自动为你调用super constructor
A() {
super(); // added by Java !!
System.out.println("Now in A()");
}
所以,现在我们在B's constructor
B() {
System.out.println("Now in B()"); // print this
m(); // Ohh hang on, m() is overridden
}
因为m()
被子类A覆盖,而实际的实例是A类,所以我们将调用A的m()实现,这是一个多态调用。