java为什么超类B调用子类A的方法?
测试3。爪哇:
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()中”
# 1 楼答案
因为方法
m
在A
中被重写。因此,当它转到超级构造函数并调用m
时,该对象仍然是A
的实例,因此它调用A
中的方法# 2 楼答案
因为Java中的方法在默认情况下是
virtual
,如果您使用Java 6或更高版本,建议您使用@Override
注释,这样会使事情更清楚第一个问题是:为什么第一行是
原因是:当您可以在Java中扩展类时,编译器将自动为您完成对
super constructor
的调用所以,现在我们在
B's constructor
因为
m()
被子类A覆盖,而实际实例的类型是A,所以我们将调用A的m()实现,这是一个多态调用