奇怪,但我找不到这个问题的重复项。我有一个带有 overrideMe() 方法的超类和一个覆盖它的子类。在调用子类构造函数之前,final 字段真的被初始化了吗?正如我从输出中看到的那样,它是。
下面是输出: Superclass constr str value: someValue Subclass constr str value: someValue
你能给我解释一下吗?我认为实例变量是在构造函数调用中初始化的,但不是在它之前。
这是代码:
public class Test {
public Test() {
System.out.println("Superclass constr");
overrideMe();
}
public void overrideMe() {
}
}
class Ext extends Test {
private final String str = "someValue";
public Ext() {
System.out.println("Subclass constr");
}
@Override
public void overrideMe() {
System.out.println("str value: " + str);
}
public static void main(String[] args) {
Ext test = new Ext();
test.overrideMe();
}
}
编辑: 如果我将 str 字段声明为非最终字段,则它在构造函数中的子类调用将按我的预期返回 null。