发生这种情况是因为 CUBE 最终与 main 属于同一类吗?
不,它有效,因为语言规范说它有效。就 JVM 而言,它将最终成为一个单独的类,但将创建额外的包级方法以允许外部类看起来违反正常规则。
语言规范的相关部分在6.6.1中:
否则,如果成员或构造函数被声明为私有,则当且仅当它发生在包含成员或构造函数声明的顶级类(第 7.6 节)的主体内时,才允许访问。
(强调我的。)
所以实际上,即使对等嵌套类也可以访问私有成员。示例代码:
public class Test {
public static void main(String[] args) {
First first = new First(10);
Second second = new Second(first);
System.out.println(second.getValueFromFirst());
}
private static class First {
private final int value;
private First(int value) {
this.value = value;
}
}
private static class Second {
private final First first;
private Second(First first) {
this.first = first;
}
private int getValueFromFirst() {
return first.value;
}
}
}
如果您查看生成的类(使用javap -c Test$First
并且javap -c Test$Second
您将看到编译器生成的合成方法。