2016-09-27 2 views
3

다음 스 니펫을 고려하십시오. ABBreakOOP 클래스 내에서 캡슐화하는 경우Java에서 캡슐화 및 정보 숨기기 중단

package breakoop; 

public class BreakOOP { 

    public static class A{ 
     private int a; 
    } 

    public static class B extends A{ 
     public int f(){ 
      return super.a; 
     } 
    } 

    public static void main(String[] args) { 
     B b = new B(); 
     System.out.println(b.f()); 
    } 
} 

이 예는 컴파일합니다.

이것은 OOP의 몇 가지 기본 개념에 어긋나는 것으로 보입니다. 누군가이 컴파일 이유를 설명 할 수 있습니까? 그 뒤에있는 추론은 무엇입니까?

+1

'super.a'에 대한 언급입니다. 사양은 최상위 클래스의 범위 내에서 모든 사적인 멤버가 표시된다는 것을 나타 내기 때문에 컴파일됩니다. 즉, 캐쉬의'BreakOOP '내에 있습니다. e (나는 JLS의 관련 섹션을 찾아야 할 것이다). – Thomas

+0

내부 클래스는 부모 클래스에서 가시성 규칙을 가져옵니다. 왜 이래? - 논쟁의 여지가 있지만, 자바에서와 같은 방식입니다. 따라서 B에서 super.a에 액세스하는 것은 BreakOOP 클래스의 두 개인 변수와 같습니다. 더 광범위한 보호 기능을 원한다면 다른 컴파일 단위로 옮겨야합니다. – mtj

+0

[하위 클래스의 super 키워드를 사용하여 수퍼 클래스 비공개 필드에 액세스] 가능한 복제본 (http://stackoverflow.com/questions/31478718/access-to-superclass-private-fields-using-the-super-keyword-in -a-subclass) –

답변

3

확인 : https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html. static 클래스가 최상위 클래스의 비공개 멤버에 액세스 할 수있게하여 캡슐화를 늘립니다 (때때로 그렇게해야 할 수도 있음). 그리고 a 차례로 클래스 B 내부가 액세스 할 수 BreakOOP의 범위에있는 클래스 A의 private 멤버입니다.

1

Java Language Specification 상태 :

개인 클래스 멤버 또는 생성자는 회원 또는 생성자의 선언을 둘러싸는 최상위 클래스 (§7.6)의 신체 내에서 액세스 할 수 있습니다. 클래스 AB 이후

는 규칙이 적용 BA의 전용 부재를 볼 수 BreakOOP의 본문 내에서 정의된다. OOP의 개념에 관해서는

: AB 정적 내부 클래스이기 때문에 그들이 진정한 내부 클래스가 있다고 (즉, 당신이를 만들 BreakOOP의 인스턴스를 필요가 없습니다 BreakOOP과의 특별한 라이프 사이클과 관련이없는 A 또는 B의 새 인스턴스이지만 사적인 멤버에 액세스 할 수 있다는 점에서 여전히 다소 특별한 관계가 있습니다. 이러한 관계가 없으면 내부 클래스가 아니고 실제 최상위 클래스가되어야합니다.