奇怪,但我找不到这个问题的重复。 我有一个超类overrideMe()方法和一个覆盖它的子类。 在调用子类构造函数之前,最终字段是否真正初始化? 正如我从输出中看到的那样。子类中的最终字段初始化
下面是输出: 超类构造 STR值:someValue中 子类构造 STR值: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();
}
}
编辑: 如果我declasre STR场非最终,它在构造函数中调用子类返回null如我所料。
每个构造函数都会先调用'super'(或'this'调用'super'),这样超类始终会被初始化。 (除了没有超类的'java.lang.Object') –