Зміст курсу
Java ООП
Java ООП
Принципи ООП: Наслідування
Наслідування
Розглянемо принцип ООП — Наслідування.
Наслідування — це механізм, який дозволяє створювати класи на основі іншого класу.
Клас, який використовується як основа, називається батьківським або суперкласом;
Клас, створений на основі батьківського класу, називається дочірнім, підкласом або нащадком.
Таким чином, дочірній клас може успадковувати характеристики та властивості іншого класу — батьківського класу (його методи та змінні).
Наслідування класу здійснюється за допомогою ключового слова extends
. Синтаксис для дочірнього класу, який наслідує батьківський клас, виглядає так:
Child.java
class Child extends Parent { // properties and methods }
Розглянемо приклад, як працює наслідування в коді. Маємо клас Bird
з певними полями та методами, а також клас Parrot
з власними полями та методами. Папуга є птахом, тому логічно, що папуга має наслідувати клас Bird
:
Ось код із скріншоту, переписаний для кращої читабельності та зрозумілості:
Bird.java
Parrot.java
Main.java
package animals.birds; public class Bird { public String color; public boolean canFly; public int maxAge; public void eat() { System.out.println("The bird is eating"); } public void fly() { if (canFly) { System.out.println("The bird is flying!"); } else { System.out.println("This bird can't fly :("); } } }
Розгляньмо, що відбувається на цих зображеннях:
Ми створюємо клас
Bird
, який у нашому випадку є батьківським класом. Цей клас має власні поля та методи;Ми створюємо клас
Parrot
, який використовує ключове словоextends
для наслідування від батьківського класуBird
. КласParrot
є дочірнім класом і має власні поля та методи. Крім того, як дочірній клас,Parrot
наслідує всі поля та методи батьківського класуBird
;Ми створюємо об'єкт класу
Parrot
у методіmain
і бачимо, що можемо ініціалізувати поля якбатьківського, так і дочірнього класів. Спочатку ініціалізуємо поля батьківського класуBird
, а потім — поля дочірнього класуParrot
. Далі викликаємо методи: спочатку методи батьківського класу, а потім метод дочірнього класу.
Таким чином, ми використали наслідування для успадкування класу Bird
.
Навіщо це потрібно?
Коли у нас є багато різних підкласів Bird
, не лише Parrot
, наприклад, ще Pigeon
та Penguin
. У такому випадку буде багато дубльованих полів, наприклад, boolean canFly
. Перше, чим допомагає наслідування — це уникнення дублювання коду.
Крім того, це суттєво покращує читабельність. На практиці ви рідко зустрічаєте клас Bird
і його підкласи напряму, але наслідування часто використовується, особливо з інтерфейсами.
Note
Про інтерфейси ви дізнаєтеся у наступному розділі цього курсу.
Правила наслідування
Наслідувати можна лише один клас. Java не підтримує множинне наслідування. Один клас може мати лише одного батька;
Наслідується все, крім змінних і методів з модифікатором
private
.
Note
Не можна наслідувати самого себе!
Раніше я згадував, що підклас матиме доступ до всіх змінних і методів батьківського класу. Проте це не зовсім так.
Насправді всі методи й змінні, позначені модифікатором private
, недоступні для підкласу.
Перевизначення методу батьківського класу.
Уявімо, що ми наслідуємо клас, але деякі частини успадкованого коду нам не підходять. Припустимо, ми хочемо, щоб певний метод працював інакше, ніж у батьківському класі.
Щоб перевизначити метод із батьківського класу, потрібно написати @Override
над ним:
Parrot.java
@Override public void eat() { System.out.println("The parrot is eating"); }
У наведеному вище коді ми перевизначили метод батьківського класу, і тепер, коли цей метод викликається з дочірнього класу, буде виконано перевизначений метод!
Запобігання наслідуванню.
Якщо ви не бажаєте, щоб хтось наслідував ваш клас, використовуйте модифікатор final
перед ним.
Наприклад:
Bird.java
Parrot.java
public final class Bird { // fields and methods }
Таким чином, використовуючи ключове слово final
, ми заборонили наслідування класу Bird
.
Це лише основні правила та особливості наслідування. Це об'ємна тема, яку ви будете часто використовувати. Протягом курсу ви ознайомитеся з іншими аспектами наслідування та будете застосовувати їх частіше.
1. Навіщо потрібне наслідування в Java?
2. Скільки класів можна наслідувати одночасно?
3. Як можна запобігти наслідуванню в Java?
Дякуємо за ваш відгук!