建立物件時類的呼叫順序
阿新 • • 發佈:2022-05-10
程式碼塊
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. 子類的構造方法;