淺談Java變數的初始化順序詳解_java

來源:互聯網
上載者:User

規則1(無繼承情況下):
對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的初始化順序依次是
(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器
證明代碼:

複製代碼 代碼如下:

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();
    }
}

結果顯示:
靜態變數
靜態初始化塊
變數
初始化塊
構造器

規則2(有繼承情況下):
子類的靜態變數和靜態初始化塊的初始化是在父類的變數、初始化塊和構造器初始化之前就完成

複製代碼 代碼如下:

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("父類--構造器");
    }
}//如果你想把這兩個類放在同一個檔案且名字起為SubClass, 父類前不能加public
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();
    }
}

結果顯示:
父類--靜態變數
父類--靜態初始化塊
子類--靜態變數
子類--靜態初始化塊
父類--變數
父類--初始化塊
父類--構造器
子類--變數
子類--初始化塊
子類--構造器

規則2(靜態變數和靜態初始化塊):
靜態變數和靜態初始化塊是依照他們在類中的定義順序進行初始化的。同樣,變數和初
始化塊也遵循這個規律。

複製代碼 代碼如下:

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

個人總結:
先靜後動,先父後子,從上到下,先變數後構造

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.