有一個代碼作爲初級Java開發人員的任務給出。我在五年的使用Java和這段代碼完全混淆了我:Java:對象的初始化順序
public class Main {
String variable;
public static void main(String[] args) {
System.out.println("Hello World!");
B b = new B();
}
public Main(){
printVariable();
}
protected void printVariable(){
variable = "variable is initialized in Main Class";
}
}
public class B extends Main {
String variable = null;
public B(){
System.out.println("variable value = " + variable);
}
protected void printVariable(){
variable = "variable is initialized in B Class";
}
}
輸出將是:
Hello World!
variable value = null
但是,如果我們改變String variable = null;
到String variable;
我們將有:
Hello World!
variable value = variable is initialized in B Class
第二個輸出對我來說更加清晰。 所以,據我所知inizialisation的在Java中這樣的順序:
- 我們去的類層次結構的根(用於Java它總是對象類),當我們來到這根父類:
- 所有靜態數據字段初始化;
- 執行所有靜態字段初始值設定項和靜態初始化塊;
- 所有非靜態數據字段被初始化;
- 執行所有非靜態字段初始化程序和非靜態初始化塊;
- 默認的構造函數被執行;
- 然後,我們不斷爲底層子類的程序。
也有帖子裏面描述了一個超類的背景下this
關鍵字的行爲 - Calling base class overridden function from base class method
基於上面給出的規則,我認爲有順序是這樣的:
- 我們將創建
B
類的新實例; - 我們到部分類
Main
; - 用null初始化
main.variable
; - 然後我們轉移到
Main
類的默認構造函數; - 構造在
Main
類調用方法b.printVariable()
; (爲什麼不調用它main.printvariable
我們沒有在這裏this
鍵字?) - 領域
b.variable
「變量是在B級初始化」 - 現在我們再回到類
B
; - 我們應該初始化場
b.variable
與空值,是嗎?; B
類的默認構造函數執行
請,能有人給的這種繼承inizialisation序列是如何工作的一個完整的,全面的解釋。以及爲什麼更改String variable = null;
到String variable;
導致另一個輸出。
printVariable(會發生什麼)是一個非常誤導的方法名字 - 應該更像setVariable( ) – Jimmt 2013-02-25 17:50:45
你已經寫了5年的Java,你不知道如何使用調試器? (單步執行代碼會告訴你到底發生了什麼以及按什麼順序)。 – 2013-02-25 18:04:55
@BrianRoach當然,我可以使用debuger,我也試過javap -v -c B.class。但是每次當我看到java開發人員或面試問題的這些任務時,我都會嘗試預測輸出並理解它,爲什麼它會像這樣工作,以及如果稍微修改代碼會發生什麼情況。逐步進行並沒有解釋執行過程的規則和原因。 – INlHELL 2013-02-27 09:58:32