1. Але це ще не все
Припустімо, у класі Cow
є метод printAll()
, який викликає два інші методи. Тоді код працюватиме так:
Код | Опис |
---|---|
|
|
|
На екран буде виведено напис:
|
Зверніть увагу: коли для об'єкта типу Whale
викликається метод printAll()
, успадкований від класу Cow
, використовується метод printName
класу Whale
, а не класу Cow
.
Неважливо, в якому класі створено метод, головне — до якого класу належить об'єкт (тобто тип об'єкта), для якого цей метод викликано.
Успадковувати й перевизначати можна тільки нестатичні методи. Статичні методи не успадковуються і тому не перевизначаються.
Отакий вигляд має клас Whale
після успадкування та застосування перевизначення методів:
|
Отакий вигляд має клас Whale після успадкування та застосування перевизначення методу. Ні про який старий метод printName ми навіть і не знаємо. |
2. Перетворення типів
Є ще один дуже цікавий момент. Оскільки під час успадкування клас отримує всі методи й дані батьківського класу, об'єкт цього класу можна присвоювати (зберігати) змінним батьківського класу (а також змінним батька батьківського класу і т. д. аж до Object
). Приклад:
Код | Опис |
---|---|
|
На екран буде виведено напис:
|
|
На екран буде виведено напис:
|
|
На екран буде виведено напис:
Метод toString() успадковано від класу Object
|
Це дуже цінна властивість, і згодом ми пояснимо, як це використовувати на практиці.
3. Виклик методу об'єкта
Коли здійснюється виклик методу для змінної, фактично цей метод викликається для об'єкта. Цей механізм називається динамічною диспетчеризацією методів.
Отакий вигляд це має:
Код | Опис |
---|---|
|
На екран буде виведено напис:
|
|
На екран буде виведено напис:
|
Зверніть увагу, що тип змінної не впливає на те, який саме метод printName()
— класу Cow
чи класу Whale
— буде викликано: вибір методу визначається не типом змінної, а типом об'єкта, на який посилається ця змінна.
У змінній типу Cow
збережено посилання на об'єкт типу Whale
, і буде викликано метод printName()
, який описано в класі Whale
.
Це не відразу зрозуміло. Запам'ятайте головне правило:
Набір методів, які можна викликати для змінної, визначається типом змінної. А який саме метод чи яку його реалізацію буде викликано, визначається типом (класом) об'єкта, посилання на який зберігає змінна.
Ви будете постійно стикатися з цим, тож що раніше все це запам'ятаєте, то краще.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ