我有以下 class :
public abstract class AClass {
public AClass() {
aMethod();
}
abstract protected void aMethod();
}
public class SubClass extends AClass {
private int x = 5;
private static final int y = 6;
@Override
protected void aMethod() {
System.out.println("x: " + x + " | y: " + y);
}
}
public class Main {
public static void main(String[] args) {
new SubClass();
}
}
正在运行Main将打印以下内容:x:0 | y:6
为什么0为x打印?
最佳答案
行为不当的原因是错误的初始化顺序:
new SubClass()
执行AClass
构造函数AClass
构造函数调用aMethod()
aMethod()
显示x
(到目前为止是0
)和y
(由于是静态的,因此是6
)SubClass
初始化其非静态字段,因此x
变为5
。 为避免意外,切勿在构造函数中调用虚拟方法(尤其是重写的方法)