打破Java中的封装和信息隐藏

时间:2016-09-27 11:53:42

标签: java oop inheritance encapsulation information-hiding

请考虑以下代码段。

<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的一些基本概念背道而驰。有人可以解释为什么这个编译?背后的原因是什么?

2 个答案:

答案 0 :(得分:3)

选中此项:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html。它表示通过允许 static 类访问顶级类的私有成员来增加封装(有时您可能需要这样做)。 a A 类的私有成员,属于 BreakOOP 的范围,这反过来使其可以在课程 B 中访问。

答案 1 :(得分:1)

Java Language Specification州:

  

私有类成员或构造函数只能在顶级类(第7.6节)的主体内访问,该类包含成员或构造函数的声明。

由于AB类在BreakOOP正文中定义,该规则适用,B可以看到A的私人成员。

至于OOP概念:因为AB是静态内部类,它们与真正的内部类没有BreakOOP的特殊生命周期关系(即你不需要BreakOOP的实例来创建AB的新实例,但他们仍然有一些特殊关系,因为他们可以访问私有成员。如果他们不应该有这种关系,那么他们不应该是内部阶级,而是真正的顶级阶级。