在Java中,有没有办法在超级构造函数运行之前初始化一个字段?
即使是我能想到的最丑陋的 hack 也会被编译器拒绝:
class Base
{
Base(String someParameter)
{
System.out.println(this);
}
}
class Derived extends Base
{
private final int a;
Derived(String someParameter)
{
super(hack(someParameter, a = getValueFromDataBase()));
}
private static String hack(String returnValue, int ignored)
{
return returnValue;
}
public String toString()
{
return "a has value " + a;
}
}
注意:当我从继承切换到委托时,问题消失了,但我仍然想知道。
原文由 fredoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议
不,没有办法做到这一点。
根据 语言规范,在调用
super()
之前,实例变量甚至不会被初始化。这些是在类实例创建的构造函数步骤中执行的步骤,取自链接: