2017-04-14 8 views
3

Java에서 브래킷 만 허용하는 이유는 무엇입니까?? 무엇을 위해 만들어 졌는가?중괄호 만 사용하는 방법

{ 
    // Do something 
} 

나는 또한이 static-block 후하지만 생성자 전에 자동으로 실행됩니다 것으로 나타났습니다. 수퍼 클래스의 생성자는 이전에 실행되었지만.

이 주문에 대한 특별한 이유가 있습니까? 출력으로서

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"); 
    } 
} 

는 I 얻을 :

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

그것은 정적 블록하지만, 마찬가지로 동일한

제가 실행 순서를 발견하기 위해 만든 JUnit이고 정적이 아닙니다. 그래서 그것은 당신이 이미 발견 한 순서대로 - 슈퍼 생성자 이후이지만 생성자 전에 실행될 것입니다. 그러나, 정적 블록 유용하지 않을 수 있습니다 일반 블록 너무 많이. 따라서 결코 사용되지는 않지만 합법적입니다. 나는 그것이 사용 된 것을 결코 보지 못했고 특정 목적을 생각할 수는 없었지만 그것은 유효한 구문의 일부이다. 그렇지 않은 경우 정적 블록이되지 않습니다.

+0

저는 실제로 한 번 사용 된 것을 보았습니다. UI 구성 요소를 만드는 매우 긴 방법에서 로컬 변수의 범위를 제한하는 데 사용되었습니다. 그것은 다른 방법으로 코드를 추출하는 방법입니다. 나쁜 연습 IMO. –

+0

물론 Jeremy, IMHO의 나쁜 습관에도 동의합니다. 그게 결코 사용되지 않을 때와 그것이있을 때 - 그것이해서는 안된다는 것을 증명합니다. –