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

Java 變量初始化順序深度解析:從基礎到繼承場景

     編輯:Java 相關知識

Java 變量初始化順序核心規則

在 Java 中,類加載與對象創建過程遵循嚴格的初始化順序。掌握這一機制對於理解靜態塊、構造器及繼承體系的行為至關重要。

規則一:無繼承情況下的初始化順序

當類獨立存在時,初始化順序為:

  1. 靜態變量與靜態初始化塊(按代碼出現順序)
  2. 實例變量與實例初始化塊(按代碼出現順序)
  3. 構造器

代碼驗證

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

輸出結果

靜態變量
靜態初始化塊
變量
初始化塊
構造器

規則二:存在繼承時的初始化順序

子類初始化前,會先完成父類的靜態初始化,然後才是子類的靜態初始化。實例化對象時,遵循「父類非靜態 → 父類構造器 → 子類非靜態 → 子類構造器」的鏈式調用。

代碼示例

class Parent {
    public static String p_StaticField = "父類--靜態變量";
    public String p_Field = "父類--變量";
    static {
        System.out.println(p_StaticField);
        System.out.println("父類--靜態初始化塊");
    }
    {
        System.out.println(p_Field);
        System.out.println("父類--初始化塊");
    }
    public Parent() {
        System.out.println("父類--構造器");
    }
}

public class SubClass extends Parent {
    public static String s_StaticField = "子類--靜態變量";
    public String s_Field = "子類--變量";
    static {
        System.out.println(s_StaticField);
        System.out.println("子類--靜態初始化塊");
    }
    {
        System.out.println(s_Field);
        System.out.println("子類--初始化塊");
    }
    public SubClass() {
        System.out.println("子類--構造器");
    }
    public static void main(String[] args) {
        new SubClass();
    }
}

輸出結果

父類--靜態變量
父類--靜態初始化塊
子類--靜態變量
子類--靜態初始化塊
父類--變量
父類--初始化塊
父類--構造器
子類--變量
子類--初始化塊
子類--構造器

規則三:同類別中靜態/非靜態成員的聲明順序影響

靜態變量與靜態塊、實例變量與實例塊,均按其在類中出現的先後順序執行。

代碼示例

public class TestOrder {
    public static TestA a = new TestA();
    public TestC c = new TestC();
    public static TestB b = new TestB();
    public TestOrder() {
        System.out.println("in constract");
    }
    static {
        System.out.println("靜態初始化塊");
    }
    public static void main(String[] args) {
        new TestOrder();
    }
}
class TestA { public TestA() { System.out.println("Test--A"); } }
class TestB { public TestB() { System.out.println("Test--B"); } }
class TestC { public TestC() { System.out.println("Test--C"); } }

輸出結果

Test--A
Test--B
靜態初始化塊
Test--C
in constract

總結口訣

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

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