類在實例化時的執行順序

順序如下:

1、父類靜態代碼塊

2、子類靜態代碼塊

3、父類非靜態代碼

4、父類構造函數

5、子類非靜態代碼

6、子類構造函數

舉個例子:

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();
    }
}

在上面那個Demo中輸出的結果是:YXYZ

初始化過程: 

1. 初始化父類中的靜態成員變量和靜態代碼塊 ; 

2. 初始化子類中的靜態成員變量和靜態代碼塊 ; 

3.初始化父類的普通成員變量和代碼塊,再執行父類的構造方法;

4.初始化子類的普通成員變量和代碼塊,再執行子類的構造方法; 

 

下面在針對另外一種實例化的Dem

public class Test
{
    public static Test t1 = new Test();
    {
         System.out.println("blockA");
    }
    static
    {
        System.out.println("blockB");
    }
    public static void main(String[] args)
    {
        Test t2 = new Test();
    }
 }


/**
*結果爲:blockA blockB blockA
*/

解析如下:

靜態塊:用static申明,JVM加載類時執行,僅執行一次
構造塊:類中直接用{ }定義,每一次創建對象時執行


執行順序優先級:靜態塊>main()>構造塊>構造方法
main方法也是靜態的方法,所以也會在構造塊之前執行。

靜態塊按照申明順序執行,先執行Test t1 = new Test();觸發了構造塊的執行,所以先輸出blockA,然後執行靜態塊,輸出blockB,最後執行main方法,再輸出一次構造塊,方法中的Test t2 = new Test();輸出blockA。

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