1. 程式人生 > >靜態程式碼塊、非靜態程式碼塊、建構函式三者執行順序

靜態程式碼塊、非靜態程式碼塊、建構函式三者執行順序

主要探討一下關於靜態程式碼塊,非靜態程式碼塊,建構函式的執行順序。
如有錯誤,歡迎指出。

首先:


靜態成員變數和靜態程式碼塊的優先順序是一樣的,先定義的先執行。
在建立一個物件的時候會執行非靜態程式碼塊和建構函式

再者是執行順序:

/*
*
*(1)父類靜態成員和靜態初始化塊,按在程式碼中出現的順序依次執行。
*
*(2)子類靜態成員和靜態初始化塊,按在程式碼中出現的順序依次執行。
*
*(3)父類例項成員和例項初始化塊,按在程式碼中出現的順序依次執行。
*
*(4)執行父類構造方法。
*
*(5)子類例項成員和例項初始化塊,按在程式碼中出現的順序依次執行。
*
*(6)執行子類構造方法。
*
*/

public class StaticTest {
    public static StaticTest t1=new  StaticTest();   //靜態成員變數,第一步執行

    public static void main(String args[]) {
        StaticTest t2=new StaticTest();  //第三步執行
    }
    //靜態程式碼塊
    static{
        System.out.println("B");//第二步執行
    }
    //非靜態程式碼塊
    {
        System.out.println("A"
); } }

輸出:

A
B
A

再來看看這個程式碼,程式碼位置調換一下順序

public class StaticTest {
    public static void main(String args[]) {
        StaticTest t2=new StaticTest();  //第三步執行
    }
    //靜態程式碼塊
    static{
        System.out.println("B");//變成第一步執行
    }
    public static StaticTest t1=new  StaticTest();   //靜態成員變數,變成第二步執行
//非靜態程式碼塊 { System.out.println("A"); } }

輸出:

B
A
A

所以驗證:
1.靜態成員變數和靜態程式碼塊的優先順序是一樣的,先定義的先執行。
2.在建立一個物件的時候會執行非靜態程式碼塊和建構函式。