在 JVM 中,一個普通 Java 物件(不含數組、Class 物件)的誕生經歷以下嚴格順序:
new 指令,先檢查常數池中是否有該類的符號引用,並確認該類已被載入、解析、初始化。若未載入,觸發雙親委派模型載入類。<init> 方法(構造器):按程式碼順序執行:
super())+------------------+ | Object Header | <- Mark Word (哈希、鎖、GC 年齡等) + Klass Pointer (類元資料指標) +------------------+ | Instance Data | <- 非靜態欄位(含父類欄位),按分配策略排列 +------------------+ | Padding | <- 對齊填充(8 字節倍數) +------------------+
final 欄位:在構造器結束前必須賦值,JMM 保證構造器完成前對其他執行緒不可見(禁止指令重排)。this 引用若外洩(註冊監聽器、啟動執行緒),可能導致其他執行緒看到未完全初始化的物件。