Ich untersuche innere Klassen von Java.
Ich habe ein Beispiel geschrieben:
%Vor%Ich rufe es von main aus mit folgender Zeichenfolge auf:
%Vor%Ich sehe Kompilierfehler:
%Vor%Können Sie mir diese Situation erklären?
AKTUALISIEREN
Inner
ist eine innere Klasse. Sie kann nur erstellt werden, wenn eine umschließende Instanz der Klasse mit der Klassendefinition Inner
vorhanden ist.
Sie haben jedoch eine verschachtelte Klasse static
, Nested
, erstellt, die von dieser Klasse ausgeht. Wenn Sie versuchen, den Superkonstruktor aufzurufen
Es wird fehlschlagen, weil der Superkonstruktor für Inner
von einer Instanz von Outer
abhängt, die nicht im Kontext static
der Klasse Nested
vorhanden ist. Jon Skeet bietet eine Lösung.
Eine Erläuterung der Lösung wird in der JLS angezeigt hier .
Superklassenkonstruktoraufrufe können unterteilt werden:
Unqualifizierte Superklassenkonstruktoraufrufe beginnen mit dem Schlüsselwort super (möglicherweise mit expliziten Typargumenten vorangestellt).
Qualifizierte Superklassen-Konstruktoraufrufe beginnen mit einem Primary Ausdruck.
- Sie erlauben einem Unterklassenkonstruktor, das Neue explizit anzugeben die umschließende Instanz des erstellten Objekts in Bezug auf die direkte Oberklasse (§8.1.3). Dies kann notwendig sein, wenn die Oberklasse ist eine innere Klasse.
Wie Sotirios gesagt hat, hat Ihre verschachtelte (nicht-innere) Klasse nicht implizit eine Instanz von Outer
, die effektiv an die Inner
übergeben wird.
Sie können dies jedoch umgehen, indem Sie explizit vor dem .super
-Teil angeben:
Oder akzeptieren Sie es sogar als Parameter:
%Vor%Allerdings würde ich Ihnen dringend empfehlen, einen solchen gewundenen Code zu vermeiden. Ich vermeide die meiste Zeit verschachtelte Klassen, benenne fast immer innere Klassen und ich kann mich nie erinnern, eine Kombination von ihnen so zu benutzen.
Tags und Links java inheritance inner-classes instantiation