Ambele reutilizează un de metodă, dar sunt fundamental diferite. = același nume, , în aceeași clasă, rezolvată la . = o subclasă o metodă părinte cu , rezolvată la .
Ambele reutilizează un de metodă, dar sunt fundamental diferite. = același nume, , în aceeași clasă, rezolvată la . = o subclasă o metodă părinte cu , rezolvată la .
| Supraîncărcarea | Suprascrierea | |
|---|---|---|
| Semnătură | Trebuie să difere (parametri) | Trebuie să fie identică |
| Relație | Aceeași clasă | Clasă părinte ↔ subclasă |
| Rezolvată | Timp de compilare (static) | Runtime (dinamic) |
| Scop | Comoditate / variante | Polimorfism |
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) { /* ... */ }
}
Compilatorul alege care print pe baza tipurilor de argumente — nu este implicată nicio moștenire.
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)
O greșeală frecventă este supraîncărcarea accidentală când ați vrut să suprascrieți (de exemplu o greșeală de scriere în semnătură). Folosiți întotdeauna @Override (Java) sau override (C#) pentru ca compilatorul să o prindă.
Suprascrierea este motorul polimorfismului — mecanismul runtime care face ca „o interfață, mai multe implementări