1. 程式人生 > 其它 >【Java】類的初始化順序

【Java】類的初始化順序

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