在Java嵌套类中,封闭类可以访问内部类的私有成员吗?

22

在Java中,内部类可以访问封闭类的私有成员。但外部类能否访问内部类的私有成员呢?这与内部类是否静态无关。我原本认为不行,但以下代码似乎可以编译并正常工作。

public class Outer {
    class Inner {
        private int i = 0;
        private Inner() {}
    }

    public static void main(String[] args) {
        Outer o = new Outer();
        Outer.Inner oi = o.new Inner();
        oi.i = 10;
    }
}

1
在我看来,一切都符合预期。除非你的意思是<code>oi.i = 10;</code>,是吗? - Ben
1
重复:https://dev59.com/LnI-5IYBdhLWcg3wio9k - finnw
3
我不理解。这段代码就在这里,输出结果我知道,也知道它可以运行。但我想要理解背后的原因。你觉得这个问题不值得回答吗? - user236215
你能提供一个需要这种结构的例子吗?如果你只是想理论上了解它,那没问题,但我之前从未遇到过这种情况。 - Shell Scott
1个回答

27

没问题。根据JLS的第6.6.1节

否则,如果成员或构造函数声明为private,那么只有在包含该成员或构造函数的顶层类(§7.6)的主体内才允许访问。

你甚至可以在另一个嵌套类型Y中引用嵌套类型X的私有成员,只要它们共享一个顶级类。

在字节码层面上,我相信这都是通过添加合成的包访问方法来实现的。


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