为什么以下程序输出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();
}
}
答案 0 :(得分:7)
实例字段初始化程序在调用超类构造函数后运行。所以执行的顺序是:
new B()
B
的实例:super()
A
A.a
初始化为100 myMethod
B
B.a
0 A
构造函数返回B.a
初始化为200 B
构造函数的主体,该构造函数为空正如您所看到的,当println
字段尚未初始化时,您的B.a
来电就会发生。
这就是为什么从构造函数中执行已被覆盖的方法(在你的情况下是myMethod()
)是如此危险 - 它最终可能会处理尚未经过正常初始化的状态。< / p>
答案 1 :(得分:0)
当您执行 new B()时,将调用A类的默认构造函数。 A类的构造函数调用类B的myMethod()函数。 此时,B类中 a 的值不会是200(它将为0),因为它是由A类的构造函数调用的。
要获得所需内容,您应该在B类中定义默认构造函数,并将myMethod称为。
B(){
myMethod();
}