これは、CUBE が最終的にメインと同じクラスにあるために発生するのでしょうか。
いいえ、言語仕様で動作すると書かれているため動作します。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
を見ると、コンパイラによって生成された合成メソッドが表示されます。