有一道面試題是這樣的
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類中,此時由於靜態變量只執行一次,而且執行過了,所以這次不再執行,而是會執行構造代碼塊,然後就是構造方法,第二個靜態變量和第一個類似,當前兩個靜態變量執行完了,就會執行靜態代碼塊了,靜態代碼塊優先級比構造代碼塊更先執行,然後就是執行構造代碼塊,最後是構造方法,這就產生了最終的執行結果。