Inheritance дозволяє одному класу набувати властивостей (полів) та поведінки (методів) іншого класу. Це сприяє повторному використанню коду (code reusability), перевизначенню методів (method overriding) і дозволяє реалізувати поліморфізм (polymorphism).
✅ 1. Опис спадкування та його переваги
🔑 Визначення:
- Спадкування — це механізм, за якого один клас набирає поля та методи від іншого класу за допомогою ключового слова
extends
.
🛠️ Синтаксис:
class Parent {
void display() {
System.out.println("Метод класу батька");
}
}
class Child extends Parent {
void show() {
System.out.println("Метод класу нащадка");
}
}
🚀 Переваги спадкування:
- Повторне використання коду (Code Reusability): Уникається переписування загальних функціональностей.
- Перевизначення методів (Method Overriding): Дозволяє нащадковим класам надавати специфічну реалізацію методів батьківського класу.
- Поліморфізм (Polymorphism): Посилання на батьківський клас може вказувати на об'єкт нащадка.
- Покращене обслуговування (Improved Maintainability): Централізоване керування кодом.
✅ 2. Поліморфізм і перевизначення методів
🔑 Поліморфізм:
- Це здатність об'єкта набувати різних форм.
- Посилання на батьківський клас може вказувати на об'єкт нащадка.
🛠️ Приклад:
class Animal {
void sound() {
System.out.println("Звук тварини");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Собака лає");
}
}public class Test {
public static void main(String[] args) {
Animal animal = new Dog(); // Поліморфізм
animal.sound(); // Виведе: Собака лає
}
}
🔑 Правила перевизначення методів:
- Підпис методу має збігатися (Method Signature Must Match): Однакове ім'я, параметри та тип повернення.
- Модифікатор доступу (Access Modifier): Не можна зменшувати видимість (наприклад,
public
не може статиprivate
). - Перевірені винятки (Checked Exceptions): Не можна кидати більш загальні винятки.
✅ 3. Тип посилання та тип об'єкта
- Тип посилання (Reference Type): Визначається типом змінної (наприклад,
Animal animal
). - Тип об'єкта (Object Type): Визначається типом об'єкта, створеного через
new
(наприклад,new Dog()
).
🛠️ Приклад:
Animal animal = new Dog();
System.out.println(animal instanceof Dog); // true
System.out.println(animal instanceof Animal); // true
🚀 Основні висновки:
- Тип посилання (Reference Type): Визначає, які методи доступні під час компіляції.
- Тип об'єкта (Object Type): Визначає, яка реалізація буде виконана під час виконання.
✅ 4. Визначення, коли необхідно використовувати приведення типів
🔑 Типи приведення:
- Підвищення типу (Upcasting, неявне): Дитина → Батько (завжди безпечне).
- Зниження типу (Downcasting, явне): Батько → Дитина (потрібне явне приведення, може бути ризикованим).
🛠️ Приклад:
Animal animal = new Dog(); // Підвищення типу (Upcasting, неявне)
// Зниження типу (Downcasting, явне)
Dog dog = (Dog) animal;
dog.sound();
⚠️ Обережність при зниженні типу:
Якщо об'єкт не є об'єктом цільового типу, виникає ClassCastException:
Animal animal = new Animal();
Dog dog = (Dog) animal; // Викине ClassCastException
✅ 5. Використання super
і this
🔑 super: Посилається на батьківський клас.
- Доступ до методів батьківського класу або конструкторів.
🛠️ Приклад:
class Parent {
Parent() {
System.out.println("Конструктор батьківського класу");
}
}
class Child extends Parent {
Child() {
super(); // Викликає конструктор батьківського класу
System.out.println("Конструктор класу нащадка");
}
}
🔑 this: Посилається на поточний об'єкт.
- Доступ до полів поточного класу або конструкторів.
🛠️ Приклад:
class Example {
int value;
Example(int value) {
this.value = value; // Посилається на значення поточного об'єкта
}
}
Абстрактні класи та інтерфейси
## 🔑 Абстрактний клас:
- Не може бути інстанційований.
- Може містити **абстрактні методи** (без реалізації) та **конкретні методи**.
## 🛠️ Приклад:
abstract class Shape {
abstract void draw();
void info() {
System.out.println("Клас Shape");
}
}
```
class Circle extends Shape {
void draw() {
System.out.println("Малювання кола");
}
}
🔑 Інтерфейс:
- Визначає контракт для класів.
- Усі методи за замовчуванням є public та abstract.
- Підтримує множе спадкування.
🛠️ Приклад:
interface Drawable {
void draw();
}
class Circle implements Drawable {
public void draw() {
System.out.println("Малювання кола");
}
}
🚀 Абстрактний клас vs Інтерфейс:
Абстрактний клас Інтерфейс Може містити як абстрактні, так і конкретні методи. Тільки абстрактні методи (Java 8+ дозволяє default/static). Підтримує одиничне спадкування. Підтримує множе спадкування. Може містити конструктори. Не може містити конструктори.
Перекладено з: 📚 Working with Inheritance — Java