2017-09-03 33 views
1

當我運行這個代碼時,它輸出blockA blockB blockA。我期望輸出爲blockB blockA blockA意外的Java文本輸出

爲什麼輸出blockA blockB blockA而不是blockB blockA blockA

public class Test 
{ 
    public static Test t1 = new Test(); 
    { 
     System.out.println("blockA"); 
    } 
    static 
    { 
     System.out.println("blockB"); 
    } 
    public static void main(String[] args) 
    { 
     Test t2 = new Test(); 
    } 
} 
+3

變量靜態塊之前被初始化。 https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html –

回答

2

在這裏在課堂上,你先把以下陳述。

public static Test t1 = new Test(); 

因此,這將是執行類初始化

{ 
     System.out.println("blockA"); 
} 

所以BLOCKa中將被打印。

然後靜態初始化執行

static 
    { 
     System.out.println("blockB"); 
    } 

blockB印刷

最後被執行的主功能的內部代碼

Test t2 = new Test(); 

和將觸發再次類初始化

{ 
     System.out.println("blockA"); 
} 

等等blockA再次被打印。

約約類和靜態初始化的執行順序的詳細描述在這裏jls-12.4.2