2013-03-13 1 views
4

...생성자 this() 불필요? 확장 클래스 U. 클래스 U 비어 있었다 클래스 U1 ...이 첫 번째 줄이 있었다 U1의 생성자에서</p> <p>, 슈퍼 클래스의 생성자를 호출이 있었다

public U1(Plate plate, int order) 
{ 
    super(plate, order); 
... 

} 

이제 U1 클래스를 삭제하고 U 클래스에서 U1에서 수행 한 작업을 수행하려고합니다 ... 이제 U 클래스는 수퍼 클래스를 가질 수 없으므로 이제 수퍼 클래스의 생성자를 호출 할 필요가 없습니다.

this(plate, order)은 생략 할 수 있습니까?

이것은 U의 내 생성자 같은 거보고 방법입니다 :

public U(Plate plate, int order) 
    { 
     this(plate, order); 
    ... 

    } 

답변

8

그것은 불필요하며 생성자 내에서 생성자 자신을 호출하기 때문에, 그것은 스택 오버 플로우가 발생 기대.

+2

사실, 심지어는 스택 오버 플로우로 충분히하지 않습니다. 그것은 결코 런타임에 그것을 만든다. –

0

아니야, 그럴 수있어. 그렇지 않으면 끝내지 않는 재귀 호출로 작동합니다.

7

컴파일 오류가 발생합니다. JLS section 8.8.7는 말한다 :이 경우

"It is a compile-time error for a constructor to directly or indirectly invoke itself through a series of one or more explicit constructor invocations involving this ."

는 생성자가 직접 자체를 호출합니다.

+2

+1, 좋은 캐치! 'javac'는 실제로'recursive constructor invocation' 오류로 되돌아옵니다. –

0

수퍼 클래스에서 상속 된 인스턴스 변수를 초기화하기 위해 생성자에서 super()를 호출하므로 슈퍼 클래스 (예외 java.lang.Object)가없는 경우 super()를 호출 할 필요가 없습니다. 다중 생성자가 어디에 있는지 알고 싶으면 this()를 호출하여 다른 생성자를 호출 할 수 있지만 이전에 참조 된 것과 같은 나쁜 일을 일으키는 생성자 자체를 호출하지 마십시오.

샘플
1

우리가 오류를 얻을 것이다 다음과 같이 재귀 생성자 호출,

class TestConstruct{ 
public TestConstruct(){ 
    this(); 
    System.out.println("constructor of Test class"); 
}//end of constructor 
}//end of class TestConstruct 
public class AppConstruct{ 
public static void main(String[] a){ 
Test t = new Test(); 
}//end of main 
}//end of AppConstruct