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

Java 類初始化順序完全指南:靜態塊、構造塊、構造函數與繼承關係

     編輯:Java 綜合教學

核心概念辨析

成員語法執行時機執行次數
靜態變數static int a = 1;類載入時一次
靜態初始化塊static { ... }類載入時,按聲明順序一次
實例變數int b = 2;建立物件時,在構造函數前每次 new
實例初始化塊{ ... }建立物件時,按聲明順序,在構造函數前每次 new
構造函數public Class() {}建立物件時,最後執行每次 new

單一類初始化順序演示

public class OrderTest {
    static String sVar = "靜態變數";
    String iVar = "實例變數";
    static { System.out.println(sVar); System.out.println("靜態塊"); }
    { System.out.println(iVar); System.out.println("實例塊"); }
    public OrderTest() { System.out.println("構造函數"); }
    public static void main(String[] args) { new OrderTest(); }
}
// 輸出:
// 靜態變數
// 靜態塊
// 實例變數
// 實例塊
// 構造函數

規律:(靜態變數、靜態塊) > (實例變數、實例塊) > 構造函數。同類別內按「自上而下」聲明順序執行。

繼承體系下的初始化順序

關鍵步驟

  1. 父類靜態變數、靜態塊(按順序)
  2. 子類靜態變數、靜態塊(按順序)
  3. 執行 main 或觸發子類載入的邏輯
  4. 父類實例變數、實例塊
  5. 父類構造函數
  6. 子類實例變數、實例塊
  7. 子類構造函數

完整範例輸出

父類--靜態變量
父類--靜態初始化塊
子類--靜態變量
子類--靜態初始化塊
子類main方法
父類--變量
父類--初始化塊
父類--構造器
i=9, j=0
子類--變量
子類--初始化塊
子類--構造器
i=9,j=20

注意:子類靜態成員初始化在父類實例成員之前完成。父類構造函數執行時,子類實例變數尚未初始化(預設值),這在多態調用時極易踩坑。

實戰避坑指南

  • 靜態塊中避免依賴子類狀態(尚未初始化)。
  • 構造函數中不要調用可被覆寫的方法,否則子類邏輯會在父類構造期間執行,訪問未初始化的子類欄位。
  • 需延遲初始化靜態資源時,使用靜態內部類模式(參見單例模式)。

總結圖解

類載入階段:     父靜態 → 子靜態
實例化階段:     父實例變數/塊 → 父構造 → 子實例變數/塊 → 子構造
記住口訣:靜態先行,父前子後,塊前構後。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved