Eine statische Methode gehört zur Klasse selbst, nicht zu einer einzelnen Instanz. Man ruft sie über den Klassennamen auf, ohne vorher ein Objekt zu erzeugen.
Einfaches Beispiel (Java)
public class MathUtil {
public static double quadrat(double x) {
return x * x;
}
}
// Aufruf ohne new:
double ergebnis = MathUtil.quadrat(3.0);
Das Schlüsselwort static markiert die Methode als klassenbezogen. Sie kann keine Instanzvariablen lesen oder schreiben, weil kein Objekt existiert, auf das sie sich beziehen könnte — folglich gibt es in ihr auch kein this (siehe this / self).
Python: staticmethod und classmethod
Python unterscheidet zwei Varianten:
class Converter:
@staticmethod
def km_in_meilen(km):
return km * 0.621371
@classmethod
def aus_kilometer(cls, km):
instanz = cls()
instanz._wert = km
return instanz
@staticmethod: eine normale Funktion innerhalb der Klasse, ohne Zugriff auf die Klasse oder Instanz.@classmethod: bekommt die Klasse selbst als ersten Parameter (cls) übergeben. Damit kann sie neue Instanzen erzeugen — ein klassisches Muster für Factory-Methoden wiefrom_json()oderaus_kilometer().
Typische Einsatzfelder
- Utility-Funktionen: mathematische Helfer, Formatierungen, Umrechnungen ohne eigenen Zustand (z.B.
Math.sqrtin Java/C#). - Factory-Methoden: benannte Alternativen zum Konstruktor, besonders als
@classmethodin Python. - Singleton-Zugriff: kombiniert mit einem
private-Konstruktor (Kapselung der Kapselung-Logik), damit nur die statische Methode die eine Instanz liefert. - Klassenweite Zähler oder Konstanten: Werte, die nicht an ein einzelnes Objekt gebunden sind.
Abgrenzung zur Instanzmethode
Eine Instanzmethode bekommt die Referenz auf das eigene Objekt (in Python self, in Java/C++ implizit this) und darf dessen Zustand lesen und verändern. Eine statische Methode hat diese Referenz nicht — sie kann nur mit ihren Parametern und klassenweiten Werten arbeiten. Statische Methoden unterstützen Overloading (mehrere Varianten mit unterschiedlicher Parameterliste), aber kein echtes Overriding: Sie hängen an der Klasse, nicht am Objekt, daher greift keine dynamische Bindung.
Pitfalls
- Schwer testbar: Statische Methoden lassen sich beim Testen schwer isolieren oder ersetzen; Abhängigkeiten nimmt man besser per Dependency Injection in die Klasse.
- Versteckter globaler Zustand: Eine statische Variable, die von vielen Stellen verändert wird, ist im Grunde eine versteckte Globalvariable.
- Zu viel static: Wenn fast alle Methoden statisch sind, arbeitet man objektorientiert an der Objektorientierung vorbei — dann ist eine modulare Funktionssammlung oft ehrlicher.
Verwandte Grundlagen: Methode, Getter und Setter.