HOWTO · Java
Statische Klasse in Java
In diesem Artikel werden statische Java-Klassen vorgestellt.
Auf dieser Seite
In Java darf eine Klasse der obersten Ebene nicht als static deklariert werden. Eine Klasse innerhalb einer anderen Klasse kann static sein; sie ist dann eine statische verschachtelte Klasse. Sie lässt sich ohne eine Instanz der umschließenden Klasse instanziieren und kann auf deren statische Member zugreifen. Wenn Sie eine Utility-Klasse entwerfen möchten, die Aufrufer über ihre öffentliche API nicht instanziieren können, verwenden Sie stattdessen einen privaten Konstruktor. Das ist ein separates Entwurfsmuster.
Was ist eine statische verschachtelte Klasse in Java?
Eine statische verschachtelte Klasse ist ein Member-Typ, der mit dem Schlüsselwort static innerhalb einer anderen Klasse deklariert wird. Der Modifizierer static bedeutet, dass eine Instanz der verschachtelten Klasse keine implizite Referenz auf ein Objekt der umschließenden Klasse hat. Das bedeutet nicht, dass die verschachtelte Klasse selbst nicht instanziiert werden kann. Auf ihren Typ greifen Sie über den Typ der umschließenden Klasse zu, zum Beispiel über Container.Entry; eine Instanzmethode wird auf einer Instanz dieses verschachtelten Typs aufgerufen.
Eine statische verschachtelte Klasse kann auf statische Member ihrer umschließenden Klasse zugreifen, auch auf private Member. Sie kann nicht so auf Felder oder Methoden einer Instanz der umschließenden Klasse verweisen, als stünde ihr dieses Objekt implizit zur Verfügung. Das ist möglich, wenn ihr ein Objekt der umschließenden Klasse explizit übergeben wird.
Eine statische verschachtelte Klasse deklarieren und verwenden
Deklarieren Sie die Member-Klasse mit static und verwenden Sie zum Erzeugen den Namen des Typs der umschließenden Klasse. Das vollständige Beispiel zeigt außerdem den Zugriff auf ein statisches Feld der umschließenden Klasse:
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
public class Container {
private static int count = 3;
public static class Entry {
public int value() {
return count;
}
}
public static void main(String[] args) {
Container.Entry entry = new Container.Entry();
System.out.println(entry.value());
}
}
3
Beim Ausführen des Beispiels wird 3 ausgegeben. Wenn Sie es anpassen, muss die verschachtelte Klasse innerhalb der umschließenden Klasse bleiben. Außerhalb von Container geben Sie ihren Typ als Container.Entry an. Das Objekt Entry ist eine gewöhnliche Instanz; count gehört dagegen zur umschließenden Klasse selbst.
Statische verschachtelte Klasse und innere Klasse im Vergleich
Eine nicht statische Member-Klasse wird häufig als innere Klasse bezeichnet. Um eine solche Klasse zu erzeugen, benötigen Sie eine Instanz der umschließenden Klasse: Erstellen Sie ein Container-Objekt und verwenden Sie anschließend container.new Inner(). Eine Instanz der inneren Klasse kann direkt auf die Instanz-Member des umschließenden Objekts zugreifen, weil sie mit diesem Objekt verknüpft ist.
Eine statische verschachtelte Klasse hat keine solche implizite Verknüpfung. Um ein Instanzfeld der umschließenden Klasse zu lesen, übergeben oder beschaffen Sie ein Container-Objekt und greifen über diese Referenz auf das Feld zu. Beide Arten verschachtelter Klassen können auf Member zugreifen, die nach den Java-Regeln für verschachtelte Typen zugänglich sind. Der entscheidende Unterschied ist, ob eine Instanz der umschließenden Klasse automatisch verfügbar ist.
Eine Utility-Klasse erstellen, die nicht instanziiert werden kann
Eine Utility-Klasse bündelt Operationen oder Konstanten, die keinen objektspezifischen Zustand benötigen. Legen Sie diese Member in einer gewöhnlichen Klasse der obersten Ebene ab, markieren Sie die entsprechenden Member als static und fügen Sie einen private-Konstruktor hinzu. So können gewöhnliche Aufrufer außerhalb der Klasse nicht new verwenden. Das Muster sieht zum Beispiel so aus: public final class TextTools { private TextTools() {} public static String join(String first, String second) { return first + second; } }; der Aufruf lautet TextTools.join("static ", "utility").
Der private Konstruktor verhindert die gewöhnliche Instanziierung von außerhalb, macht TextTools aber nicht zu einer statischen Klasse: In Java gibt es keine statischen Klassen der obersten Ebene. Die Deklaration der Klasse als final ist optional und verhindert lediglich, dass sie erweitert wird. Verwenden Sie sie, wenn diese Einschränkung zum Entwurf gehört, nicht als Voraussetzung für Utility-Methoden.
Häufige Missverständnisse über statische Klassen
Eine statische verschachtelte Klasse kann instanziiert werden; static hebt lediglich die implizite Anforderung einer Instanz der umschließenden Klasse auf. Ihre Instanzmethoden können auf ihre eigenen Instanzfelder zugreifen. Der Name der umschließenden Klasse qualifiziert den verschachtelten Typ; für den Aufruf seiner Instanzmethoden benötigen Sie weiterhin ein Objekt dieses verschachtelten Typs.
Ein statischer Kontext kann nicht über einen unqualifizierten Namen auf ein Instanz-Member der umschließenden Klasse zugreifen, weil nicht automatisch ein Objekt dieser Klasse verfügbar ist. Über eine explizite Objektreferenz ist der Zugriff möglich. Ebenso verhindert ein privater Utility-Konstruktor gewöhnliche Aufrufe von außerhalb der Klasse, macht die Instanziierung aber nicht unter allen Umständen unmöglich. Diese Unterschiede trennen die Syntax für verschachtelte Klassen in Java vom Utility-Class-Muster.