Oba znovu používají název metody, ale jsou zásadně odlišné. = stejný název, , ve stejné třídě, vyřešeno v . = podtřída metodu rodičovské třídy , vyřešeno v .
Oba znovu používají název metody, ale jsou zásadně odlišné. = stejný název, , ve stejné třídě, vyřešeno v . = podtřída metodu rodičovské třídy , vyřešeno v .
| Přetížení | Přepsání | |
|---|---|---|
| Podpis | Musí se lišit (parametry) | Musí být shodný |
| Vztah | Stejná třída | Rodičovská třída ↔ podtřída |
| Vyřešeno | Čas kompilace (static) | Čas spuštění (dynamic) |
| Účel | Pohodlí / varianty | Polymorfismus |
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) { /* ... */ }
}
Kompilér si vybere, která print na základě typů argumentů — není zapojena žádná dědičnost.
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)
Častou chybou je omylem přetížit když jste chtěli přepsat (např. překlep v podpisu). Vždy používejte @Override (Java) nebo override (C#), aby to kompilátor zachytil.
Přepsání je engine polymorfismu — mechanismus běhu, který umožňuje fungování "jednoho rozhraní, mnoho implementací".
Znalost rozdílu předchází klasické chybě: myšlenka, že jste nahradili chování, když jste ve skutečnosti vytvořili druhou metodu, která se nikdy nevolá.