/*
*
* 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方法---》父類的構造語句塊---》父類的構造方法---》子類的構造語句塊---》子類的構造方法。
非常感謝大家的點評和指正,運行結果沒有問題,只是順序寫錯了。