2014-02-21 6 views
10

Java에 대한 시험을 위해 공부하고 있습니다. 내가 공부하는 동안, 나는 익숙하지 않은 java에서 구문을 발견했다. 중괄호 ({})는 이름이없는 클래스 본문과 달리 정적 키워드가 있습니다. 나는 그들이 "Initializers"라고 불렀다. 아무도 내가 그들 사이의 주요 차이점을 지적하고 그들이 생성자와 어떻게 다른지 도울 수 있습니까? 감사합니다정적 이니셜 라이저 대 인스턴스 이니셜 라이저 대 생성자

+0

나는이 책을 추천한다 http://www.apress.com/9781430247647 3 장과 4 장 – Leo

+0

@Reieus 그는 또한 익명의 코드 블록 – jeremyjjbrown

답변

20

주요 차이점은 실행 순서입니다. 내가 예로 설명 할 것, 설명하기 :

public class SomeTest { 

    static int staticVariable; 
    int instanceVariable;   

    // Static initialization block: 
    static { 
     System.out.println("Static initialization."); 
     staticVariable = 5; 
    } 

    // Instance initialization block: 
    { 
     System.out.println("Instance initialization."); 
     instanceVariable = 10; 
    } 

    // Constructor 
    public SomeTest() { 
     System.out.println("Constructor executed."); 
    } 

    public static void main(String[] args) { 
     new SomeTest(); 
     new SomeTest(); 
    } 
} 

가 출력 될 것입니다 :

Static initalization. 
Instance initialization. 
Constructor executed. 
Instance initialization. 
Constructor executed. 

간단히 얘기 :

  • 정적 초기화 블록을 한 번 클래스에 의해로드 된 실행 JVM.
  • 인스턴스 초기화 블록은 개체를 인스턴스화 할 때마다 생성자보다 먼저 실행됩니다.
  • 생성자 (분명히)는 개체를 인스턴스화 할 때마다 실행됩니다.
+7

에 대해 물었다. 이것은 좋은 대답입니다. 하지만 그 생성자가 인스턴스 이니셜 라이저보다 훨씬 더 일반적이라는 것을 덧붙이고 싶습니다. 인스턴스 이니셜 라이저의 주요 유스 케이스는 익명의 내부 클래스에서 초기화를 수행하는 것입니다. 이름이 없기 때문에 생성자를 가질 수 없습니다. –

+0

매우 간단하고 멋진 예제 +1 –

1

생성자는 클래스의 새 인스턴스가 만들어 질 때 한 번 호출됩니다. 생성자에서 초기화 된 값은 인스턴스의 범위에 속합니다. 각 인스턴스는 생성자에서 초기화 된 동일한 필드에 대해 다른 값을 가질 수 있습니다.

정적 초기화는 정적 클래스에서 설치 코드를 실행하고 열거 형에서 데이터 구조를 채우는 데 유용합니다. 클래스가 JVM으로로드되고 클래스 또는 열거 형의 범위 내에 데이터가 존재할 때 위에서부터 차례로 한 번 호출됩니다. 클래스에 대한 모든 참조는 정적 초기화 프로그램에서 초기화 된 필드에 대해 동일한 값을 반환합니다.

중괄호 중괄호는 범위 참조 이름을 가진 익명 코드 블록입니다. 블록 내부에 참조를 작성하면 블록 외부에서 해당 참조의 값을 가져올 수 없습니다. 자신이 필요하다고 생각하면 코드를 더 많은 메소드로 리팩터링하는 데 필요한 신호입니다.

+0

"명명되지 않은 중괄호"는 [인스턴스 이니셜 라이저]라고합니다 (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6).) –

0

이것은 실제로 교과서에서 답을 얻기 위해 필요한 것입니다. 그러나 나는 당신에게 약간의 포인터를 줄 수있다. Java를 프로그래밍 한 지 몇 년이 지났기 때문에 제가 준 정보는 일반적인 것입니다.

일반적으로 중괄호가있는 이름이없는 블록은 익명의 기능입니다. 정적 이니셜 라이저는 해당 클래스의 모든 인스턴스에 대해 전역 인 데이터를 초기화하며 클래스가 처음 참조 될 때 한 번 실행됩니다. 정적 속성이나 메서드를 사용하는 방법에주의해야합니다. 이 정보를 사용하여 텍스트 책에서 정확한 세부 정보를 찾을 수 있습니다.