2010-02-08 5 views
18

Java에서 내부 클래스는 클래스를 둘러싸는 private 멤버에 액세스 할 수 있습니다. 하지만 외부 클래스가 내부 클래스의 개인 멤버에 액세스 할 수 있습니까? 이것은 내부 클래스가 정적인지 여부에 관계없이 발생합니다. 나는 이것이 사실이 아니라고 생각했지만 다음 코드는 컴파일하고 잘 작동하는 것 같다.Java 중첩 클래스에서, 둘러싼 클래스가 내부 클래스의 개인 멤버에 액세스 할 수 있습니까?

public class Outer { 
    class Inner { 
     private int i = 0; 
     private Inner() {} 
    } 

    public static void main(String[] args) { 
     Outer o = new Outer(); 
     Outer.Inner oi = o.new Inner(); 
     oi.i = 10; 
    } 
} 
+1

예상대로 나옵니다. 너 oi.i = 10; 예를 제외하고? – Ben

+1

중복 : http://stackoverflow.com/questions/1801718/outer-java-class-is-able-to-access-inner-class-private-members – finnw

+3

이해가 안됩니다. 코드가 바로 여기 있습니다. 나는 결과를 안다. 나는 그것이 작동하는 것을 안다. 그 배후의 추론을 이해하고 싶었습니다. 이 질문에 답을 얻지 못할 것이라고 생각하십니까? – user236215

답변

23

네, 괜찮습니다. 회원 또는 생성자가 private 선언 된 경우 경우

그렇지 않으면, 다음 액세스를 허용하고 최상위 클래스의 신체 내에서 발생하는 경우에만 (§7.6) 즉의 선언을 둘러싸 다음 JLS, section 6.6.1에서 멤버 또는 생성자.

최상위 클래스를 공유하는 한 다른 중첩 유형 Y 내의 중첩 된 유형 X의 개인 멤버를 참조 할 수도 있습니다.

바이트 코드 수준에서이 모든 것은 합성 패키지 액세스 방법을 추가하여 구현 된 것 같습니다.

관련 문제