2011-05-03 2 views
24

나는 자바 인증 시험을위한 준비, 그리고 난 연습 시험 중 하나에 다음과 같은 코드를 보았다 :이 Java 코드가 메서드 외부에 중괄호 ({})로 나타나는 이유는 무엇입니까?

class Foo { 
    int x = 1; 
    public static void main(String [] args) { 
     int x = 2; 
     Foo f = new Foo(); 
     f.whatever(); 
    } 
    { x += x; } // <-- what's up with this? 
    void whatever() { 
     ++x; 
     System.out.println(x); 
    } 
} 

내 질문입니다 ... 그것은 올바른 방법 이외의 중괄호에 코드를 작성하는 것입니다 ? 이것들의 효과는 무엇입니까? here에서 차용

+2

도 참조 [8.6 인스턴스 이니셜 (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.6 인). – trashgod

+0

스티븐, 주제 때문에 중복이 될 수 있지만 완전히 다른 방식으로 이것을 받았습니다 – nairdaen

+2

다른 사람들이 지적했듯이 유효합니다. 그러나 Java 인증을받은 후에는 평생 동안 프로그래밍 할 수 있습니다. 제발, 일상적인 작업에이 구조를 사용하지 마십시오. 부디. 자바 인증이 싫어. 그것은 당신에게 모든 종류의 혼란스럽고 복잡하고 때로는 가벼운 방법을 당신의 동료를 혼동시키고 버그를 소개하는 방법을 가르쳐줍니다. – rfeak

답변

31

-

일반적으로, 당신은 생성자에서 인스턴스 변수를 초기화하는 코드를 넣어 것입니다. 인스턴스 변수를 초기화하는 데는 생성자를 사용하는 두 가지 방법이 있습니다. 이니셜 라이저 블록과 최종 메서드입니다. 인스턴스 변수에 대한 초기화 블록은 정적 초기화 블록처럼,하지만 static 키워드없이 볼 :

{ 
    // whatever code is needed for initialization goes here 
} 

자바 컴파일러를 복사 초기화 블록을 모든 생성자에. 따라서이 방법을 사용하여 여러 생성자간에 코드 블록을 공유 할 수 있습니다.

또한 here 토론을보고 싶을 수도 있습니다.

+0

하나의 질문에 왜이 코드가 실행되지 않았는지 .... { System.out.println ("com.test.BaseClazz. initial"); } – Omer

6

그것은 initializer block입니다. 인스턴스 변수를 설정하는 데 사용됩니다. 생성자에 이니셜 라이저 블록을 사용하려는 동기는 중복 코드 작성을 방지하는 것입니다. Java 컴파일러는 블록의 내용을 각 생성자에 복사합니다.

8

클래스 인스턴스가로드/생성되는 동안 실행되며 클래스의 멤버 속성을 초기화하는 데 사용되는 초기화 프로그램 블록입니다 (Java http://download.oracle.com/javase/tutorial/java/javaOO/initial.html 참조). 원하는만큼의 블록을 가질 수 있으며 위에서 아래로 인스턴스화됩니다.

인스턴스 블록 외에도 원하는만큼 정적 블록을 포함하여 정적 멤버를 초기화 할 수 있습니다. 다음으로 선언 할 것이다 : 클래스가 초기화되고

public class Initialization { 

    static int b = 10; 

    int a = 5; 

    static { 
     b = -9; 
    } 

    { 
     a += 2; 
    } 

    public static void main(String[] args) throws Exception { 

     System.out.println(ClientVoting.b); 
     System.out.println(new ClientVoting().a); 
     System.out.println(ClientVoting.b); 
     System.out.println(new ClientVoting().a); 

    } 

    static { 
     b = 1; 
    } 

    { 
     a++; 
    } 
} 

동안 고정 부재 "B"는 10으로 초기화되고, 다음 제 정적 범위는 -13 그 값을 변경 한 후 1 이에 클래스가로드되는 동안 한 번만 실행됩니다. 이 메소드는 main 메소드의 첫 번째 라인을 초기화하기 전에 실행됩니다.

한편, 클래스와 비슷한 예제는 인스턴스 참조 "a"입니다. A는 5로 초기화 된 다음 인스턴스 블록은 7로, 마지막 블록은 8로 업데이트됩니다. 예상대로 정적 멤버는이 코드에서 한 번만 초기화되는 반면 인스턴스 블록은 새 인스턴스를 만들 때마다 실행됩니다.

이 예제 출력은 1~8 1~8