2017-07-18 2 views
4

Ich lerne innere und äußere Klassen in Java. Ich weiß, was innere und äußere Klassen sind und warum sie benutzt werden. Ich bin auf die folgende Frage zu diesem Thema gestoßen und konnte keine Antwort finden.Wie definiert man den Konstruktor einer Unterklasse, die eine innere Klasse erbt?

class outer{ 
    class inner{ 

    } 
} 

class SubClass extends outer.inner{ 
} 

Frage: Wie sollte die minimale Unterklasse Konstruktor definiert werden

Angenommen wird der folgende Code gegeben? und warum?

Option 1- 
Subclass() { 
    //reason: bacause the default constructor must always be provided 
} 
Option 2- 
Subclass (Outer outer) { 
    //reason : because creating an instance of **Subclass** requires an instance 
    //of outer, which the **Subclass** instance will be bound to 
} 

Option 3- 
Subclass (Outer outer) { 
    outer.super(); 
    //reason : because creating an instance of **Subclass** requires an explicit 
    //call to the **Outer's** constructor, in order to have an enclosing instance 
    //of **Outer** in scope. 
} 
Option 4- 
Subclass (Outer.inner inner) { 
    //reason : bacause an instance of **inner** is necessary so that there is a 
    //source to copy the derived properties from 
} 

PS. Dies ist eine Multiple-Choice-Frage. Nur noch 1 Antwort

erwartet

Ich bin neu zu Java und weiß nicht viel über diese Themen für Fortgeschrittene

Dank

+0

ich keine der oben genannten glauben, und dass dies ein Fall für einen [Receiver Parameter - JLS # 8.4.1] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.1). – EJP

Antwort

2

Hier ist ein Beispiel aus den JLS, die dieser Logik folgen, aber nicht durch die Weitergabe umschließende Instanz, aber indem sie direkt im Konstruktor erzeugt wird:

Beispiel 8.8.7.1-1. Qualifizierte Oberklassenkonstruktors Invocation

class Outer { 
    class Inner {} 
} 
class ChildOfInner extends Outer.Inner { 
    ChildOfInner() { (new Outer()).super(); } 
} 

Oberklassenkonstruktors Anrufungen unterteilt werden kann:

  • Unqualifizierte Oberklassenkonstruktors Anrufungen mit dem Schlüsselwort Super (mit expliziter Typargumente möglicherweise voran) beginnen.

  • Qualifizierte Superklassen Konstruktoraufrufe beginnen mit einem primären Ausdruck.

Sie erlauben eine Unterklasse Konstruktor explizit die neu zu spezifizieren unmittelbar umschließenden Instanz erstellte Objekt in Bezug auf die direkte Ober (§8.1.3). Dies kann erforderlich sein, wenn die Oberklasse eine innere Klasse ist.

Der Fall der nächste Antworten in vorgeschlagen ist

public SubClass(Outer outer) { 
    outer.super(); 
} 

Outer.Inner zu erweitern, die eine innere Klasse von Outer ist, SubClass Konstruktor eine Instanz von Outer haben muss, dass die umschließende Typ ist.

outer.super(); wird den Konstruktor der Outer übergeordneten Klasse aufrufen, die der Inner-Konstruktor ist.

Die outer.super(); Syntax irritierend sein kann, wie wir super() aufrufen Regel nicht auf einen Parameter eines Konstruktors aber im Falle einer Klasse eine innere Klasse erstreckt, ermöglicht es dem Konstruktor der Unterklasse diese Syntax.

+0

'outer.super()' wird nicht kompiliert ... –

+0

@Usagi Miyamoto Ich habe es gerade versucht. Es klappt. – davidxxx

+0

Hat Ihre Klasse "Outer" eine Methode namens 'super()'? Wenn dies nicht der Fall ist, ist "super" ein reserviertes Wort (ein Sprachkonstrukt), das für den Aufruf des Konstruktors der Superklasse reserviert ist und daher nicht mit Klassen- oder Instanz-ID qualifiziert werden kann. –

0

Ich glaube nicht, dass eine "äußere" Klasse eine innere Klasse erweitern kann. Dieses Konstrukt würde bedeuten, dass eine Klasse auf private Mitglieder einer anderen Klasse zugreifen könnte.

Sie könnten jedoch eine innere Klasse haben, die eine weitere innere Klasse derselben äußeren Klasse erweitert.

Wie für die Konstrukteure, die äußere Instanz in der Instanziierung angegeben, nicht als Argument:

class Outer { 
    class Inner { 
     ... 
    } 
    class SubInner { 
     ... 
    } 
    void method() { 
     Inner i = this.new SubInner(); 
    } 
} 
Verwandte Themen