2017-04-14 85 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

当然,我同意杰里米在恕我直言中的糟糕做法。只是证明了我的观点,即它从来没有使用过,当它是 - 它不应该 –