HOWTO · Java
Innere Klasse und statisch verschachtelte Klasse in Java
In der Computerprogrammierung ist eine Klasse eine Blaupause, die es uns ermöglicht, einzelne Klassenobjekte zu erstellen, um auf Daten von Datenmembern oder Memberfunktionen zuzugreifen. In der Java-Programmierung wird eine Klasse mit dem Schlüsselwort class definiert. Wir können auch sagen, dass eine Klasse ein benutzerdefinierter Datentyp mit benutzerdefinierten Modifikationen ist.
Auf dieser Seite
Eine verschachtelte Klasse wird innerhalb einer anderen Klasse deklariert. Java unterstützt verschachtelte Klassen mit static und verschachtelte Klassen ohne static (innere Klassen). Verwenden Sie eine verschachtelte Klasse mit static, wenn der Typ gedanklich zu seiner umschließenden Klasse gehört, aber kein umschließendes Objekt benötigt. Das Schlüsselwort static beschreibt diese Beziehung; es macht den verschachtelten Typ weder zu einer Klasse der obersten Ebene noch zu einer Sicherheitsgrenze.
Statisch verschachtelte Klassen in Java
Eine verschachtelte Klasse mit static ist ein Mitgliedstyp, der innerhalb einer anderen Klasse mit dem Schlüsselwort static deklariert wird. Sie kann zusammen mit dem Namen des umschließenden Typs angegeben werden, etwa als Envelope.Label, und lässt sich instanziieren, ohne zuvor ein Objekt von Envelope zu erstellen. Das ist nützlich, wenn ein Hilfs- oder Wertetyp eng mit einer Klasse verbunden ist und als eigenständiger Typ der obersten Ebene keine sinnvolle Bedeutung hätte.
Der verschachtelte Typ besitzt weiterhin eigene Instanzen. Die Kennzeichnung der verschachtelten Klasse mit static macht ihre Felder oder Methoden nicht zu static. Wie bei einer Klasse der obersten Ebene können Sie der verschachtelten Klasse eigene Konstruktoren, Instanzzustand und Methoden geben.
Beziehung statisch verschachtelter Klassen zu ihrer umschließenden Klasse
Eine verschachtelte Klasse mit static besitzt keine implizite Referenz auf eine Instanz der umschließenden Klasse. Sie kann direkt auf deren Mitglieder mit static zugreifen, einschließlich privater Mitglieder mit static. Auf ein Instanzfeld oder eine Instanzmethode der umschließenden Klasse kann sie nicht direkt zugreifen, da ihr kein umschließendes Objekt zugeordnet ist. Benötigt sie solche Daten, übergeben Sie ihr ein Objekt der umschließenden Klasse an einen Konstruktor oder eine Methode und greifen Sie über diese Referenz auf das Mitglied zu.
Auch die umgekehrte Zugriffsbeziehung ist nützlich: Code der umschließenden Klasse kann mit der verschachtelten Klasse arbeiten, einschließlich ihrer privaten Mitglieder, soweit es die üblichen Zugriffsregeln von Java erlauben. Die Sichtbarkeit private legt fest, welcher Code ein Mitglied benennen darf; sie sollte nicht als Sicherheitsmerkmal beschrieben werden.
Eine statisch verschachtelte Klasse deklarieren und instanziieren
Deklarieren Sie den Typ im Rumpf der umschließenden Klasse mit static class Label. Außerhalb der umschließenden Klasse sprechen Sie ihn als Envelope.Label an. Das folgende vollständige Beispiel hält den verschachtelten Wertetyp bei der Klasse, die ihn verwendet, und erstellt ihn direkt in main:
Der Code sowie die darin angezeigten Bezeichnungen und Ausgaben bleiben auf Englisch.
Führen Sie dieses Beispiel aus:
public class Main {
static class Label {
private final String text;
Label(String text) {
this.text = text;
}
String display() {
return "Label: " + text;
}
}
public static void main(String[] args) {
Label label = new Label("priority");
System.out.println(label.display());
}
}
Label: priority
Da main eine Methode mit static ist, erstellt sie Label, ohne Main zu instanziieren. Code in einer anderen Klasse kann den qualifizierten Namen Main.Label verwenden und einen entsprechend zugänglichen Konstruktor aufrufen. Benötigt eine verschachtelte Klasse Informationen von einem bestimmten umschließenden Objekt, machen Sie diese Abhängigkeit ausdrücklich, indem Sie das Objekt übergeben.
Statisch verschachtelte Klassen und innere Klassen im Vergleich
Eine innere Klasse ist eine Mitgliedsklasse ohne static. Jedes Objekt einer inneren Klasse ist einer Instanz seiner umschließenden Klasse zugeordnet, und der Code der inneren Klasse kann direkt auf die Mitglieder dieser Instanz zugreifen. Um eine solche Klasse außerhalb der umschließenden Klasse zu erstellen, legen Sie zuerst das äußere Objekt an und verwenden Sie dann die Form outer.new Inner(); der innere Typ heißt Outer.Inner.
Eine verschachtelte Klasse mit static hat keine solche Zuordnung. Für ihre Instanziierung ist daher kein umschließendes Objekt nötig: Verwenden Sie außerhalb der Klasse new Outer.Nested() oder, sofern der Name im Gültigkeitsbereich liegt, den Kurznamen. Beide Formen können je nach vorgesehener API private oder public sein und auf private Mitglieder der umschließenden Klasse zugreifen. Der Unterschied liegt in der impliziten Beziehung zu einer umschließenden Instanz, nicht in einer besonderen Sicherheitsstufe.
Wann Sie eine statisch verschachtelte Klasse verwenden sollten
Wählen Sie eine verschachtelte Klasse mit static, wenn der verschachtelte Typ logisch zu seiner umschließenden Klasse gehört, aber jede Instanz ihre Aufgaben ohne ein implizites umschließendes Objekt erledigen kann. Typische Beispiele sind ein kleiner Wertetyp, ein Builder oder ein Hilfstyp, dessen Bedeutung an eine bestimmte umschließende API gebunden ist. Eine verschachtelte Klasse mit static kann Abhängigkeiten weiterhin ausdrücklich entgegennehmen, sodass diese Anforderungen für Aufrufer sichtbar sind.
Wählen Sie eine innere Klasse, wenn jede Instanz mit genau dem umschließenden Objekt arbeiten muss, von dem sie erstellt wurde – etwa wenn sie dessen Instanzzustand lesen oder ändern soll. Hat der Typ eine eigenständige, breit angelegte Aufgabe, lässt er sich als Klasse der obersten Ebene möglicherweise leichter wiederverwenden und finden. Richten Sie die Wahl nach der benötigten Beziehung aus und wählen Sie dann die engste Sichtbarkeit, die den vorgesehenen Einsatz ermöglicht.