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

时间:2013-08-07 02:54:34

标签: java

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

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语言规范,但它仍未提及。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

编辑:想想看,就像你在一所房子(外层)里有几个沙发垫子(内层),一个是你的兄弟姐妹。你的堡垒都在房子里,所以你可以访问你家里的所有东西。妈妈(Java)是完全蹩脚的,并说你必须与你的兄弟姐妹分享,因为房子里的所有东西都是别人的,如果你想要自己的堡垒,你将不得不用自己的钱购买(另外一个班级? )。