Geschichte der Frage:
Seit dem Anfang gibt es in Java das Konzept der statischen Klassenmitglieder, die sich von Instanzmitgliedern unterscheiden — solche Variablen werden auf Klassenebene und nicht auf Objekt-Ebene gespeichert. Dies ermöglicht es, Daten zwischen allen Instanzen einer Klasse zu teilen oder Konstanten und Dienststrukturen zu verwenden.
Problem:
Die Hauptaufgabe von statischen Feldern besteht darin, Daten für alle Objekte der Klasse bereitzustellen oder einen einzigen Zugangspunkt zu implementieren. Doch der falsche Umgang mit static kann zu schwer fassbaren Fehlern führen, die mit dem globalen Zustand, Datenrennen und Testproblemen verbunden sind.
Lösung:
Statische Felder werden mit dem Schlüsselwort static deklariert:
public class Counter { public static int globalCount = 0; public Counter() { globalCount++; } }
Bei jeder Erstellung einer Instanz erhöht sich der Zähler, und der Wert ist über Counter.globalCount zugänglich, unabhängig vom Objekt.
Schlüsselfunktionen:
Kann man auf ein statisches Feld über ein Objekt anstatt über den Klassennamen zugreifen?
Ja, die Syntax erlaubt den Zugriff auf ein statisches Feld über ein Objekt, jedoch führt dies zu unlesbarem und manchmal verwirrendem Code. Es ist besser, immer über den Klassennamen zuzugreifen.
Counter c = new Counter(); System.out.println(c.globalCount); // Funktioniert, wird aber nicht empfohlen
Können statische Felder privat sein?
Ja, der Zugriffslevel ist nicht eingeschränkt. Private statische Felder werden häufig zusammen mit öffentlichen statischen Methoden verwendet (zum Beispiel für Singleton):
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
Was passiert, wenn man versucht, ein statisches Feld mit einem Wert zu initialisieren, der von einem nicht-statischen abhängt?
Dieser Code wird nicht kompiliert, da nicht-statische Felder nach den statischen initialisiert werden. Ein statisches Feld kann nicht direkt auf ein nicht-statisches verweisen.
In großen Anwendungen wird ein static Feld zur Speicherung von zwischengespeicherten Daten verwendet, die nutzerspezifisch sind.
Vorteile:
Nachteile:
Verwendung von public static final String zur Speicherung von Konstanten (zum Beispiel Fehlercodes oder Standardparameter).
Vorteile:
Nachteile: