【发布时间】:2012-08-23 21:45:15
【问题描述】:
我有这个演示代码:
class Test2 extends Test {
public int number = 0;
@Override
public void set(){
number = 1;
info();
}
@Override
public void info(){
System.out.println(number);
}
}
public class Test {
public Test(){
set();
}
public void set(){
}
public void info(){
}
public static void main(String[] args){
Test2 object = new Test2();
object.info();
}
}
代码给出了这个输出:
1
0
为什么?我期望这个输出:
1
1
在我看来,main函数调用Test2类的构造函数来创建一个对象。构造函数自动调用超类的构造函数。此构造函数调用被覆盖的方法 set()。因此调用了 Test2 类的方法 set()。此方法设置字段并调用写入数字的 info() 方法。然后主函数再次调用创建对象的info()方法。
数字字段正确设置为第一行输出为“1”。但是为什么第二行包含 0?似乎根本没有设置该字段。能解释一下吗?
我应该怎么做才能得到我期望的行为?提前致谢!
【问题讨论】:
-
看起来字段初始化器在 Java 中的构造函数之后运行,因此在
set方法将其设置为 1 后,初始化器将值重置为 0。您应该避免在构造函数中调用虚方法,因为你在一个部分构造的对象中调用行为。
标签: java overriding field super