java 靜態語句塊 構造快 構造器的初始化順序

/*
 * 
 * All Rights Reserved.
 */
package com.thinkInJava.chapter05;


public class Father {

    public Father() {
        System.out.println("Father");
    }

    static {
        System.out.println("I am Father class");
    }

    {
        System.out.println("Father Class");
    }
}

 

子類:

 

package com.thinkInJava.chapter05;


public class Sun extends Father{

    public Sun(){
        System.out.println("Sun");
    }
    
    static{
        System.out.println("I am sun class");
    }
    
    {
        System.out.println("sun class");
    }
    
    public static void main(String[] args) {
        new Sun();
    }
}


運行結果:

I am Father class
I am sun class
Father Class
Father
sun class
Sun

 

當 類在進行初始化時一定是先初始化父類中的靜態的內容,父類靜態的內容出事完畢後,會初始化子類中的靜態內容,然後會再次查看父類中是否存在非靜態的內容, 如果有則進行初始化,然後回到子類中查找是否存在非靜態的內同需要初始化,如果有則進行初始化。最後執行父類中的構造方法,父類構造方法執行完後執行子類 的構造方法。

總結:

父類的靜態語句塊---》子類的靜態語句塊---》父類的構造語句塊---》父類的構造方法---》子類的構造語句塊---》子類的構造方法。

 

在進一步改進一下子類中main方法結果會是怎樣呢?

    public static void main(String[] args) {
        new Sun();
        System.out.println("===================");
        new Sun();
    }


運行結果:

I am Father class
I am sun class

Father Class
Father
sun class
Sun
===================
Father Class
Father
sun class
Sun

從運行結果看到紅色變大的字體部分屬於父類和子類中的靜態內同:運行順序依然是:父類的靜態語句塊---》子類的靜態語句塊---》父類的構造語句塊---》父類的構造方法---》子類的構造語句塊---》子類的構造方法。

但是我們在main方法中創建了兩個子類對象,但是靜態內同值初始化一次,而構造語句塊每次都會初始化,這也是構造語句塊和靜態語句塊的區別。

 

再次修改子類中的main方法

    public static void main(String[] args) {
        
        System.out.println("main start");
        new Sun();
        System.out.println("===================");
        new Sun();
        System.out.println("main end");
    }


運行結果如下:

I am Father class
I am sun class
main start
Father Class
Father
sun class
Sun
===================
Father Class
Father
sun class
Sun
main end

通過運行結果可以看到完整的執行順序爲:父類的靜態語句塊---》子類的靜態語句塊---》main方法---》父類的構造語句塊---》父類的構造方法---》子類的構造語句塊---》子類的構造方法。

 

非常感謝大家的點評和指正,運行結果沒有問題,只是順序寫錯了。

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