Czesc, czytalem lekcje o polimorfizmie z kursu JavaStart i wg mnie tam jest blad (w zalaczniku zaznaczony tekst jest bledny czy tylko tak mi sie wydaje)? Przeciez "Przypisując obiekt B do referencji typu A mamy dostęp tylko to metod, które znajdują się w typie referencji, w tym przypadku interfejsu A." Jakim cudem mamy dostęp "tylko to metod, które znajdują się w typie referencji, w tym przypadku interfejsu A." jezeli po wczesniejszym przypisaniu obiektu B do referencji typu A mam normalnie dostep...? Prosze o rozjasnienie, wytlumaczenie, dzieki.
Czy chodzi o to, ze przypisujac dany obiekt do danej referencji wtedy sie tworzy integralna calosc czy jak?
W Javie metody wywoływane są zgodnie z rzeczywistym typem obiektu na rzecz którego są wołane, a NIE zgodnie z typem deklarowanym.
class B extends A {...}
A a = new B();
Klasa A jest typem referencji, a klasa B jest typem faktycznym. Załóżmy, że chcemy wywołać jakąś metodę np.:
a.doSomething(); // wywołanie polimorficzne metody doSomething()
Jest ona zaimplementowana w klasie A oraz przesłonięta w klasie B. Wówczas JVM sprawdza tą metodę pod kątem faktycznego typu obiektu - sprawdza czy występuje ona w klasie B. Jeśli tak, wywołuje ją. "Zjawisko" to jest nazywane polimorfizmem. Jeśli nie (nie została zaimplementowana w klasie B), wywołuje ją z klasy A - w tym przypadku "nie zachodzi" polimorfizm.
Odpowiadając na pytanie też mi się wydaje, że tam jest błąd.
Jeśli dobrze rozumiem to chyba chodzi o to że jak mamy interface A i klase B która implentuje A jak przypiszemy A a = new B(); to bez rzutowania w dół możemy wykonać tylko metody z interface A :)
Tak jak masz właśnie
List<Object> list = new LinkedList<>();
to możesz z referencji list wywołać tylko metody które są w interfejscie a nie możesz bez rzutowania wykonać tych dodatkowych :)
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.