Klassenvariablen (auch statische Felder oder Klassenattribute) gehören nicht zu einem einzelnen Objekt, sondern zur Klasse selbst. Es gibt genau eine Kopie, die sich alle Objekte teilen — im Gegensatz zur Instanzvariable, die jedes Objekt separat besitzt.
Java: static Felder
In Java markiert static eine Klassenvariable. Man spricht sie über den Klassennamen an, nicht über ein Objekt:
class Konto {
private static int anzahl; // Klassenvariable: ein Wert für alle
private double kontostand; // Instanzvariable: pro Objekt
public Konto(double start) {
kontostand = start;
anzahl++; // Zähler wächst bei jedem neuen Objekt
}
}
Alle Konten teilen sich anzahl — der Zähler zeigt, wie viele Konten insgesamt angelegt wurden.
Python: Klassenattribute
In Python definiert man Klassenattribute direkt im Klassenrumpf:
class Konto:
anzahl = 0 # Klassenvariable
def __init__(self, start):
self.kontostand = start # Instanzvariable
Konto.anzahl += 1
Vorsicht: Eine Zuweisung über self.anzahl = ... erzeugt eine neue Instanzvariable, die das Klassenattribut nur für dieses Objekt verdeckt. Wer das Klassenattribut ändern will, schreibt Konto.anzahl = ....
Typische Einsatzbereiche
- Zähler: Objektanzahl oder Ereignisse klassenweit zählen, zum Beispiel im Konstruktor.
- Konstanten: unveränderliche Werte wie
MAX_LIMIT, oft kombiniert mitfinaloderconst. - Gemeinsame Konfiguration: eine Einstellung, die für alle Objekte gilt.
Klassenvariablen werden häufig von statischen Methoden gelesen und geschrieben — beide Konzepte gehören zur Klasse, nicht zum Objekt.
Abgrenzung und Kapselung
Der Zugriff auf Klassenvariablen folgt denselben Regeln der Sichtbarkeit wie bei Instanzvariablen: privat deklarieren, über Getter und Setter oder statische Methoden zugreifen — das ist Teil der Kapselung.
Pitfall: Nebenläufigkeit
Weil alle Objekte denselben Speicherplatz teilen, ist eine veränderliche Klassenvariable in Multithread-Programmen geteilter, veränderlicher Zustand. Ohne Synchronisation können zwei Threads gleichzeitig schreiben. Für Zähler in objektorientierten Systemen besser atomare Typen oder Synchronisation verwenden.