Java 物件建立過程遵循嚴格順序,理解此機制對繼承體系設計、避免初始化錯誤至關重要。以下代碼演示父/子類別靜態/實例區塊、建構子、欄位初始化的執行順序:
class A {
{ show(0); } // 父類別實例初始化區塊 1
int x = 1; // 父類別欄位初始化
{ show(1); } // 父類別實例初始化區塊 2
A() { x = 2; } // 父類別建構子
void show(int label) {}
}
class B extends A {
{ show(2); } // 子類別實例初始化區塊 1
int y = 1; // 子類別欄位初始化
{ show(3); } // 子類別實例初始化區塊 2
B() { y = 2; } // 子類別建構子
void show(int label) {
System.out.println(label + ": x=" + x + " y=" + y);
}
}
public class C {
public static void main(String[] args) {
new B().show(4);
}
}
0: x=0 y=0 1: x=1 y=0 2: x=2 y=0 3: x=2 y=1 4: x=2 y=2
注意:靜態成員(靜態欄位、靜態區塊)在類別載入階段(首次主動使用類別時)初始化,早於上述實例初始化流程,且父類別靜態優於子類別靜態。