2011-05-05 4 views
5

Java 내부 클래스와 관련된 질문이 있습니다.다른 최상위 클래스와 같은 이름의 Java 내부 클래스

내부 클래스 A를 정의하는 최상위 클래스 Main에서 최상위 클래스 A에 액세스하는 방법이 있습니까? 수업은 패키지에있는 경우

class A { // Outer Class A 
    { 
    System.out.println("A outer"); 
    } 
} 

class B { // Outer Class B 
    { 
    System.out.println("B outer"); 
    } 
} 

public class Main { 
    class A { // Inner Class A 
    { 
     System.out.println("A inner"); 
    } 
    } 

    public void newA() {  
    class A { // Local Class A 
     { 
     System.out.println("A local"); 
     } 
    } 
    new A(); 
    } 

    public static void main(String[] args) { 
    new Main().newA(); // prints "A local" 
    new Main().new A(); // prints "A inner" 
    //new A(); // compiler error: No enclosing instance of type Main is Accessible. 
    new B();  // but this works and prints "B outer" 
    } 
} 
+1

패키지간에 클래스 이름을 다시 사용하지 마십시오. 혼동을 일으킬 수 있습니다. –

답변

9

를 사용하여 정규화 된 클래스 이름 :

new com.mypackage.A(); 
4

, 나는 그이 달성의 가장 간단한 방법으로 기대 :

다음은 문제를 보여주는 샘플 코드입니다. Java의 C# global::에 해당하는 것이 없다고 생각합니다. 이런 일을 강요합니다.

궁극적으로, 처음에는 문제가 발생하지 않도록 클래스 이름을 변경하려고합니다. 이는 대개 대안을 사용하는 것보다 나은 접근 방법입니다.

4

두 개의 A에 서로 다른 패키지 이름을 제공해야 명확하게 다른 유형이되므로 전체 이름으로 참조 할 수 있습니다. 예를 들어

:

my.package.for.toplevel.A outerA = new my.package.for.toplevel.A(); // prints "A outer" 
                    // if this is the 
                    // package 

또는 더 나은, 두 가지 클래스의 두 개의 서로 다른 이름을 사용합니다.

1

네, 그냥 패키지를 사용하거나 처음부터 그들에게 같은 이름을 지정하지 마십시오. 어쨌든 그들 이름을 동일하게 지을 이유가 무엇일까요?

오류를 설명하기 위해서는 내부 A에 액세스하려고 시도하지만 그 클래스는 정적으로 선언되지 않고 사용 가능한 Main 인스턴스가 없기 때문에 비 정적 인 내부 A를 만들 수 없습니다 상위 Main 인스턴스에 대한 참조가 필요합니다.

+1

감사합니다. 정규화 된 클래스 이름 트릭을 잊어 버렸습니다. 이 질문은 이론적으로 SCJP 주제와 관련되어 있습니다 (실제 문제는 아님). 이상한 구문을 사용하지 않으려 고합니다. – bary

3

내부 클래스의 이름은 최상위 클래스의 이름을 음영 처리한다고합니다. 최상위 클래스는 내부 클래스의 범위에서 간단한 이름으로 참조 할 수 없습니다. 최상위 클래스는 정규화 된 이름을 통해서만 참조 할 수 있습니다.

최상위 클래스가 기본 패키지에있는 경우 (정규 이름이 단순 이름과 같음) 리플렉션을 통해 액세스 할 수 있습니다.

+0

"최상위 클래스가 기본 패키지에있는 경우 (정규 패키지 이름이 일반 이름과 동일 함) 리플렉션을 통해 액세스 할 수 있습니다." 간단한 예를 보여줄 수 있습니까? –

+1

@TrevorDixon : java.lang.Class.forName (String)을 통해 최상위 수준 클래스의 클래스 개체에 액세스하거나 이진 이름이나 클래스의 정규화 된 이름이 필요한 다른 메서드를 통해 액세스 할 수 있습니다. 예를 들어'class Name {className {/ * 여기서 참조되는 외부 클래스 * /}}'가 주어지면, 클래스 수준의 Class 객체는 Class.forName ("Name")을 통해 얻을 수 있습니다. –

0

클래스가 기본 패키지에 있다고 가정합니다. 이 경우 명명 충돌을 해결하려면 충돌 클래스의 이름을 바꾸거나 명명 된 패키지를 사용해야합니다. 그런 다음 FQCN을 사용하여 문제를 해결하십시오.

관련 문제