5

我刚刚发现一个内部类可以像这样访问另一个内部类的私有成员:

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的私有成员是什么意思。

我在 google 中搜索了有关内部类的信息,没有一个搜索结果显示内部类具有此功能。我也很看重 Java 语言规范,但它仍然没有提到这一点。

4

2 回答 2

4

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

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

于 2013-08-07T03:01:54.987 回答
2

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

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

于 2013-08-07T03:04:23.247 回答