请考虑以下代码段。
<nav class="navigation">
<ul class="naviagation__list">
<li class="navigation__item">
<a href="#" class="navigation__link"> Main page </a>
</li>
<li class="navigation__item">
<a href="#" class="navigation__link"> About us </a>
</li>
<li class="navigation__item">
<a href="#" class="navigation__link"> Products </a>
</li>
<li class="navigation__item">
<a href="#" class="navigation__link"> Contact </a>
</li>
</ul>
</nav>
该示例仅在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
类中时进行编译。
这似乎与OOP的一些基本概念背道而驰。有人可以解释为什么这个编译?背后的原因是什么?
答案 0 :(得分:3)
选中此项:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html。它表示通过允许 static
类访问顶级类的私有成员来增加封装(有时您可能需要这样做)。 a
是 A
类的私有成员,属于 BreakOOP
的范围,这反过来使其可以在课程 B
中访问。
答案 1 :(得分:1)
私有类成员或构造函数只能在顶级类(第7.6节)的主体内访问,该类包含成员或构造函数的声明。
由于A
和B
类在BreakOOP
正文中定义,该规则适用,B
可以看到A
的私人成员。
至于OOP概念:因为A
和B
是静态内部类,它们与真正的内部类没有BreakOOP
的特殊生命周期关系(即你不需要BreakOOP
的实例来创建A
或B
的新实例,但他们仍然有一些特殊关系,因为他们可以访问私有成员。如果他们不应该有这种关系,那么他们不应该是内部阶级,而是真正的顶级阶级。