我有以下 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

  • 为避免意外,切勿在构造函数中调用虚拟方法(尤其是重写的方法)

    08-16 16:25