Beide hergebruiken een method , maar ze zijn fundamenteel verschillend. = dezelfde naam, , in dezelfde klasse, opgelost bij . = een subklasse een parent method met dezelfde , opgelost bij .
Beide hergebruiken een method , maar ze zijn fundamenteel verschillend. = dezelfde naam, , in dezelfde klasse, opgelost bij . = een subklasse een parent method met dezelfde , opgelost bij .
| Overloading | Overriding | |
|---|---|---|
| Signature | Moet verschillend zijn (params) | Moet identiek zijn |
| Relatie | Dezelfde klasse | Parent ↔ subklasse |
| Opgelost | Compile time (statisch) | Runtime (dynamisch) |
| Doel | Gemak / varianten | Polymorfisme |
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) { /* ... */ }
}
De compiler kiest welke print op basis van argument types — geen erfenis betrokken.
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)
Een veelgemaakte fout is per ongeluk overloading wanneer je override bedoelde (bijv. een typefout in de signature). Gebruik altijd @Override (Java) of override (C#) zodat de compiler het opvangt.
Overriding is de motor van polymorfisme — het runtime mechanisme dat "één interface, veel implementaties" mogelijk maakt.
Het verschil kennen voorkomt een klassieke bug: denken dat je gedrag hebt vervangen terwijl je eigenlijk een tweede, nooit-aangeroepen method hebt gemaakt.