Beetle 繼承 Insect 完整追蹤
class Insect {
int i = 9; int j;
Insect() { prt("i=" + i + ", j=" + j); j = 39; }
static int x1 = prt("static Insect.x1 initialized");
}
class Beetle extends Insect {
int k = prt("Beetle.k initialized");
Beetle() { prt("k=" + k); prt("j=" + j); }
static int x2 = prt("static Beetle.x2 initialized");
}
運行輸出與階段解析
static Insect.x1 initialized ← 1. 基類靜態初始化(類加載時)
static Beetle.x2 initialized ← 2. 衍生類靜態初始化
Beetle constructor ← 3. main 打印
i = 9, j = 0 ← 4. 基類構造器:i=9(顯式), j=0(默認零值)
Beetle.k initialized ← 5. 衍生類成員初始化
k = 63 ← 6. 衍生構造器:k=63(prt返回值)
j = 39 ← 7. 基類構造器中 j=39 已生效
完整初始化順序鐵律
- 靜態初始化:按繼承層次自上而下(基類→衍生類),僅類首次加載時執行一次。
- 分配內存並清零:所有基本類型置 0/false,引用置 null。
- 基類構造器:遞歸向上執行,最先執行
Object 構造器。
- 衍生類成員初始化:按聲明順序執行顯式初始化/初始化塊。
- 衍生類構造器主體:執行構造器剩余代碼。
關鍵認知
- 靜態初始化與對象創建無關,類加載即觸發。
- 基類構造器運行時,衍生類成員仍為零值(詳見構造器多態陷阱)。
- 成員初始化在基類構造器之後、衍生構造器主體之前。
- 不創建對象也會執行靜態初始化(註釋掉
new Beetle() 驗證)。