Nadpisywanie metod (overriding) to mechanizm OOP, w którym podklasa dostarcza własną implementację metody, która już została zdefiniowana w jej superklasie. Metoda w podklasie musi mieć analogiczną nazwę, parametry i typ zwracanej wartości (lub być jej podtypem).
Kluczowe zasady:
@Override pomaga wykryć błędy na etapie kompilacji.Przykład:
class Animal { public void sound() { System.out.println("Some sound"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Woof"); } }
Pytanie: "Czy można nadpisać metodę statyczną w Javie?"
Odpowiedź: Nie, metod statycznych nie można nadpisać. Są one ukrywane (method hiding). Jeśli zadeklarujesz metodę statyczną o takiej samej sygnaturze w podklasie, będzie miało miejsce ukrycie, a nie nadpisanie.
Przykład:
class A { static void print() { System.out.println("A"); } } class B extends A { static void print() { System.out.println("B"); } } A obj = new B(); obj.print(); // wypisze "A"
Historia
W projekcie jeden z programistów próbował "nadpisać" metodę statyczną w klasie dziedziczącej, oczekując, że zostanie wywołana wersja z podklasy przez referencję superklasy. Doprowadziło to do nieoczekiwanych rezultatów: wywoływana była metoda superklasy, przez co program działał nieprawidłowo.
Historia
Ważne jest użycie adnotacji
@Override. W jednym projekcie programista popełnił błąd w nazwie metody przy nadpisywaniu, a bez adnotacji kompilator nie zgłosił błędu. W rezultacie według schematu dziedziczenia wywoływana była metoda klasy bazowej (domyślnie), co spowodowało nieprawidłową logikę w procesach biznesowych.
Historia
Nadpisywanie checked- wyjątki: programista dodał do nadpisanej metody wyrzucanie nowego checked- wyjątku, który nie był zadeklarowany w pierwotnej sygnaturze. Kod skompilował się z błędem i konieczne było zmienienie architektury, ponieważ narusza to zasady nadpisywania wyjątków.