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()
调用B
的initializeLayout()
)在子[的实例变量之前执行=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。
最好避免。
我不明白为什么一个私有变量是空的,即使它是内联初始化的。这是我的代码片段:
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()
调用B
的initializeLayout()
)在子[的实例变量之前执行=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。
最好避免。