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

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

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


几乎在“外部”类定义内的所有内容都可以访问私有成员。 - jtahlborn
1
您可以参考这个问题:https://dev59.com/LnI-5IYBdhLWcg3wio9k?lq=1 - SanthyReddy
为什么这个逻辑对你来说是错误的?TestInner2TestOutter 的一个组成部分,因此既然 TestOutter 可以访问 TestInner1,那么 TestInner2 也可以。在我看来这很好。 - Ran Eldan
因为这就是他们设计的方式。 - user207421
2个回答

4
否则,如果成员或构造函数被声明为私有,则只有在它出现在封闭该成员或构造函数声明的顶层类(§7.6)的主体内时才允许访问。 JLS 6.6.1 在这种情况下,TestOutter 是顶层类,因此其内部所有private字段都是可见的。
基本上,声明成员为private的目的是通过防止其他类(子类或其他类)干扰来确保正确性。由于顶级类是Java编译单元,因此规范假定在同一文件中的访问已经得到适当的管理。

谢谢!您的回答非常清晰地解决了这个问题! - user1260771

2
这是因为内部类作为外部类的成员,可以访问其所有私有变量。而由于另一个内部类也是外部类的成员,因此它的所有私有变量也是可访问的。
编辑:可以将其想象成在房子(外部类)里有几个沙发垫堆成的小堡垒(内部类),一个是你的,一个是你兄弟姐妹的。你们的小堡垒都在房子里,所以你们都可以访问房子里的所有东西。但是Java妈妈很严格,要求你们要共享所有东西。如果你想要自己的小堡垒,就需要用自己的钱购买(创建另一个类?)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接