靜態構造代碼塊、構造代碼塊、構造方法執行的順序問題

/*
當前方法的執行結果是什麼?請簡述原理
 */
class Demo1 {
	static {
		Demo2 d = new Demo2();
	}
	{
		System.out.println("我是Demo1的構造代碼塊");
	}
	public Demo1() {
		System.out.println("我是Demo1的構造方法");
	}
}
class Demo2 {
	static {
		Demo1 d = new Demo1();
	}
	{
		System.out.println("我是Demo2的構造代碼塊");
	}
	public Demo2() {
		System.out.println("我是Demo2的構造方法");
	}
}
class Test {
	public static void main(String[] args) {
		Demo2 d2 = new Demo2();
		Demo1 d1 = new Demo1();
	}
}

執行結果是:
我是Demo2的構造代碼塊
我是Demo2的構造方法
我是Demo1的構造代碼塊
我是Demo1的構造方法
我是Demo2的構造代碼塊
我是Demo2的構造方法
我是Demo1的構造代碼塊
我是Demo1的構造方法

執行原理:
1.程序進入main方法中,程序跳到Demo2 d2 = new Demo2();
這裏要創建Demo2的類對象,需要進到class Demo2裏面
2.程序進入class Demo2 中,這裏存在static靜態構造代碼塊
程序先執行static裏面的語句,Demo1 d = new Demo1(); 程序跳到了class Demo1中
(Demo2裏的 代碼塊 和 構造方法被暫時擱置執行完static後再次執行)
3.當前程序進入了class Demo1裏面 這裏存在static靜態構造代碼塊
先執行static裏面的語句, Demo2 d = new Demo2(); 程序跳到了class裏
(Demo1裏的 代碼塊 和 構造方法被暫時擱置,執行完static後再次執行)
3. 當前程序進入了class Demo2中,靜態代碼塊執行過,不再執行,構造代碼塊不會單獨執行
所以程序先跳到public Demo2()上,不進入方法內部,而是調用構造代碼塊
這裏執行了Demo2裏的構造代碼塊,程序輸出了第一行文字:
------------------------------------------“我是Demo2的構造代碼塊”
4. 當前程序在執行完Demo2裏的代碼塊之後開始執行構造方法裏的語句,輸出第二行文字:
------------------------------------------“我是Demo2的構造方法”
5. 重點來了,程序從這裏執行完之後再次進行跳轉,跳轉到第二次擱置代碼的地方,也就是
再次跳回到class Demo1裏面,執行剛纔被擱置的語句,輸出構造代碼塊構造方法的語句:
-------------------------------------------“我是Demo1的構造代碼塊”
-------------------------------------------“我是Demo1的構造方法”
6. class Demo1中被擱置的代碼執行完之後,程序調到第一次擱置代碼的地方
也就是第一次進入class Demo2執行後只執行了靜態代碼塊,執行被擱置的語句:
代碼塊和構造方法
輸出了兩行語句:
-------------------------------------------“我是Demo2的構造代碼塊”
-------------------------------------------“我是Demo2的構造方法”
到這裏main方法裏面的第一行語句 才完全執行完

7.接下來程序跳到第二行語句 Demo1 d1 = new Demo1();
進入class Demo1裏面去,進去跳到靜態代碼塊上,發現靜態代碼塊已經被執行過,不再執行
程序跳到 構造方法上,執行構造代碼塊,最後執行構造方法
程序會分別輸出語句
-------------------------------------------“我是Demo1的構造代碼塊”
-------------------------------------------“我是Demo1的構造方法”
8.程序執行完畢

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