Java: 初始化的内联私有最终字段为空

Java: initialized inline private final field is null

我不明白为什么一个私有变量是空的,即使它是内联初始化的。这是我的代码片段:

public abstract class A {
    public A() {
        initialize();
    }

    protected abstract void initializeLayout();
    protected void initialize() {
        // Do something
        initializeLayout();
    }
}

public abstract class B extends A {
    private final Object myVariable = new Object();

    @Override
    protected void initializeLayout() {
        // Do something with myVariable
    }
}

好吧,当这段代码到达B.initailizeLayout时,myVariable 为NULL。我认为内联字段是在其他所有内容之前初始化的,甚至在构造函数之前。我是不是哪里出错了?

超classA​​的构造函数(调用initialize()调用BinitializeLayout())在子[的实例变量之前执行=16=] B 被初始化。因此,您的实例变量 myVariable 当时仍然为 null。

子 B 的(可能是隐式的)构造函数将执行以下操作:

  • 将所有字段清零(null、0、0.0、false)
  • 调用super A的构造函数
    • 调用 B.initializeLayout 所有字段都为空
  • 初始化声明中分配给的所有字段
  • 调用构造函数的其余部分

所以你正在尝试做的事情在 java 中很容易出错。 许多样式检查器将此代码标记为不良样式(在构造函数中调用非最终方法)。

你可以

private /*final*/ Object myVariable; // Must not be initialized!

@Override
protected void initializeLayout() {
    myVariable = new Object();
    // Do something with myVariable
}

初始化 myVariable 会在调用 initializeLayout 后初始化 myVariable。

最好避免。