请考虑以下代码片段。打破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());
}
}
示例仅当A
和B
封装在BreakOOP
类内编译。
这似乎违背了OOP的一些基本概念。有人可以解释为什么这个编译?它背后的理由是什么?
你我指的是'super.a',这是因为规范说明了这一点,因此任何私有成员都可以在顶层类的范围内看到,也就是在你的cas中的'BreakOOP'内e(我将不得不查阅JLS的相关部分)。 – Thomas
内部类从父类获取可见性规则。这是为什么? - 直到讨论,这只是它在java中的方式。因此,从B访问super.a就像BreakOOP类中的两个私有变量。如果您想要更广泛的保护,则必须将它们移到不同的编译单元中。 – mtj
[在子类中使用super关键字访问超类专用字段]可能的副本(http://stackoverflow.com/questions/31478718/access-to-superclass-private-fields-using-the-super-keyword-in -a-subclass) –