2017-04-14 49 views
3

爲什麼Java接受一個括號裏只有方法?什麼是爲了?只有大括號的方法

{ 
    // Do something 
} 

我還注意到它在static-block之後但在構造函數之前自動執行。儘管之前執行了超類的構造函數。

這個訂單是否有特定的原因?

這是我爲發現的執行順序進行的JUnit

public class TestClass extends TestSuperClass { 

    public TestClass() { 
     System.out.println("constructor"); 
    } 

    @Test 
    public void test() { 
     System.out.println("test"); 
    } 

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

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

public class TestSuperClass { 

    public TestSuperClass() { 
     System.out.println("super class constructor"); 
    } 

    { 
     System.out.println("super class brackets"); 
    } 

    static { 
     System.out.println("super class static"); 
    } 
} 

當輸出我得到:

super class static 
static 
super class brackets 
super class constructor 
brackets 
constructor 
test 
+0

*「這個訂單是否有特定的原因?」* - 在JLS 15.9.4中解釋 - http://docs.oracle.com/javase/specs/jls/se8/html/jls-15。 html#jls-15.9.4 –

回答

2

這是一樣的靜態塊,但只是不是靜態的。所以它會按照你已經發現的順序執行 - 在超級構造函數之後但在構造函數之前。但是,如果static-block可以用於有用的普通塊並不是那麼多。所以它永遠不會被使用,但它是合法的。我從來沒有看到它被使用過,不能想到任何特定的目的,但它是有效語法的一部分。如果不是,那麼靜態塊也不會。

+0

我已經看到它使用過一次:在創建UI組件的非常長的方法中,它被用來限制局部變量的範圍。這是用另一種方法提取代碼的一半方式。國際海事組織不好 –

+0

當然,我同意傑里米在恕我直言中的糟糕做法。只是證明了我的觀點,即它從來沒有使用過,當它是 - 它不應該 –