2014-11-03 4 views
0

I했습니다 다음 클래스 :내부 클래스 생성자를 호출하는 방법은 무엇입니까?

package org.gradle; 

public class Supcl { 

    public class Inner extends Supsupcl { 
     public Inner(int a) { 
      System.out.println(a); 
     } 
    } 
} 

package org.gradle; 

public class Subcl extends Supcl.Inner { 

    public Subcl() { 
     Supcl.Inner.super(34); //error: No enclosing instance of type Supcl is 
           //available due to some 
           //intermediate constructor invocation 

    } 
} 

그리고 클래스 Supsupcl는 :

package org.gradle; 

public class Supsupcl {} 

저도 같은 오류가 발생합니다 super(34);Supcl.Inner.super(34);를 교체하려고합니다. 그것은 어떻게합니까?

+0

어떤 타입'Supsupcl'입니까? 또한 이클립스는'Supcl.Inner'에서 "Supcl.Inner를 변수로 해석 할 수 없습니다"라는 오류를 표시합니다. – Seelenvirtuose

+0

@Unihedron 네, 물론입니다. 그것은 단지 _Inner_를위한 수퍼 클래스 인 클래스입니다. 뭐가 문제 야? –

답변

1

정적이 아닌 내부 클래스는 외부 클래스와 특별한 관계가 있으므로 항상 내부 클래스의 인스턴스를 만들려면 외부 클래스의 인스턴스가 필요합니다.

아닌 내부 클래스는 내부 클래스를 확장하는 경우에,

, 당신은 그것을 외부 클래스의 인스턴스를 만들거나 통과 중 하나를해야합니다 : 당신이해야 할 것

public class Subcl extends Supcl.Inner { 
    public Subcl() { 
    //assuming there is a no-argument constructor Supcl() 
    //this only works in one statement so the call to super is still 
    //part of the first statment in this constructor 
    new Supcl().super(34); //will call Inner(34) 
    } 

    public Subcl(Supcl sup) { 
    sup.super(34); //will call Inner(34) 
    } 
} 

주 에 인수가없는 생성자가 있더라도 Supcl의 인스턴스를 얻고 컴파일러에서이를 추론 할 수 없기 때문에이 작업을 수행하십시오.

마침내 한마디로 내 의견이긴하지만 내부 클래스의 구문이 항상 단순한 것은 아니므로 어떤 경우에는 어떤 일이 벌어지고 있는지 파악하기 어려울 수 있습니다. 단순한 경우에만 내부 클래스를 사용하고 정말로 필요할 경우에만 내부 클래스를 사용하도록 제안하십시오. 그것은 당신의 인생을 훨씬 쉽게 만들어 줄 것입니다 :

5

당신은 Supcl의 인스턴스에 중첩 된 내부 클래스를 참조하고, 그래서 내부 클래스를 초기화 할 수있는 권리 관용구이다 : 당신이 호출해야합니다, 그래서 당신은 생성자 외부 super를 호출 할 수 없습니다

new Supcl().new Inner(int i) 
(assuming Supcl has a 0-argument constructor or the default constructor)

그것은 당신의 Inner(int i) 생성자 코드의 첫 번째 줄입니다. 외부 클래스 인스턴스 코드 내부로부터 ■

+3

'super()'는'Inner (int i)'에서 암묵적으로 호출되므로 그렇게 할 필요가 없습니다. 게다가,별로 도움이 안돼. – Thomas

+0

@ 토마스 당신이 옳았 습니다만, OP는 매개 변수화 된'super'를 호출하기를 원했고, 암묵적으로 호출 된 것은'super()'였습니다. – Mena

2

상기 통상법 내부 클래스 이름을 사용 외측 클래스 인스턴스 코드 밖에서 ■

MyInner mi = new MyInner(); 

(외부 클래스 내에 정적 메소드 코드 포함)

MyOuter.MyInner 

당신은 외부 클래스에 대한 참조를 사용해야 인스턴스화하려면 :

, 내부 클래스 이름은 이제 외부 클래스의 이름을 포함해야합니다
new MyOuter().new MyInner(); or outerObjRef.new MyInner(); 

이미 외부 클래스의 인스턴스가있는 경우.

관련 문제