Ich habe eine Outer
Klasse, die eine private Inner
Klasse hat.Java: private innere Klasse synthetisierte Konstruktoren
In meinem Outer
Klassenmethode, instanziiert ich die Inner
Klasse wie folgt:
Outer outer = new Outer();
Inner inner = outer.new Inner();
Der Compiler wandelt diesen Code:
Outer outer = new Outer();
Inner inner = new Inner(outer, null);
Mit Reflexion zeigt, dass die Inner
Klasse der synthetisierten hat folgende Erbauer:
private Outer$Inner(Outer)
Outer$Inner(Outer,Outer$Inner)
Da die Klasse Inner
private
ist, fügt der Compiler den Konstruktor private
hinzu, damit niemand diese Klasse instanziieren kann. Aber offensichtlich sollte die Outer
-Klasse in der Lage sein, es zu instantiieren, also fügt der Compiler dieses andere private Konstruktorpaket hinzu, das wiederum den privaten Konstruktor aufruft. Da der package-private Konstruktor den Namen $
in seinem Namen hat, kann der normale Java-Code ihn nicht aufrufen.
Frage: Warum einen privaten und einen Paket-privaten Konstruktor synthetisieren? Warum nicht nur den package-privaten Konstruktor synthetisieren und damit fertig werden?
@Noofiz diese Konstruktoren werden vom Compiler erstellt, ohne dass Sie explizit für sie codieren; daher nannte ich sie synthetisiert. – shrini1000
@Noofiz Wenn Sie die Frage nicht verstehen, schlage ich vor, Sie überlassen es denen, die es tun. – EJP
Ist die Äußere $ Innere (Äußere, Äußere $ Innere) wirklich richtig? Der Konstruktor ruft eine Instanz derselben Klasse als Argument ab. Warum sollte der Compiler einen solchen Parameter hinzufügen? –