Oba ponovno koriste ime metode, ali su temeljno drugačija. = isto ime, , u istoj klasi, razriješeno u . = podklasa nadredenu metodu s , razriješeno u .
Oba ponovno koriste ime metode, ali su temeljno drugačija. = isto ime, , u istoj klasi, razriješeno u . = podklasa nadredenu metodu s , razriješeno u .
| Preopterećenje | Nadjačavanje | |
|---|---|---|
| Signatura | Mora biti različita (params) | Mora biti identična |
| Odnos | Ista klasa | Nadredena ↔ podklasa |
| Razriješeno | Vrijeme kompilacije (statičko) | Vrijeme izvođenja (dinamičko) |
| Svrha | Pogodnost / varijante | Polimorfizam |
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) { /* ... */ }
}
Kompilator bira koju print na osnovu tipova argumenata — nikakva nasljeđivanja uključena.
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)
Česta greška je slučajno preopterećenje kada ste htjeli nadjačati (npr. tipfelera u signaturi). Uvijek koristite @Override (Java) ili override (C#) kako bi kompilator to uhvatio.
Nadjačavanje je motor polimorfizma — mehanizam izvođenja koji čini "jedan sučelje, više implementacija" mogućim.
Znanje razlike sprječava klasičnu grešku: mišljenje da ste promijenili ponašanje kada ste zapravo stvorili drugu, nikada pozivanu metodu.