Java靜態代碼塊、構造代碼塊、構造方法的執行順序

jopen 10年前發布 | 18K 次閱讀 Java開發

Java靜態代碼塊、構造代碼塊、構造方法的執行順序

靜態代碼優先于非靜態的代碼,是因為被static修飾的成員都是類成員,會隨著JVM加載類的時候加載而執行,而沒有被static修飾的成員也被稱為實例成員,需要創建對象才會隨之加載到堆內存。所以靜態的會優先非靜態的。
執行構造器(構造方法)的時候,在執行方法體之前存在隱式三步
1,super語句,可能出現以下三種情況:
1)構造方法體的第一行是this語句,則不會執行隱式三步,
2)構造方法體的第一行是super語句,則調用相應的父類的構造方法,
3)構造方法體的第一行既不是this語句也不是super語句,則隱式調用super(),即其父類的默認構造方法,這也是為什么一個父類通常要提供默認構造方法的原因;
2,初始化非靜態變量
3,構造代碼塊
由此可知,構造代碼塊優先于構造方法的方法體,但是this關鍵字跟super關鍵字不能同時出現,而且只能在代碼的第一行。如果出現了this關鍵字,隱式三步就不會執行。
例如,分析下面的代碼及執行結果,已經用注釋標出了執行步驟Step 1–Step 7。
也就是說,當遞歸調用多個構造方法的時候,構造代碼塊只會在最后的(也即方法體第一行不是this語句的)那個構造方法執行之前執行!

public class Test {
    public static int a = 0;

    static {// Step 1
        a = 10;
        System.out.println("靜態代碼塊在執行a=" + a);
    }

    {// Step 4
        a = 8;
        System.out.println("非靜態代碼塊(構造代碼塊)在執行a=" + a);
    }

    public Test() {
        this("調用帶參構造方法1,a=" + a); // Step 2
        System.out.println("無參構造方法在執行a=" + a);// Step 7
    }

    public Test(String n) {
        this(n, "調用帶參構造方法2,a=" + a); // Step 3
        System.out.println("帶參構造方法1在執行a=" + a); // Step 6
    }

    public Test(String s1, String s2) {
        System.out.println(s1 + ";" + s2);// Step 5
    }

    public static void main(String[] args) {
        Test t = null;// JVM加載Test類,靜態代碼塊執行
        System.out.println("下面new一個Test實例:");
        t = new Test();
    }
}

執行結果:

靜態代碼塊在執行a=10
下面new一個Test實例:
非靜態代碼塊(構造代碼塊)在執行a=8
調用帶參構造方法1,a=10;調用帶參構造方法2,a=10
帶參構造方法1在執行a=8
無參構造方法在執行a=8

http://bbs.csdn.net/topics/391001417

來自: http://blog.csdn.net//kingzone_2008/article/details/45015301

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!