다음 스 니펫을 고려하십시오. A
및 B
가 BreakOOP
클래스 내에서 캡슐화하는 경우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의 몇 가지 기본 개념에 어긋나는 것으로 보입니다. 누군가이 컴파일 이유를 설명 할 수 있습니까? 그 뒤에있는 추론은 무엇입니까?
'super.a'에 대한 언급입니다. 사양은 최상위 클래스의 범위 내에서 모든 사적인 멤버가 표시된다는 것을 나타 내기 때문에 컴파일됩니다. 즉, 캐쉬의'BreakOOP '내에 있습니다. e (나는 JLS의 관련 섹션을 찾아야 할 것이다). – Thomas
내부 클래스는 부모 클래스에서 가시성 규칙을 가져옵니다. 왜 이래? - 논쟁의 여지가 있지만, 자바에서와 같은 방식입니다. 따라서 B에서 super.a에 액세스하는 것은 BreakOOP 클래스의 두 개인 변수와 같습니다. 더 광범위한 보호 기능을 원한다면 다른 컴파일 단위로 옮겨야합니다. – mtj
[하위 클래스의 super 키워드를 사용하여 수퍼 클래스 비공개 필드에 액세스] 가능한 복제본 (http://stackoverflow.com/questions/31478718/access-to-superclass-private-fields-using-the-super-keyword-in -a-subclass) –