Beide verwenden einen Methodennamen , sind aber grundlegend unterschiedlich. = gleicher Name, , in derselben Klasse, aufgelöst zur . = eine Subklasse eine Parent-Methode mit der , aufgelöst zur .
Beide verwenden einen Methodennamen , sind aber grundlegend unterschiedlich. = gleicher Name, , in derselben Klasse, aufgelöst zur . = eine Subklasse eine Parent-Methode mit der , aufgelöst zur .
| Überladung | Überschreibung | |
|---|---|---|
| Signatur | Muss unterschiedlich sein (Parameter) | Muss identisch sein |
| Beziehung | Gleiche Klasse | Parent ↔ Subklasse |
| Aufgelöst | Kompilierungszeit (static) | Laufzeit (dynamic) |
| Zweck | Bequemlichkeit / Varianten | Polymorphismus |
class Printer {
void print(String s) { System.out.println(s); }
void print(int n) { System.out.println(n); } // same name, diff param
void print(String s, int times) { /* ... */ }
}
Der Compiler wählt basierend auf Argumenttypen, welche print — keine Vererbung beteiligt.
class Animal { String speak() { return "..."; } }
class Dog extends Animal {
@Override
String speak() { return "Woof"; } // replaces Animal.speak()
}
Animal a = new Dog();
a.speak(); // "Woof" — runtime picks Dog's version (dynamic dispatch)
Ein häufiger Fehler ist versehentliches Überladen, wenn Sie Überschreiben wollten (z. B. ein Tippfehler in der Signatur). Verwenden Sie immer @Override (Java) oder override (C#), damit der Compiler es abfängt.
Überschreibung ist die Engine von Polymorphismus — der Laufzeitmechanismus, der "eine Schnittstelle, viele Implementierungen" möglich macht.
Den Unterschied zu kennen verhindert einen klassischen Bug: zu denken, dass Sie Verhalten ersetzt haben, während Sie tatsächlich eine zweite, niemals aufgerufene Methode erstellt haben.