Obie techniki ponownie wykorzystują metody, ale są fundamentalnie różne. = ta sama nazwa, , w tej samej klasie, rozstrzygane w . = podklasa metodę rodzica z , rozstrzygane w .
Obie techniki ponownie wykorzystują metody, ale są fundamentalnie różne. = ta sama nazwa, , w tej samej klasie, rozstrzygane w . = podklasa metodę rodzica z , rozstrzygane w .
| Przeciążanie | Przesłanianie | |
|---|---|---|
| Sygnatura | Musi się różnić (parametry) | Musi być identyczna |
| Relacja | Ta sama klasa | Klasa nadrzędna ↔ podklasa |
| Rozstrzygane | Czas kompilacji (statycznie) | Czas wykonania (dynamicznie) |
| Cel | Wygoda / warianty | Polimorfizm |
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 wybiera, która print na podstawie typów argumentów — dziedziczenie nie jest zaangażowane.
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)
Częsty błąd to przypadkowe przeciążanie, gdy chciałeś przesłonić (np. literówka w sygnaturze). Zawsze używaj @Override (Java) lub override (C#), aby kompilator to złapał.
Przesłanianie jest motorem polimorfizmu — mechanizmem czasu wykonania, który powoduje, że "jeden interfejs, wiele implementacji" działa.
Znajomość różnicy zapobiega klasycznemu błędowi: myśleniu, że zastąpiłeś zachowanie, gdy faktycznie stworzyłeś drugą, nigdy nie wywoływaną metodę.