Принципи ООП: Наслідування
Свайпніть щоб показати меню
Наслідування
Розглянемо принцип ООП — Наслідування.
Наслідування — це механізм, який дозволяє створювати класи на основі іншого класу.
- Клас, який використовується як основа, називається батьківським або суперкласом;
- Клас, створений на основі батьківського класу, називається дочірнім, підкласом або нащадком.
Таким чином, дочірній клас може успадковувати характеристики та властивості іншого класу — батьківського класу (його методи та змінні).
Наслідування класу здійснюється за допомогою ключового слова extends. Синтаксис для дочірнього класу, який наслідує батьківський клас, виглядає так:
Child.java
123class Child extends Parent { // properties and methods }
Розглянемо приклад, як працює наслідування у коді. Маємо клас Bird з певними полями та методами, а також клас Parrot з власними полями та методами. Папуга є птахом, тому логічно, що папуга має наслідувати клас Bird:
Ось код із скріншоту, переписаний для кращої читабельності та зрозумілості:
Bird.java
Parrot.java
Main.java
12345678910111213141516171819package 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
1234@Override public void eat() { System.out.println("The parrot is eating"); }
У наведеному вище коді ми перевизначили метод батьківського класу, і тепер, коли цей метод викликається з дочірнього класу, буде виконано перевизначений метод!
- Запобігання наслідуванню.
Якщо ви не бажаєте, щоб хтось наслідував ваш клас, використовуйте модифікатор final перед ним.
Наприклад:
Bird.java
Parrot.java
123public final class Bird { // fields and methods }
Таким чином, використовуючи ключове слово final, ми заборонили наслідування класу Bird.
Це лише основні правила та особливості наслідування. Це велика тема, яку ви будете використовувати дуже часто. Протягом курсу ви ознайомитеся з іншими аспектами наслідування та будете застосовувати їх частіше.
1. Навіщо потрібне наслідування в Java?
2. Скільки класів можна наслідувати одночасно?
3. Як можна запобігти наслідуванню в Java?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат