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 mit final oder const.
  • 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.