我遇到了以下代码:
BaseClass的:
public class BaseClass {
String name = "Base";
public BaseClass() {
printName();
}
public void printName() {
System.out.println(name + "——Base");
}
}
DrivedClass:
public class SubClass extends BaseClass {
String name = "Sub";
public SubClass() {
printName();
}
public void printName() {
System.out.println(name + "——Sub");
}
public static void main(String[] args) {
new SubClass();
}
}
运行代码时,输出为:
空 - 子
Sub - Sub
虽然它应该是:
基 - 基地
Sub - Sub
我想知道为什么BaseClass构造函数调用SubClass方法,有人能解释一下吗?提前谢谢。
答案 0 :(得分:4)
第一行(" null - Sub" )的打印是printName()
SubClass
从{{1}调用的结果构造函数。从BaseClass
构造函数调用printName()
时,由于BaseClass
中存在重写方法,因此调用SubClass
。
此时,由于尚未调用printName()
构造函数,SubClass
的{{1}}字段未定义,因此会打印name
。
第二行(" Sub-Sub" )的打印是SubClass
null
从{{1}调用的结果构造函数。这一次,实例字段被加载,因此,printName()
打印正确的值(即)" Sub"。
这里需要注意的是,两个时间SubClass
只SubClass
方法被调用。只是第一次(因为它是从name
类构造函数调用),它的实例字段没有定义,第二次,它们是。