首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java初始化機制深度解析:類、變量、代碼塊加載順序

     編輯:Java 相關知識

系統梳理Java初始化全流程:基本類型默認值、實例/靜態變量初始化順序、靜態/非靜態代碼塊、數組初始化、繼承體系下的構造器鏈與多態調用陷阱、類加載觸發條件與初始化時機。

1. 基本類型默認值

類字段未顯式賦值時自動初始化:boolean:false、char:'\u0000'、數值類型0、引用類型null。局部變量無默認值,必須手動賦值。

2. 實例變量初始化順序

按聲明順序初始化,早於構造器執行,即使穿插在方法定義之間。示例Card類中Tag t1/t2/t3依次初始化,隨後構造器執行,最後t3在構造器中重新賦值(輸出驗證順序)。

3. 靜態變量初始化

僅在首次訪問該類(創建實例或訪問靜態成員)時執行一次,按聲明順序。StaticInitialization輸出證明:Table靜態字段b1/b2在首次new Table()前初始化;Cupboard靜態字段b4/b5在首次new Cupboard()前初始化;後續創建實例不再重複靜態初始化。

4. 靜態代碼塊

static { ... }可包含多條靜態初始化語句,同靜態字段一樣在類首次加載時執行一次。ExpilicitStatic演示:訪問Cups.c1或new Cups()均觸發靜態塊,僅執行一次。

5. 非靜態實例代碼塊

{ ... }每實例化一次對象就執行一次,早於構造器主體。Mugs輸出驗證:兩次new Mugs()各觸發一次實例塊。

6. 數組初始化

基本類型數組new int[N]自動填充默認值;引用類型數組new Integer[N]僅分配引用槽位(均為null),各元素需顯式new Integer()賦值。

7. 繼承體系初始化

構造器鏈自基類向派生類遞歸調用(隱式或顯式super(...))。基類構造器先完成,保證派生類可安全訪問基類成員。若基類無無參構造器,派生類必須顯式調用帶參super且置於首行。

8. 構造器中調用多態方法的陷阱

基類構造器調用被覆寫方法時,派生類字段尚未初始化(仍為默認值0/null)。Glyph構造器調用draw()導致RoundGlyph.draw()見到radius=0而非預期1或構造器參數5。根因:內存清零→基類構造器→派生類字段顯式初始化→派生類構造器主體。

9. 類加載與初始化完整流程

  1. JVM啟動加載入口類(含main),遞歸加載父類。
  2. 自根基類向下執行靜態初始化(字段與塊)。
  3. 實例化對象:內存清零→基類構造器鏈→派生類字段初始化→派生類構造器主體。

Beetle extends Insect案例完整輸出驗證上述流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved