【Java】類的初始化順序
阿新 • • 發佈:2022-03-27
Lab03 總結,希望沒寫錯。
程式
public class Test { static { System.out.println("一、在第一次構造類的例項時載入類(類A)"); } static A a1; static A a2 = new A(2); public static void main(String [] args) { System.out.println("\n-----MAIN START-----\n"); System.out.println("二、或在第一次訪問類的靜態方法時構造類(類C)"); C c1; C.func(); System.out.println("三、或在第一次訪問類的靜態變數時構造類(類D)"); B b9 = D.b8; System.out.println("四、再次構造類的例項時不會載入類的靜態變數和靜態程式碼塊"); a1 = new A(1); new C(1); new D(1); System.out.println("五、非靜態變數和非靜態程式碼塊在訪問類的靜態方法或靜態變數時不會載入"); B b10 = C.b7;//這一行沒有輸出 D.func(); System.out.println("\n-----MAIN END-----"); } } class A { { System.out.println("\tA2、非靜態變數和非靜態程式碼塊\n\t\t非靜態程式碼塊1"); } static { System.out.println("\tA1、靜態變數和靜態程式碼塊"); } static B b1 = new B(1); static B b2; static B b3; static { b2 = new B(2); } static B b4 = new B(4); static { b3 = new B(3); } B b5 = new B(5); { System.out.println("\t\t非靜態程式碼塊2"); } B b6 = new B(6); A (int x) { System.out.println("\tA3、構造方法\n\t\tThis is A" + x); } } class B { B(int x) { System.out.println("\t\tThis is B" + x); } } class C { static { System.out.println("\tC1、靜態變數和靜態程式碼塊"); } { System.out.println("\tC3、非靜態變數和非靜態帶程式碼塊"); } static B b7 = new B(7); public static void func () { System.out.println("\tC2、靜態方法\n\t\t(不會載入非靜態變數和非靜態帶程式碼塊)"); } C(int x) { System.out.println("\tC4、構造方法\n\t\tThis is C" + x); } } class D { static { System.out.println("\tD1、靜態變數和靜態程式碼塊"); } { System.out.println("\tD3、非靜態變數和非靜態帶程式碼塊"); } static B b8 = new B(8); static { System.out.println("\t\t(靜態方法如果沒被呼叫就不會載入)\n\t\t(不會載入非靜態變數和非靜態帶程式碼塊)"); } public static void func () { System.out.println("\tD2、靜態方法"); } D(int x) { System.out.println("\tD4、構造方法\n\t\tThis is D" + x); } }
輸出
一、在第一次構造類的例項時載入類(類A) A1、靜態變數和靜態程式碼塊 This is B1 This is B2 This is B4 This is B3 A2、非靜態變數和非靜態程式碼塊 非靜態程式碼塊1 This is B5 非靜態程式碼塊2 This is B6 A3、構造方法 This is A2 -----MAIN START----- 二、或在第一次訪問類的靜態方法時構造類(類C) C1、靜態變數和靜態程式碼塊 This is B7 C2、靜態方法 (不會載入非靜態變數和非靜態帶程式碼塊) 三、或在第一次訪問類的靜態變數時構造類(類D) D1、靜態變數和靜態程式碼塊 This is B8 (靜態方法如果沒被呼叫就不會載入) (不會載入非靜態變數和非靜態帶程式碼塊) 四、再次構造類的例項時不會載入類的靜態變數和靜態程式碼塊 A2、非靜態變數和非靜態程式碼塊 非靜態程式碼塊1 This is B5 非靜態程式碼塊2 This is B6 A3、構造方法 This is A1 C3、非靜態變數和非靜態帶程式碼塊 C4、構造方法 This is C1 D3、非靜態變數和非靜態帶程式碼塊 D4、構造方法 This is D1 五、非靜態變數和非靜態程式碼塊在訪問類的靜態方法或靜態變數時不會載入 D2、靜態方法 -----MAIN END----- Process finished with exit code 0