2013-07-26 4 views
9

정적 내부 클래스 M과 정적 멤버 M [클래스 C]은 같은 이름을 어떻게 공유합니까?정적 내부 클래스와 정적 멤버가 같은 이름을 공유합니까?

다음 코드는 출력으로 "화이트"를 생성

구성원 개체에 액세스 아닌 정적 클래스 멤버 방법
public class Amazed{ 

    public static void main(String[] args) { 
     System.out.println(B.M.W); 
    } 
} 

class B { 
    public static class M {  
     static String W = "Black"; 
    } 

    static C M = new C(); 
} 

class C { 
    String W = "White"; 
} 

: "블랙"]

W i가 액세스하려는 경우 정적 클래스 M 내의 멤버 어떻게해야합니까? 당신이에 의해 식별자를 명확화하기 때문에

public class Amazed{ 
    @SuppressWarnings("static-access") 
    public static void main(String[] args) { 
     B.M val = new B.M(); 
     System.out.println(val.W); 
    } 
} 

class B { 
    public static class M {  
     static String W = "Black"; 
    } 

    static C M = new C(); 
} 

class C { 
    String W = "White"; 
} 

은 위의 '블랙'을 출력 할 것이다 : M 당신이 정적이 아닌 정적 인 방법으로 접근 할 수 있다는 사실을 사용할 수 인스턴스화 할 수있는 특별한 경우

+1

나는 'meth'방법이 마음에 들지 않습니다. 매우 긴 루프가 더 적절할 수도 있습니다. – thatidiotguy

+0

@thatidiotguy : 또는 스택을 날 때까지 재발하는 것. –

+0

BMT에 감사드립니다. 그러나 나는 모호하고 재 분류의 명세를 이해하지 못한다. 누군가 나를 도와 줄 수 있을까? – Dineshkumar

답변

2

Chapter 6 of the Java Language Specification (특히 Section 6.5)는 자바가 특정 식별자가 특정 상황에서 무엇을 의미하는지 알아 정렬 방법의 소름 끼치는 세부 사항을 주문.

  • 패키지 이름
  • 유형 이름
  • 필드 (변수) 이름
  • 메소드 이름
  • 지역 변수 이름 (: 규칙은, 대략 자바 여섯 개 이름 공간을 가지고, 말하기, 상당히 복잡하지만 파라미터 포함)
  • 라벨

동일한 식별자는 U 될 수 각 네임 스페이스에있는 엔티티에 대해 sed. 유형 (클래스) 이름과 필드 이름은 별도로 존재하므로 코드가 합법적 인 이유를 설명합니다.

동일한 이름 공간의 상속 된 이름은 때로는 섀도 잉되거나 마스크 처리 될 수도 있습니다. 식별자가 모호한 경우가 있습니다. 그런 다음 어떤 방식 으로든 자격이 부여되어야합니다 (예 :, 패키지 이름으로) 컴파일러가 불평 할 것이다.

코드 난독는 a.a라는 이름의 패키지 (도 a.a로 식별 될 것이다) 패키지 aa라는 이름의 클래스를 끝낼 수있는 점에 큰 장점이를 사용합니다. dofor과 같은 Java 키워드는 .class 파일의 유효한 이름입니다 (Java 소스는 ​​제외). 그것은 리버스 엔지니어링을 진정한 의미로 만드는 데 도움이됩니다.

0

B.M의 인스턴스를 통해이를 참조하십시오. 정적 필드가 정적이지 않은 방식으로 액세스되어서는 안되기 때문에 프로덕션 코드에서이 방법을 사용하는 것은 결코 바람직하지 않습니다. 마찬가지로 B.M의 인스턴스를 만들어야합니다.

1

변수가 동일한 이름의 유형을 모호하게 만듭니다. 이름이 변수 또는 유형으로 해석 될 수있는 경우, 변수가 선호됩니다.

같은 이름을 지정하지 않아도이를 방지 할 수 있습니다. Java 언어 사양에서

, section 6.4.2: Obscuring :

6.4.2. 어둡게하기

간단한 이름은 변수, 유형 또는 패키지의 이름으로 해석 될 가능성이있는 컨텍스트에서 발생할 수 있습니다. 이러한 상황에서, §6.5의 규칙은 변수가 유형에 우선하여 선택되고 유형이 패키지보다 우선 선택되도록 지정합니다. 따라서 가시적 인 타입이나 패키지 선언을 단순한 이름으로 참조하는 것이 때때로 불가능할 수도 있습니다. 우리는 그러한 선언이 모호하다고 말합니다.

+0

어떻게 읽습니까? 무엇이 선호도 순서인가? – Dineshkumar

+1

1) 변수 2) 유형 3) 패키지 이름 –

+0

않습니다 여기에 유형은 클래스 이외의 다른 것을 의미합니까? – Dineshkumar

0

모두의 도움과 작은 플레이를 통해 우리는 내부 클래스의 객체를 만들지 않아도 멤버 W "Black"에 액세스 할 수 있음을 발견했습니다.

은 단순히이 문

M.W 

을 사용하지만 난 액세스 수준을 알아낼 수 없습니다. [공개적으로 공개 되었기 때문에] 공용이 아닌 경우에도 효과가있었습니다. 어떻게한다는거야?

관련 문제