为什么我的字段没有初始化为我给它的值

Tom*_*Tom 3 java

我有以下课程:

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

Running Main打印以下内容:x:0 | y:6

为什么0打印x?

Dmi*_*nko 10

不良行为的原因是错误的初始化序列:

  1. new SubClass()执行AClass构造函数
  2. AClass 构造函数调用 aMethod()
  3. aMethod()显示x(0到目前为止),y这是6因为是静态的)
  4. SubClass初始化其非静态字段,因此x变为5.

为避免惊慌失措,请不要在构造函数中调用方法(尤其是overriden)

  • 但是Java中的所有方法都是虚拟的不是吗?但并非所有都可以覆盖. (2认同)