在Java中,是否有任何方法可以在父类构造函数运行之前初始化字段?
即使是我能想到的最丑陋的hack也会被编译器拒绝:
注意:当我从继承转为委托时,问题消失了,但我仍然想知道原因。
即使是我能想到的最丑陋的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;
}
}
注意:当我从继承转为委托时,问题消失了,但我仍然想知道原因。
a
吗? - Woot4Moosuper
调用后的每个构造函数中。因此,在字段初始化之前,始终会先运行超级构造函数。 - Rohit Jaina
只能在Derived
中访问,那么在调用super()
之前初始化它有什么影响呢?在你提供的示例中,紧随其后立即初始化并没有什么区别(除非你从基类构造函数调用一个已被覆盖的方法,这开始变得可疑)。 - assylias