2014-11-04 2 views
0

나는 class fromal parameters에 대해 읽었으며 다음 코드가 왜 잘못 작성되었는지에 대한 질문이 제기됩니까?Java의 내부 클래스 구성

클래스 A :

package org.gradle; 

public class A extends B.Inner{ 

    public A(B s){ 
     s.super(new B()); //error 
     s.super();  //OK 
    } 
} 

클래스 B :

package org.gradle; 

public class B{ 

    public class Inner{ 
    } 
} 

무슨 말을했는지의 핵심 부분은 다음과 같습니다

암시 적으로 비 개인 내부 멤버 클래스의 생성자 은 첫 번째 형식 매개 변수로을 나타내는 변수를 선언합니다.

Inner(B b); 

왜 즉시 클래스

지금의 인스턴스를 둘러싸는, 나는 기본 생성자 외에, 우리는 다음과 같은 서명 생성자가 있어야 것으로 기대?

답변

1

"추가"매개 변수는 선언 할 때나 실행할 때 모두 효과적으로 숨겨집니다. 당신이 그것을 실행하면, 당신은 다른 방법으로 값을 제공 - 귀하의 경우, s을 통해 다음 B.Inner 생성자에 숨겨진 추가 인수로 s를 전달하는 것

s.super(); 

합니다. 이 모든 것에 대한 구문은 조금 이상합니다. 개인적으로 이런 종류의 상황에서 내부 클래스를 사용하지 않으려 고합니다 ... 그들은 매우 빨리 매우 이상하게됩니다. 보통 static 중첩 클래스를 선호합니다. 을 수행하려면에 내부 클래스가 필요합니다. 거의 항상 private입니다. 다른 최상위 수준 클래스에서 선언 된 내부 클래스를 상속하는 것은 이상한 상황 인 IMO입니다.

+0

고맙지 만, 왜 내가 명백하게 다음과 같이 그 생성자를 호출 할 수 없는지 명확하지 않습니다. http://ideone.com/igXgCM? JLS가 잃어 버렸던 제한을 제공 할까? –

+1

@ St.Antario : 내부 클래스의 작동 방식이 아닙니다. 대신 new B(). new Inner()를 사용하십시오. 추가 매개 변수처럼 생각할 생각은 아닙니다. 내부 클래스의 인스턴스를 생성하는 데 사용되는 둘러싼 클래스의 인스턴스라고 생각할 수 있습니다. –

+0

JLS가이를 명시 적으로 지정합니까? –

1

당신은 이미 s.super() 전화 내부 클래스의 생성자 (클래스 B의)를 둘러싸는 예를 s을 통과, 그래서 B의 다른 인스턴스를 통과 할 필요가 없습니다.

variable representing the immediately enclosing instance of the class은 암시 적 매개 변수이며 특수 구문을 사용하여 생성자에 전달됩니다.