📚 Робота з наслідуванням — Java

Inheritance дозволяє одному класу набувати властивостей (полів) та поведінки (методів) іншого класу. Це сприяє повторному використанню коду (code reusability), перевизначенню методів (method overriding) і дозволяє реалізувати поліморфізм (polymorphism).

✅ 1. Опис спадкування та його переваги

🔑 Визначення:

  • Спадкування — це механізм, за якого один клас набирає поля та методи від іншого класу за допомогою ключового слова extends.

🛠️ Синтаксис:

class Parent {  
 void display() {  
 System.out.println("Метод класу батька");  
 }  
}
class Child extends Parent {  
 void show() {  
 System.out.println("Метод класу нащадка");  
 }  
}

🚀 Переваги спадкування:

  1. Повторне використання коду (Code Reusability): Уникається переписування загальних функціональностей.
  2. Перевизначення методів (Method Overriding): Дозволяє нащадковим класам надавати специфічну реалізацію методів батьківського класу.
  3. Поліморфізм (Polymorphism): Посилання на батьківський клас може вказувати на об'єкт нащадка.
  4. Покращене обслуговування (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(); // Виведе: Собака лає  
 }  
}

🔑 Правила перевизначення методів:

  1. Підпис методу має збігатися (Method Signature Must Match): Однакове ім'я, параметри та тип повернення.
  2. Модифікатор доступу (Access Modifier): Не можна зменшувати видимість (наприклад, public не може стати private).
  3. Перевірені винятки (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

Leave a Reply

Your email address will not be published. Required fields are marked *