Overloading (deutsch: Überladen) bedeutet in der Objektorientierung, dass mehrere Methoden denselben Namen tragen, sich aber durch ihre Parameterliste unterscheiden. Beim objektorientierten Aufruf entscheidet der Compiler anhand von Anzahl und Typ der Argumente, welche Variante gemeint ist.
Warum überhaupt überladen?
Ohne Overloading müsste man für jede Variante einen eigenen Namen erfinden: druckeText, druckeZahl, druckeListe. Mit Overloading bleibt der Methodenname sprechend und die verschiedenen Eingaben werden sauber in einer Klasse gebündelt. Das Ergebnis ist lesbarer, wartbarer Code, weil derselbe Vorgang (Drucken, Initialisieren, Berechnen) auch gleich benannt ist.
Regeln der Signatur
Entscheidend für ein gültiges Overloading ist die Signatur: Methodenname plus Parameterliste. Zwei überladene Methoden müssen sich in Anzahl, Typ oder Reihenfolge der Parameter unterscheiden. Der Rückgabetyp allein reicht als Unterscheidungsmerkmal nicht aus — in Java und C++ ist es deshalb ein Fehler, zwei Methoden mit gleicher Signatur und unterschiedlichem Rückgabetyp zu definieren.
// Java: Overloading in einer Klasse
public void drucken(String text) {
System.out.println("Text: " + text);
}
public void drucken(int zahl) {
System.out.println("Zahl: " + zahl);
}
public void drucken(String text, int wiederholungen) {
for (int i = 0; i < wiederholungen; i++) {
System.out.println(text);
}
}
Auflösung zur Compilezeit
Beim Überladen wird die passende Methode bereits zur Compilezeit festgelegt (statische Bindung). Der Compiler schaut auf die Argumente des Aufrufs und wählt die passende Signatur. Das unterscheidet Overloading vom Overriding (Überschreiben), bei dem die Entscheidung erst zur Laufzeit über die dynamische Bindung fällt. Overloading ist damit eine Form der Polymorphie — allerdings der zur Compilezeit aufgelösten Sorte (Overloading-Polymorphie).
Overloading in Python
Python kennt keine klassischen überladenen Methoden — ein Methodenname kann nur einmal definiert werden. Die Flexibilität wird stattdessen über Default-Parameter, *args und **kwargs erreicht. Eine Funktion prüft dann selbst, welche Argumente sie bekommen hat:
# Python: Overloading-Verhalten über Default-Parameter
def drucken(text, wiederholungen=1):
for _ in range(wiederholungen):
print(text)
drucken("Hallo") # 1x
drucken("Hallo", 3) # 3x
Konstruktor-Overloading
Besonders häufig ist das Überladen von Konstruktoren: Ein Objekt soll auf unterschiedliche Weisen erzeugt werden können — einmal mit allen Daten, einmal mit nur den Pflichtfeldern. In Java und C++ schreibt man dafür mehrere Konstruktoren mit unterschiedlichen Parametern. In Python übernimmt die Aufgabe oft ein Konstruktor mit Default-Werten oder eine separate Klassenmethode (Classmethod) wie from_dict().
Praxis-Tipps
- Overloading erhöht die Lesbarkeit, solange die Varianten wirklich dasselbe Konzept behandeln. Unterschiedliche Semantik bei gleichem Namen verwirrt.
- Zu viele überladene Varianten sind ein Warnsignal — oft löst ein optionales Parameterobjekt das Problem eleganter.
- Vor dem Aufruf prüfen, welche Variante der Compiler wählen würde: Eine
double- und eineint-Variante können bei Ganzzahl-Literalen zu Überraschungen führen.
Overloading gehört zusammen mit Kapselung, Vererbung und Polymorphie zu den Grundwerkzeugen jeder Klasse.