2016-09-05 5 views
1

내부 클래스의 인스턴스를 만드는 방법을 알고 있습니다. 하지만 우리는 다음과 같은 방법으로 그렇게 할 수없는 이유를 알고 싶어 :왜 우리는 외부 클래스의 main 메소드 안에 내부 클래스의 인스턴스를 규칙적으로 만들 수 없습니까?

class outerclass{ 

     public static void main(String[] args){ 
       innerclass in=new innerclass(); 
     } 

     class innerclass{ 


     } 

} 

그때 나는 다음과 같은 오류 얻을이 작업을 수행 할 경우

No enclosing instance of type outerclass is accessible. Must qualify the allocation with an enclosing instance of type outerclass (e.g. x.new A() where x is an instance of outerclass). 

왜?

+3

"둘러싼 인스턴스"가 무엇인지 알고 있습니까? 'innerclass'는 암시 적으로'outerclass' 타입의 필드를 가지고 있다는 것을 알고 있습니까? 그 분야의 가치가 당신의 모범에 무엇을 기대합니까? –

+0

흠 ... 특정 오류 메시지가 논의 된 적이 있는지 확인할 수있는 일종의 글로벌 인터넷 검색이 있다면 얼마나 편리할지 상상해보십시오. – shmosel

답변

1

innerclass은 정적이 아닙니다. 즉, 외부 클래스에 대한 참조가 있어야합니다. main은 정적이며 암시 적 외부 클래스가 없습니다.

간단한 해결책은 내부 클래스를 정적 ​​중첩 클래스로 만드는 것입니다.

0

내부 클래스를 정적으로 만들거나 (예 : 이미 언급 한 것처럼) 정적이 아닌 컨텍스트에서 내부 클래스를 만들어야합니다. 비 정적 방법에서.

즉, 하나이 :

class outerclass{ 
    void myMethod() { 
     innerclass in = new innerclass(); 
    } 
    class innerclass{ 
    } 
} 

또는이

class outerclass{ 
     public static void main(String[] args){ 
      innerclass in=new innerclass(); 
     } 
     static class innerclass{ 
     } 
} 
3
class Demo{ 

    public static void main(String[] args){ 
      System.out.println(innerclass.a); 

    } 

    static class innerclass{ 
      static int a=1; 

    } 


} 

는에서, 당신은 당신의 외부 클래스에 쉽게 액세스 할 수 정적으로 내부 클래스를하면서 1

여기를 참조 출력을 제공합니다 순서대로 Nested 클래스의 인스턴스를 만들려면 다음과 같이 Outer 클래스 이름 앞에 접두사를 추가하여 참조해야합니다.

Outer.Nested instance = new Outer.Nested(); 

정적이 아닌 중첩 클래스 (내부 클래스) Java의 정적이 아닌 중첩 클래스는 내부 클래스라고도합니다. 내부 클래스는 그 둘러싸는 클래스의 인스턴스에 관련 지을 수 있습니다. 따라서 먼저 내부 클래스의 인스턴스를 만들려면 둘러싸는 클래스의 인스턴스를 만들어야합니다. 생성하기 위해 외부 클래스에 대한 참조 후 새로운 넣어하는 방법

Outer outer = new Outer(); 
Outer.Inner inner = outer.new Inner(); 

공지 사항 : 여기

public class Outer { 

    public class Inner { 
    } 

} 

당신이 내부 클래스의 인스턴스를 생성하는 방법입니다 예를 들면 다음과 같습니다 내부 클래스 정의는 내부 클래스의 인스턴스

비 정적 중첩 클래스 (내부 클래스)는 private 클래스로 선언 된 경우에도 해당 클래스의 필드에 액세스 할 수 있습니다. 다음은 그 예입니다

public class Outer { 

    private String text = "I am private!"; 

    public class Inner { 

     public void printText() { 
      System.out.println(text); 
     } 
    } 
} 
0

outerclass 그게 전부는 innerclassinnerclass을 첨부 할 outerclass이 없기 때문에 innerclass 직접 오류를 슬로우 호출, 따라서 인스턴스화되지 캡슐화합니다.

그러므로 이전 답변에서 제안한대로 innerclass을 정적으로 설정하면 innerclass에 인스턴스화하지 않고 액세스 할 수 있으므로 문제가 해결됩니다.

이 주제와 관련하여 기존 답변이 많이 있습니다. 빠른 Google이이 문제를 제기합니다.

Java - No enclosing instance of type Foo is accessible