java基礎學習筆記——靜態初始化塊,初始化塊,構造函數的執行順序

代碼:


class A {
    static {
        System.out.println("Static init A.");
    }

    {
        System.out.println("Instance init A.");
    }

    A() {
        System.out.println("Constructor A.");
    }
}

class B extends A {
    static {
        System.out.println("Static init B.");
    }

    {
        System.out.println("Instance init B.");
    }

    B() {
        System.out.println("Constructor B.");
    }
}

class C extends B {

    static {
        System.out.println("Static init C.");
    }

    {
        System.out.println("Instance init C.");
    }

    C() {
        System.out.println("Constructor C.");
    }
}

public class Test2 {

    static {
        System.out.println("Static init Test2.");
    }

    {
        System.out.println("Instance init Test2.");
    }

    public Test2() {
        System.out.println("Constructor Test2.");
    }

    public static void main(String[] args) {
        C c = new C();
        C C1 = new C();
    }
}

輸出:

Static init Test2.
Static init A.
Static init B.
Static init C.
Instance init A.
Constructor A.
Instance init B.
Constructor B.
Instance init C.
Constructor C.
Instance init A.
Constructor A.
Instance init B.
Constructor B.
Instance init C.
Constructor C.

從上面的結果可以看出:
所有的靜態初始化塊都優先執行,其次纔是非靜態的初始化塊和構造函數,它們的執行順序是:
父類的靜態初始化塊
子類的靜態初始化塊
父類的初始化塊
父類的構造函數
子類的初始化塊
子類的構造函數

總結

靜態初始化塊的優先級最高,也就是最先執行,並且僅在類第一次被加載時執行;
非靜態初始化塊和構造函數後執行,並且在每次生成對象時執行一次;
非靜態初始化塊的代碼會在類構造函數之前執行。因此若要使用,應當養成把初始化塊寫在構造函數之前的習慣,便於調試;
靜態初始化塊既可以用於初始化靜態成員變量,也可以執行初始化代碼;
非靜態初始化塊可以針對多個重載構造函數進行代碼複用。

參考:

Java的初始化塊、靜態初始化塊、構造函數的執行順序及用途探究

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章