【发布时间】:2017-02-05 01:04:30
【问题描述】:
考虑以下 sn-p。
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。之所以可以编译,是因为规范说明了任何私有成员在顶级类的范围内都是可见的,即在您的情况下在BreakOOP内(我将不得不查找 JLS 的相关部分)。跨度> -
内部类从其父类获取可见性规则。这是为什么? - 争论不休,这只是它在java中的方式。因此,从 B 访问 super.a 就像 BreakOOP 类中的两个私有变量。如果您想要更广泛的保护,则必须将它们移动到不同的编译单元中。
-
我不知道为什么允许这样做的原因,但在我看来,它增加了封装性的论点似乎类似于为什么 C++ 中的朋友关键字可以增加封装性的论点。
-
为什么你认为它不应该编译?
标签: java oop inheritance encapsulation information-hiding