Të dyja ripërdorin një metode, por ato janë thelbësisht të ndryshme. = emër i njëjtë, , në të njëjtën klasë, zgjidhur në . = një nënklasë një metodë të prindërit me të , zgjidhur në .
Të dyja ripërdorin një metode, por ato janë thelbësisht të ndryshme. = emër i njëjtë, , në të njëjtën klasë, zgjidhur në . = një nënklasë një metodë të prindërit me të , zgjidhur në .
| Mbivendosja | Zëvendësimi | |
|---|---|---|
| Nënshkrim | Duhet të jetë i ndryshëm (parametra) | Duhet të jetë identik |
| Marrëdhënie | Klasa e njëjtë | Prind ↔ nënklasë |
| Zgjidhur | Koha e kompilimit (statik) | Koha e ekzekutimit (dinamik) |
| Synim | Përshndeshje / variacione | Polimorfizmi |
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) { /* ... */ }
}
Kompajleri zgjedh se cili print bazuar në llojet e argumenteve — pa trashëgimë.
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)
Një gabim i shpeshtë është mbivendosja e rastësishme kur synoje të zëvendësosh (p.sh. një gabim shënimi në nënshkrim). Gjithmonë përdor @Override (Java) ose override (C#) në mënyrë që kompajleri ta kapë atë.
Zëvendësimi është motori i polimorfizmit — mekanizmi i kohës së ekzekutimit që e bën "një ndërfaqe, shumë zëvendësime" të funksionojnë.
Shpja e dallesës parandalon një gabim klasik: të menduarit se zëvendësove sjelljen kur në fakt krijove një metodë të dytë, kurrë të mos të thirret.