Załóżmy, że:
- Class1 extends Class2
- Class1 posiada metodę getSomeSting(Long id);
Jak sprawić, żeby podczas tworzenia nowego obiektu Class2 wykorzystywana była implementacja metody
etSomeSting(Long id) z Class2, a nie odziedziczona z Class1?
Załóżmy, że:
- Class1 extends Class2
- Class1 posiada metodę getSomeSting(Long id);
Jak sprawić, żeby podczas tworzenia nowego obiektu Class2 wykorzystywana była implementacja metody
etSomeSting(Long id) z Class2, a nie odziedziczona z Class1?
Uściślijmy:
Class1 - klasa nadrzędna,
Class2 - klasa potomna, dziedzicząca po Class1 (Class2 extends Class1 - myślę, że o to Ci chodziło).
Aby wywołać metodę getSomeSting(Long id) zdefiniowaną w Class2, trzeba ją przysłonić (override). Poniżej przykład takiego kodu:
class Class1 { void getSomeSting(Long id) { System.out.println("Class1"); } } class Class2 extends Class1 { @Override void getSomeSting(Long id) { System.out.println("Class2"); } } public class ClassExample { public static void main(String[] args) { Class1 c1 = new Class2(); Long l1 = new Long(1); c1.getSomeSting(l1); } }
Wynikiem działania programu jest "Class2", pomimo użycia referencji typu Class1 - użycie polimorfizmu. Słowo @Override informuje kompilator, że zamierzamy przysłonić metodę i dokonuje on dodatkowego sprawdzenia, czy metoda przysłaniana faktycznie istnieje i ma poprawne parametry - pozwala to uniknąć literówek i błędów. Jeśli wszystko jest prawidłowo, bez @Override program zachowa się tak samo.
W uzupełnieniu do poprzedniej odpowiedzi:
Jeśli mamy łańcuch dziedziczących po sobie klas, to polimorfizm oznacza możliwość odniesienia się do obiektu potomnego poprzez typ referencji któregoś z typów bazowych (typu przodka lub interfejsu, który implementuje klasa).
Z przesłonięciem (przedefiniowaniem) metody mamy do czynienia, gdy w typie bazowym oraz potomnym znajdują się metody o identycznych sygnaturach (od Javy SE 5 metody mogą różnić się zwracanym typem, tzn. metoda przesłaniająca może zwracać typ bardziej szczegółowy/potomny w stosunku do typu zwracanego przez metodę przesłanianą).
Zachowanie polimorficzne metod powoduje, że wywołanie metody przedefiniowanej na referencji bazowej spowoduje wywołanie tejże metody z klasy potomnej (o ile referencja wskazuje ten typ).
Tak więc: