2016-09-05 3 views
0

Ich war über die Vererbung von inneren Klassen lesen und ich habe stecken versuchen zu verstehen, wie der folgenden Code funktioniert:Wie funktioniert dieses Beispiel für innere Klassenvererbung?

class Outer{ 
    class Inner{ 
    } 
} 
class Derived extends Outer.Inner{ 
    Derived(Outer o){ 
     o.super(); 
    } 
} 

Soweit ich weiß, bezieht sich das Schlüsselwort Super auf den übergeordneten, super(), um es nicht ist Argumentkonstruktor. Im Fall der Klasse Outer ist die Oberklasse die Klasse Object.
Ich würde gerne verstehen, wie dieser Code funktioniert.
Warum ermöglicht die Instanziierung der Klasse Object die Erweiterung der inneren Klasse?
Was hat das Erstellen einer Object-Klasseninstanz mit der Erstellung eines Outer-Klassenobjekts zu tun?

Zeile mit "o.super();" entfernen Ursache Fehler:
Java: eine umschließende Instanz, die p.Outer.Inner enthält, ist erforderlich

Ich habe viele Artikel gelesen, aber ich kann nicht herausfinden, wie es funktioniert.
Ich werde für jede Antwort dankbar sein.

+0

-Test es aus. Setzen Sie println() Zeilen in alle Konstruktoren und beobachten Sie, in welcher Reihenfolge sie ausgedruckt werden. ;) – GregaMohorko

+1

Wenn Sie dies in einem realen Projekt tun, möchten Sie vielleicht Ihre Objekthierarchie überdenken. –

Antwort

2

Angenommen, Sie haben eine Variable o auf eine Instanz Outer Bezug genommen wird, und Sie möchten eine Instanz von Inner mit seinem einschließe Beispiel ist der Wert von o erstellen. Sie könnten nennen:

Outer.Inner inner = o.new Outer.Inner(); 

Es ist selten in Java zu sehen (weil in der Regel, wenn Sie eine innere Klasse konstruieren, können Sie es mit „dieser“ tun die implizite umgebende Instanz ist), aber es ist gültig.

Dies ist wirklich das Äquivalent, aber im Kontext eines Unterklassenkonstruktors. Die Inner Klasse wirklich hat einen Konstruktor wie folgt aus:

Inner(Outer enclosingInstance) 

... und diese Linie ist effektiv

Aufruf
super(o) 

... es ist einfach ist es nicht, dass die Art und Weise in der Syntax ausgedrückt Unterscheiden Sie zwischen dieser "speziellen" Information und allen regulären Parametern.

1

Why instantiation of Object class makes extending Inner class possible?

In der inneren Instanz muss eine äußere Instanz eine innere Instanz von sein. Es macht keinen Sinn, es ohne seine äußere Instanz zu haben. Wenn es Sinn hat, ohne eine äußere eine innere haben würden Sie es machen static

What creating an Object class instance has to do with creating Outer class object?

Sie benötigen eine äußere Instanz, bevor Sie eine innere Instanz erstellen können.

I read many articles but I can't figure out how it works.

setzt sie die Outer Instanz die Inner super-Klasse braucht.

0

Sie instanziiert die innere Klasse wie diese Outer outer = new Outer(); Inner inner = outer.new Inner();

+0

Es ist keine Antwort auf meine Frage, aber danke. –

1

Klasse Inner eine verschachtelte innere Klasse genannt wird und an die äußeren Klasse so binded, dass es erforderlich für die Initialisierung ist eine Instanz der äußeren Klasse zu verwenden, wie diese Outer.Inner inner = (new Outer()).new Inner();

Wenn Ihre innere Klasse wurden unter Verwendung des statischen Modifikator deklariert, wäre es eine statische verschachtelte Klasse und keine Instanz der äußeren Klasse sein zum Initialisieren einer neuen Instanz es erforderlich wäre, wie folgt aus: Outer.Inner inner = new Outer.Inner();

Verwandte Themen