为什么内部类可以访问另一个内部类的私有成员



我刚刚发现内部类可以访问另一个内部类的私有成员,如下所示:

public class TestOutter {
    class TestInner1 {
        private int mInt = 1;
    }
    class TestInner2 {
        public int foo(TestInner1 value) {
            return value.mInt;
        }
    }
}

TestInner2的方法foo可以访问TestInner1的私有成员mInt。

但我以前从未见过这种情况。我不知道让TestInner2中的代码可以访问TestInner1的私有成员是什么意思。

我在谷歌上搜索过内部类,没有一个搜索结果显示内部类有这个功能。我还查阅了Java语言规范,但它仍然没有提到这一点。

"否则,如果成员或构造函数被声明为私有,则当且仅当访问发生在包含成员或构造函数声明的顶级类(§7.6)的主体内时,才允许访问。"JLS 6.6.1在这种情况下,TestOutter是顶级类,因此它内部的所有private字段都可见。

基本上,声明成员private的目的是通过防止其他类(子类或其他类)对其进行干预来帮助确保正确性。由于顶级类是Java编译单元,因此规范假设对同一文件中的访问进行了适当的管理。

这是因为内部类作为外部类的成员,可以访问其外部类的所有私有变量。由于另一个内部类也是外部类的成员,所以它的所有私有变量也是可访问的。

编辑:想象一下,你在一所房子里(外舱)有几个沙发垫堡垒(内舱),一个是你的,另一个是兄弟姐妹的。你的堡垒都在房子里,所以你可以使用房子里的所有东西。妈妈(Java)完全站不住脚,说你必须和你的兄弟姐妹分享,因为家里的一切都是别人的,如果你想要自己的堡垒,你就必须用自己的钱买(再上一堂课?)。

最新更新