類初始化順序是面試高頻考點,也是理解物件生命週期的關鍵。本文通過可執行代碼與執行結果,徹底釐清「誰先誰後」的鐵律。
public class InitOrderTest {
public static String staticField = "靜態變量";
public String field = "變量";
// 靜態初始化塊
static {
System.out.println(staticField);
System.out.println("靜態初始化塊");
}
// 實例初始化塊
{
System.out.println(field);
System.out.println("初始化塊");
}
// 建構子
public InitOrderTest() {
System.out.println("建構方法");
}
public static void main(String[] args) {
new InitOrderTest();
}
}
靜態變量
靜態初始化塊
變量
初始化塊
建構方法
父類靜態變量/塊 → 子類靜態變量/塊 → 父類實例變量/塊 → 父類建構子 → 子類實例變量/塊 → 子類建構子
核心原則:父類初始化完全結束後,子類才開始;靜態只在類首次載入時跑一次,實例每次實例化都跑。
final 修飾的實例變量必須在宣告時、實例塊或建構子中賦值,且僅能賦值一次。