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

Java 類加載與初始化順序深度解析:父子類靜態/實例成員執行時序

     編輯:Java 相關知識

核心規則總覽

  1. 靜態優於實例:靜態變量/靜態塊 > 實例變量/實例塊 > 構造器
  2. 父類優於子類:父類靜態 → 子類靜態 → 父類實例 → 子類實例
  3. 順序遵循聲明順序:同類別內按代碼從上到下執行

無繼承場景驗證

public class InitOrderTest {
    public static String staticField = "靜態變量";
    public String field = "實例變量";
    static { System.out.println(staticField); System.out.println("靜態塊"); }
    { System.out.println(field); System.out.println("實例塊"); }
    public InitOrderTest() { System.out.println("構造器"); }
    public static void main(String[] args) { new InitOrderTest(); }
}

輸出:

靜態變量
靜態塊
實例變量
實例塊
構造器

繼承場景完整時序

class Parent {
    public static String pStatic = "父類-靜態變量";
    public String pField = "父類-實例變量";
    static { System.out.println(pStatic); System.out.println("父類-靜態塊"); }
    { System.out.println(pField); System.out.println("父類-實例塊"); }
    public Parent() { System.out.println("父類-構造器"); }
}

public class SubClass extends Parent {
    public static String sStatic = "子類-靜態變量";
    public String sField = "子類-實例變量";
    static { System.out.println(sStatic); System.out.println("子類-靜態塊"); }
    { System.out.println(sField); System.out.println("子類-實例塊"); }
    public SubClass() { System.out.println("子類-構造器"); }
    public static void main(String[] args) { new SubClass(); }
}

輸出:

父類-靜態變量
父類-靜態塊
子類-靜態變量
子類-靜態塊
父類-實例變量
父類-實例塊
父類-構造器
子類-實例變量
子類-實例塊
子類-構造器

關鍵細節補充

  • main 方法執行前,所有靜態成員已完成初始化(含父子類)
  • 子類構造器隱式調用 super(),若父類無無參構造器必須顯式 super(args)
  • 僅加載類(不實例化)時,只執行靜態初始化
  • 靜態變量與靜態塊按聲明順序交替執行,實例變量與實例塊同理

口訣速記

先靜後動,先父後子,從上到下,先變後構

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