奇怪,但我找不到這個問題的重複。 我有一個超類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') –