1. 程式人生 > >Java初始化過程

Java初始化過程

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.程式執行到此處,結束。 } }