Java 類初始化順序是面試高頻考點,亦是理解物件創建機制的基石。本文通過雙類繼承的完整代碼示例,逐步拆解父子類靜態變數、靜態塊、實例變數、實例塊、構造器的精確執行順序,並驗證多次實例化的差異。
class A {
static { print("A1"); }
static int num = getNum(); // 靜態變數賦值
{ print("A3"); } // 實例塊
String context = test(); // 實例變數賦值
A() { print("A2"); } // 構造器
}
class B extends A {
static { print("a"); }
{ print("c"); }
B() { print("b"); }
// 覆寫 test()、getNum()
}
new B(); new B();
第一次 new B():
A.getNum() → A1aB.test()(多態調用子類覆寫方法)→ A3A2cb輸出:A.getNum(),A1,a,B.test(),A3,A2,c,b,
第二次 new B():
靜態初始化已完成,直接從父類實例變數/塊開始:B.test(),A3,A2,c,b,