Java初始化過程
阿新 • • 發佈:2019-01-29
Java初始化
總結:初始化順序:父類靜態變數——> 父類靜態程式碼塊 ——>子類靜態變數 ——> 子類靜態程式碼塊 ——>父類非靜態變數 ——>父類構造程式碼塊——> 父類建構函式 ——>字類非靜態變數 ——>子類構造程式碼塊——> 子類建構函式
靜態程式碼塊只會被執行一次!!!!
1. 關鍵:Java一個類的成員變數初始化先於建構函式執行。詳細請參考:
參考部落格:傳送門
2. 該程式碼為何輸出:YXYZ
class X{
Y y=new Y();
public X(){
System.out.print("X" );
}
}
class Y{
public Y(){
System.out.print("Y");
}
}
public class Z extends X{
Y y=new Y();
public Z(){
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
3.原因
執行順序如下列註釋序號所示
//下面程式碼輸出YXYZ的原因,和Java呼叫機制有關
class X{
//5.初始化動作總是先於建構函式執行,所以先執行類的初始化動作
//6.此處會呼叫類Y的建構函式
Y y=new Y();
public X(){
//3.此處隱藏了super()語句,所以呼叫直接父類Object的建構函式
//4.Object沒有父類,所以程式返回到此處.
//10.本類初始化完成,執行權回到此處,列印輸出X,程式返回
System.out.print("X");
}
}
class Y{
public Y(){
//7.此處隱藏了super()語句,所以呼叫直接父類Object的建構函式
//8.Object沒有父類,所以程式返回到此處.
//9.沒有成員變數需要初始化,所以繼續執行下面程式碼,列印輸出Y,程式返回
//13.此處隱藏了super()語句,所以呼叫直接父類Object的建構函式
//14.Object沒有父類,所以程式返回到此處.
//15.沒有成員變數需要初始化,所以繼續執行下面程式碼,列印輸出Y,程式返回
System.out.print("Y");
}
}
public class Z extends X{
//12.程式來到此處執行初始化動作,此處會呼叫類Y的建構函式
Y y=new Y();
public Z(){
//2.此處隱藏了super()語句,所以呼叫直接父類X的建構函式
//11.執行權回到此處,但本類成員變數尚未初始化,先初始化
//16.本類初始化完成,執行權回到此處,列印輸出Z,程式返回
System.out.print("Z");
}
public static void main(String[] args) {
//1.呼叫類Z的建構函式
new Z();
//17.程式執行到此處,結束。
}
}