私は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 コンストラクターのみを合成して、それで完了しないのはなぜですか?