私はOuterクラスを持つクラスを持っていprivate Innerます。
私のOuterクラス メソッドでは、Inner次のようにクラスをインスタンス化します。
Outer outer = new Outer();
Inner inner = outer.new Inner();
コンパイラは、このコードを次のように変換します。
Outer outer = new Outer();
Inner inner = new Inner(outer, null);
リフレクションを使用すると、Innerクラスに次の合成コンストラクターがあることがわかります。
private Outer$Inner(Outer)
Outer$Inner(Outer,Outer$Inner)
Innerクラスはであるためprivate、コンパイラはそのprivateコンストラクタをそれに追加して、誰もそのクラスをインスタンス化できないようにします。しかし、明らかに、Outerクラスはそれをインスタンス化できるはずなので、コンパイラは、プライベート コンストラクターを呼び出す他のパッケージ プライベート コンストラクターを追加します。また、package-private コンストラクターの$名前にはそれが含まれているため、通常の Java コードでは呼び出すことができません。
質問: 1 つのプライベート コンストラクターと 1 つのパッケージ プライベート コンストラクターを合成するのはなぜですか? package-private コンストラクターのみを合成して、それで完了しないのはなぜですか?