1. Но това не е всичко.
Да предположим, че Cow
класът има printAll()
метод, който извиква два други метода. Тогава codeът ще работи така:
Код | Описание |
---|---|
|
|
|
Изходът на екрана ще бъде:
|
Имайте предвид, че когато printAll()
методът в Cow
класа се извиква на Whale
обект, се използва printName
методът наWhale
класа, а не този в Cow
метода.
Основното нещо не е класът, в който е написан методът, а по-скоро типът (класът) на обекта, на който се извиква методът.
Само нестатичните методи могат да бъдат наследени и заменени. Статичните методи не се наследяват и следователно не могат да бъдат заменени.
Ето How Whale
изглежда класът след прилагане на наследяване и замяна на метода:
|
Ето How Whale изглежда класът след прилагане на наследяване и замяна на метода: Не знаем за нито един стар printName метод. |
2. Преобразуване на типове
Тук има още по-интересен момент. Тъй като класът наследява всички методи и данни на своя родителски клас, препратката към обект на дъщерния клас може да се съхранява в (присвоени на) променливи, чийто тип е същият като родителския клас (и родителя на родителя и т.н. — чак до Object
класа). Пример:
Код | Описание |
---|---|
|
Изходът на екрана ще бъде:
|
|
Изходът на екрана ще бъде:
|
|
Изходът на екрана ще бъде:
Методът toString() е наследен от Object класа |
Това е много ценно свойство: малко по-късно ще разберете How да го използвате на практика.
3. Извикване на метод на обект
Когато метод се извиква на променлива, методът всъщност се извиква на обект. Този механизъм се нарича изпращане на динамичен метод.
Ето How изглежда:
Код | Описание |
---|---|
|
Изходът на екрана ще бъде:
|
|
Изходът на екрана ще бъде:
|
Обърнете внимание, че конкретната реализация на printName()
метода, който се извиква - този в Cow
or този в Whale
класа - не се определя от типа на променливата, а от типа на обекта, към който се отнася променливата.
Променливата Cow
съхранява препратка към Whale
обект, а printName()
методът, дефиниран в Whale
класа, е това, което се извиква.
Това не е много очевидно. Запомнете основното правило:
Наборът от методи, налични за извикване на променлива, се определя от типа на променливата. И конкретната реализация на метода, която се извиква, се определя от типа/класа на обекта, към който се отнася променливата.
Ще се сблъсквате с това през цялото време, така че колкото по-рано си спомните това, толкова по-добре.
GO TO FULL VERSION