2015-07-17 3 views
11

Für ein Codierungsprojekt habe ich eine Klasse mit einer geschachtelten Klasse. Die verschachtelte Klasse ist innerhalb der gleichen äußeren Klasse unterklassifiziert. Die äußere Klasse soll einige Instanzen der verschachtelten Klasse enthalten, die sie anderen Instanzen der äußeren Klasse übergeben kann.Zugriff auf private Superklassenfelder mit dem Schlüsselwort super in einer Unterklasse

Die geschachtelte Unterklasse ermöglicht der äußeren Klasse den Inhalt zu ändern, während ihre Oberklasse den Inhalt zu lesen erlaubt und einige Methoden aufgerufen werden. Die Oberklassenobjekte werden somit an andere Objekte übergeben, um die äußeren Klassenobjekte in einer Kette zu verknüpfen.

Die Frage, die ich habe, betrifft die Zugriffsmodifikatoren. Hier ist ein minimalistisches Codebeispiel:

abstract class OuterClass { 


    protected class NestedSuperClass<T> { 
     private T data; 

     public NestedSuperClass (T t) { 
      this.data = t; 
     } 

     public T getOutput() { 
      return data; 
     } 
    } 

    protected class NestedSubClass<T> extends NestedSuperClass<T> { 
     public NestedSubClass (T t) { 
      super(t); 
     } 

     protected void setOutput(T t) { 
      super.data = t; 
     } 
    } 
} 

Wenn eine Dokumentation aufzublicken Ich war von der Fähigkeit verwirrt den privaten Bereich der übergeordneten Klasse zugreifen nirgendwo erwähnt. Gibt es eine Ressource, die erklärt, warum die Unterklasse das private Feld der Oberklasse auf diese Weise ändern darf?

Ich bin völlig in Ordnung mit dieser Arbeit. Ich habe auch bemerkt, dass es scheint mit Daten zu arbeiten, die als geschützt statt privat und nicht mit dem Super-Schlüsselwort markiert werden. Ich bin vor allem an Dokumentationen interessiert, die diese Fähigkeit des Super-Keywords erwähnen. Danke im Voraus.

+0

Ich stimme diese Frage erneut zu öffnen, da es speziell die Verwendung von "Super" und privaten Feldzugriff anstelle einer allgemeinen inneren Klasse Accessibility – dkatzel

+0

Ich stimme, um die Frage zu öffnen. Es scheint nicht mit der doppelten Frage verwandt zu sein. – nafas

+0

Hinweis: ** synthetische ** Accessor-Methoden, die vom Compiler generiert werden – charlie

Antwort

1

Was Sie in einem Subklassen-Do

Eine Unterklasse erbt alle öffentlichen und geschützten Mitglieder ihrer Eltern, egal welches Paket die Unterklasse ist. Wenn die Unterklasse im selben Paket wie seine Eltern ist, Es erbt auch die package-private Mitglieder des Elternteils. Sie können die übernommenen Elemente unverändert übernehmen, ersetzen, ausblenden oder durch neue Elemente ergänzen:

Die vererbten Felder können wie alle anderen Felder direkt verwendet werden. Sie können ein Feld in der Unterklasse mit dem gleichen Namen wie das in der Oberklasse deklarieren und es somit verstecken (nicht empfohlen). Sie können neue Felder in der Unterklasse deklarieren, die nicht in der Oberklasse sind. Die vererbten Methoden können direkt wie sie sind verwendet werden. Sie können eine neue Instanzmethode in die Unterklasse schreiben, die die gleiche Signatur wie die in der Oberklasse hat und sie somit überschreibt. Sie können eine neue statische Methode in der Unterklasse schreiben, die die gleiche Signatur wie die in der Oberklasse hat, und sie somit ausblenden. Sie können neue Methoden in der Unterklasse deklarieren, die nicht in der Oberklasse sind. Sie können einen Unterklassenkonstruktor schreiben, der den Konstruktor der Oberklasse entweder implizit oder mit dem Schlüsselwort super aufruft. In den folgenden Abschnitten dieser Lektion werden diese Themen behandelt.

Private Members in einer Super

Eine Unterklasse erbt nicht die privaten Mitglieder ihrer Elternklasse. Verfügt die Oberklasse jedoch über öffentliche oder geschützte Methoden zum Zugriff auf ihre privaten Felder, können diese auch von der Unterklasse verwendet werden.

Eine verschachtelte Klasse hat Zugriff auf alle privaten Member ihrer einschließenden Klasse - sowohl Felder als auch Methoden. Daher hat eine öffentliche oder geschützte verschachtelte Klasse, die von einer Unterklasse geerbt wird, indirekten Zugriff auf alle privaten Mitglieder der Oberklasse.

Referenz: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

0

JLS §6.6.1. Determining Accessibility (emphasis mir):

Element (Klasse, Schnittstelle, Feld, oder das Verfahren) eines Referenztyp oder ein Konstruktor für eine Klasse-Typ, nur zugänglich ist, wenn der Typ zugänglich ist und das Element oder Konstruktor deklariert Zugang zu ermöglichen:

[...]

Andernfalls wird das Mitglied oder der Konstruktor als privat deklariert, und der Zugriff ist nur dann zulässig, wenn innerhalb des Hauptteils der obersten Klasse auftritt, die die Deklaration des Members oder Konstruktors einschließt.

Das bedeutet einfach, dass Sie auf alle privaten Mitglieder zugreifen können, solange Sie auf sie innerhalb Ihres Top-Level-Typs zugreifen.

Das Schlüsselwort super wird zur Bestimmung der Barrierefreiheit nicht benötigt. Es funktioniert auch ohne.

8

der Laut Java Language Specification

Beispiel 6,6-5. Zugriff auf private Felder, Methoden und Konstruktoren

Ein privates Klassenmitglied oder Konstruktor ist nur innerhalb des Hauptteils der obersten Klasse (§7.6) zugänglich, der die Deklaration des Members oder Konstruktors einschließt. Es wird nicht von Unterklassen geerbt.

Also was passiert, ist die innere Klasse kann ein nicht-privates Feld direkt sehen, da es es erbt.

Für private Felder muss die innere Klasse jedoch super.field verwenden, um auf sie zuzugreifen, da sie nicht vererbt wird (andernfalls erhalten Sie einen Compilerfehler "field ist nicht sichtbar"). Obwohl es nicht vererbt wird, ist es immer noch zugänglich, da die innere Klasse innerhalb der äußeren Klasse liegt und private Felder für alles innerhalb des Körpers der obersten Klasse zugänglich sind.

Verwandte Themen