系統梳理Java初始化全流程:基本類型默認值、實例/靜態變量初始化順序、靜態/非靜態代碼塊、數組初始化、繼承體系下的構造器鏈與多態調用陷阱、類加載觸發條件與初始化時機。
類字段未顯式賦值時自動初始化:boolean:false、char:'\u0000'、數值類型0、引用類型null。局部變量無默認值,必須手動賦值。
按聲明順序初始化,早於構造器執行,即使穿插在方法定義之間。示例Card類中Tag t1/t2/t3依次初始化,隨後構造器執行,最後t3在構造器中重新賦值(輸出驗證順序)。
僅在首次訪問該類(創建實例或訪問靜態成員)時執行一次,按聲明順序。StaticInitialization輸出證明:Table靜態字段b1/b2在首次new Table()前初始化;Cupboard靜態字段b4/b5在首次new Cupboard()前初始化;後續創建實例不再重複靜態初始化。
static { ... }可包含多條靜態初始化語句,同靜態字段一樣在類首次加載時執行一次。ExpilicitStatic演示:訪問Cups.c1或new Cups()均觸發靜態塊,僅執行一次。
{ ... }每實例化一次對象就執行一次,早於構造器主體。Mugs輸出驗證:兩次new Mugs()各觸發一次實例塊。
基本類型數組new int[N]自動填充默認值;引用類型數組new Integer[N]僅分配引用槽位(均為null),各元素需顯式new Integer()賦值。
構造器鏈自基類向派生類遞歸調用(隱式或顯式super(...))。基類構造器先完成,保證派生類可安全訪問基類成員。若基類無無參構造器,派生類必須顯式調用帶參super且置於首行。
基類構造器調用被覆寫方法時,派生類字段尚未初始化(仍為默認值0/null)。Glyph構造器調用draw()導致RoundGlyph.draw()見到radius=0而非預期1或構造器參數5。根因:內存清零→基類構造器→派生類字段顯式初始化→派生類構造器主體。
main),遞歸加載父類。Beetle extends Insect案例完整輸出驗證上述流程。