1. 程式人生 > 其它 >建立物件時類的呼叫順序

建立物件時類的呼叫順序

程式碼塊

1.建立一個物件時,在一個類中呼叫的順序是:

1.呼叫靜態程式碼塊和靜態屬性初始化(優先順序相同,如果有多個,則按他們定義的順序呼叫)
2.呼叫普通程式碼塊和普通屬性的初始化(優先順序相同,如果有多個,則按他們定義的順序呼叫)
3.構造方法是最後才呼叫

例項:

package com.example.Codeblock;


/**
 * @author gaoqinghui
 * @date 2022/4/26 22:35


public class CodeBlockDetail02 {
    public static void main(String[] args) {
        Detail01 detail01 = new Detail01();
        
    }
}

class Detail01 {

    private int n2 = getN2();   //非靜態屬性

    //普通程式碼塊
    {
        System.out.println("Detail01普通程式碼塊被執行");
    }

    //下面這個是靜態屬性初始話,呼叫順序的優先順序和靜態程式碼塊相同
    //如果都兩個都有,按放置的位置來決定誰先背呼叫
    private static int n1 = getN1();

    static {
        System.out.println("Detail01靜態程式碼塊被執行");
    }


    public static int getN1() {
        System.out.println("getN1被呼叫");
        return 100;
    }

    public int getN2() {        //非靜態方法
        System.out.println("getN2被呼叫");
        return 200;
    }

    //無參構造器
    public Detail01() {
        System.out.println("Detail01()構造器被呼叫");
    }
}

2.構造器的最前面其實隱含了super()和呼叫普通程式碼塊,但是靜態相關的程式碼塊和靜態屬性初始化是最先執行的,不管在什麼時候,因為在類載入時就執行了靜態相關的程式碼塊和靜態屬性初始化。

package com.example.Codeblock;



/**
 * @author gaoqinghui
 * @date 2022/4/26 23:03
 */
public class CodeBlockDetail03 {
    public static void main(String[] args) {
        new BBB();
        //輸出結果:1.AAA的靜態程式碼塊被執行 2.AAA()構造器被執行 3.BBB普通程式碼塊被執行 4.BBB()構造器被執行
    }
}


class AAA {
    //進來後先找靜態程式碼塊,再找普通程式碼塊,再找構造器
    static {
        System.out.println("AAA的靜態程式碼塊被執行");
    }

    public AAA() {
        //super();      去找object的構造器
        //本類普通程式碼塊
        System.out.println("AAA()構造器被執行");
    }

    {
        System.out.println("AAA的普通程式碼塊被執行");
    }
}

class BBB extends AAA{

    {
        System.out.println("BBB普通程式碼塊被執行");
    }

    public BBB() {
        //super(); 去到父類中先找靜態程式碼塊,再找普通程式碼塊,再找構造器
        //呼叫本類普通程式碼塊
        System.out.println("BBB()構造器被執行");
    }
}

3.建立一個子類時(有繼承關係),他們的靜態程式碼塊、靜態屬性初始化、普通程式碼塊、普通屬性初始化,構造方法的呼叫順序如下:

1. 父類的靜態程式碼塊和靜態屬性初始化(優先順序一樣,按定義順序執行);
2. 子類的靜態程式碼塊和靜態屬性初始化(優先順序一樣,按定義順序執行);
3. 父類的普通程式碼塊和普通屬性初始化(優先順序一樣,按定義順序執行);
4. 父類的構造方法;
5. 子類的普通程式碼塊和普通屬性初始化(優先順序一樣,按定義順序執行);
6. 子類的構造方法;