2011-01-08 3 views
3

Super constructor invocation definition : 자바에서는 슈퍼 생성자 호출이 실제로 호출 클래스에서 생성자를 호출 할 수 있습니까?

[Primary.] [NonWildTypeArguments] super (ArgumentListopt) ; 

슈퍼 생성자 호출

Primary 표현 접두어 할 수 있습니다. (JLS에서 촬영) 예 :

class Outer { 
    class Inner{ } 
} 

class ChildOfInner extends Outer.Inner { 
    ChildOfInner() { 
     (new Outer()).super(); // (new Outer()) is the Primary 
    } 
} 

Primary 표현이 그 슈퍼 호출 호출 클래스의 생성자()를 호출하게 존재 하는가? 아니면 자바가 그걸 막아?

+0

"호출 클래스"란 무엇입니까? – Bozho

+0

"호출 클래스"는 super() 호출을 수행하는 클래스입니다. –

답변

2

는 기본 표현이 그 슈퍼 호출 호출 클래스의 생성자()를 호출하게 존재 하는가?

번호 수 this()를 사용하는 것과을 super() 통화를 전환 할 수있는 방법이 없습니다. Primary 클래스의 유일한 이유는 수퍼 클래스가 비 정적 인 내부 클래스 일 때 인스턴스화하는 외부 컨텍스트를 제공하기 위해서입니다.

기본 표현식은 생성자 또는 클래스을 선택하지 않습니다. 일부 생성자 (즉, 정적이 아닌 내부 클래스에서 필요로하는 외부 인스턴스)에 필요한 컨텍스트 정보 만 전달합니다.

편집 :

영업 이익은 소스를 요청합니다. 내가이없는 - 내가 생각하는 스펙의 내 독서에만이 대답을 내놓고 꽤 분명하다

... 키워드 슈퍼 ... 직접 슈퍼 클래스의 생성자를 호출하는 데 사용 .

수퍼 클래스 생성자 호출이 정규화 된 경우 ".super"바로 앞에있는 기본 표현식 p는 ... 바로 바깥 쪽 [outer] 인스턴스 ... p 유형이 다음과 같은 경우 컴파일 타임 오류입니다. 되지 O [외측 클래스] 또는 O.

super에 적격 식 있다면 서브 클래스, 단지 수퍼의 둘러싸 클래스 인스턴스 (또는 인스턴스를 리턴 할 수있다 슈퍼 클래스의 둘러싸는 클래스의 서브 클래스) 조건식은 super()에 대한 응답으로 클래스 생성자를 호출하지 않습니다. 즉, 생성자가 호출 될 클래스를 변경하는 정규 표현식이 반환 할 수있는 값이 없습니다. super() - super()은 항상 생성자를 호출합니다. 직접 슈퍼 클래스.

+0

이 질문의 마지막 끝으로 : super() 호출을 this()를 사용하는 것과 동일하게 전환 할 방법이 없다고 확신합니까? 근원이 있니? –

+0

@ 존 - 답변을 편집하십시오. –

0

Java에서 생성자가 파생 클래스에서 생성자를 호출 할 수없는 가상 클래스가 아니라는 것을 알고 있습니다. 실제로 생성자 내부에서 메서드를 호출 할 수 있으며 이러한 메서드는 finalized 개체 에서처럼 호출됩니다. 그러나 이것은 미묘한 버그를 일으킬 가능성이 있습니다 (파생 클래스 멤버가 기본 클래스 생성자에서 호출 될 때 초기화가 수행되지 않기 때문에). 에 대한 자세한 설명은

확인이 :

http://www.codeguru.com/java/tij/tij0082.shtml

관련 문제