打破封装和信息隐藏在 Java

Breaking encapsulation and information hiding in 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());
    }
}

仅当 AB 封装在 BreakOOP class.

中时,该示例才会编译

这似乎违背了 OOP 的一些基本概念。有人可以解释为什么要编译吗?其背后的原因是什么?

检查这个:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html。它说它通过允许 static class 访问顶级 class 的私有成员来增加封装(有时您可能需要这样做) .而a是classA的私有成员,在[=18的范围内=]BreakOOP,这又使得它可以在 class B.

内部访问

Java Language Specification 状态:

A private class member or constructor is accessible only within the body of the top level class (§7.6) that encloses the declaration of the member or constructor.

因为 类 AB 是在 BreakOOP 的正文中定义的,所以该规则适用并且 B 可以看到 [=10] 的私有成员=].

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