2011-08-24 6 views
22

클래스 정의 시작 부분에있는 멤버 변수를 정의하고 초기화하는 것의 차이점은 무엇입니까?먼저 멤버 변수를 정의하고 생성자에서 멤버 변수를 초기화하는 것은입니까?클래스 정의 시작 또는 생성자에서 멤버 변수를 초기화 하시겠습니까?

말, 예를 들어 :

public class Test { 
    private int foo = 123; 
    private boolean flag = false; 

    public void fooMethod() {...} 
} 

대 : 미리

public class Test { 
    private int foo; 
    private boolean flag; 

    public Test() { 
     foo = 123; 
     flag = false; 
    } 

    public void fooMethod() {...} 
} 

감사합니다.

+1

가능한 모범 사례 : 생성자 또는 선언의 클래스 필드 초기화? (http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at) -declaration) –

답변

17

예를 들어, 유일한 차이점은 초기화 될 때입니다. JLS에 따르면, 인스턴스 변수는 생성자가 호출되기 전에 초기화됩니다. 초기화 순서가 항상 그렇게 명확하지는 않으므로 수퍼 클래스를 처리 할 때이 점이 흥미로울 수 있습니다. 이를 통해 명시 적 슈퍼 생성자가 호출되지 않으면 "super"인스턴스 변수가 계속 초기화됩니다.

+0

+1 그리고 나는 엄청나게 추적하기 어려운 모든 종류의 버그를 소개합니다. –

5

차이점은 초기화/설정되는 순서입니다.

클래스 멤버 변수는 생성자가 호출되기 전에 선언/설정됩니다. 내 개인적인 취향은 생성자에서 그들을 설정하는 것입니다.

0

일반적으로 생성자는 인수를 받아들이고 이러한 인수를 클래스 필드에 할당합니다.

public Test(int foo, boolean flag) 
{ 
    this.foo = foo; 
    this.flag = flag; 
} 
+0

무슨 뜻인지 확실치 않니? –

+0

@aib, C++이 아닌 Java입니다. – Triang3l

2

클래스를 초기화하면 간단한 생성자를 작성하지 않아도됩니다.

생성자 내의 생성자 매개 변수에 종속되는 인스턴스 멤버를 초기화해야합니다. 동일한 생성자 안에 다른 모든 인스턴스 멤버의 초기화를 두는 것은 아무 래도 읽기 쉽도록 합리적 일 수 있습니다.

그렇지 않으면 차이가 없습니다.

관련 문제