为什么以下程序输出Method B 0而不是Method B 200?我无法理解我的问题是什么.
class A{
int a=100;
void myMethod(){
System.out.println("myMethod of A : "+a);
}
A(){
myMethod();//calling my method
}
}
class B extends A{
int a=200;
void myMethod(){
System.out.println("myMethod of B : "+a);
}
}
class Demo{
public static void main(String args[]){
new B();
}
}
Run Code Online (Sandbox Code Playgroud)
实例字段初始化程序在调用超类构造函数后运行.所以执行的顺序是:
new B()B:super()
AA.a为100myMethod,被覆盖BB.a是0A 构造函数返回B.a为200B构造函数的主体,它是空的如您所见,println当B.a字段尚未初始化时,您的呼叫就会发生.
这就是为什么myMethod()从构造函数中执行已被覆盖(在您的情况下)的方法是如此危险 - 它最终可能会使用尚未完成正常初始化的状态.