一道代碼塊相關的面試題

有一道面試題是這樣的

public class Test003 {

	static Test003 test001 = new Test003();
	
	static Test003 test002 = new Test003();
	
	{
		System.out.println("構造代碼塊");
	}

	
	static { System.out.println("靜態代碼塊"); }
	

	public Test003() {
		System.out.println("構造方法");
	}

	public static void main(String[] args) {
		Test003 test001 = new Test003();
	}

}

問執行的結果是怎樣的,答案是

構造代碼塊
構造方法
構造代碼塊
構造方法
靜態代碼塊
構造代碼塊
構造方法

下面來分析一下爲什麼會出現這樣的結果

首先,從主方法作爲入口,可以發現創建了一個對象,所用到的類是Test003,這時就會進行類的初始化,在
Test003類中,發現第一行是靜態成員變量 ,所以優先執行,此時執行的是static Test003 test001 = new Test003(); 這時發現又需要創建對象,所以會再次進入到Test003類中,此時由於靜態變量只執行一次,而且執行過了,所以這次不再執行,而是會執行構造代碼塊,然後就是構造方法,第二個靜態變量和第一個類似,當前兩個靜態變量執行完了,就會執行靜態代碼塊了,靜態代碼塊優先級比構造代碼塊更先執行,然後就是執行構造代碼塊,最後是構造方法,這就產生了最終的執行結果。

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