Абстрактні класи. Ієрархія успадкування та перетворення типів
Абстрактні класи та ієрархія успадкування разом із перетворенням типів є важливими концепціями об’єктно-орієнтованого програмування в Java. Абстрактні класи – курси програмування java для дітей. Вони надають гнучкі можливості для створення ієрархій класів і забезпечення поліморфізму.
1. Абстрактні класи
Абстрактний клас — це клас, який не можна створити напряму, тобто не можна створити його об’єкт. Він призначений для того, щоб бути базовим класом для інших класів. Абстрактні класи можуть містити як звичайні (реалізовані) методи, так і **абстрактні методи**, які не мають реалізації і мають бути реалізовані в дочірніх класах.
Основні моменти про абстрактні класи:
1. Оголошення абстрактного класу:
- Ключове слово `abstract` використовується для оголошення класу абстрактним.
- Абстрактні класи можуть містити як абстрактні методи, так і звичайні методи з реалізацією.
Приклад абстрактного класу:
public abstract class Animal {
// Абстрактний метод, який потрібно реалізувати в дочірніх класах
public abstract void makeSound();
// Звичайний метод з реалізацією
public void sleep() {
System.out.println(“Animal is sleeping”);
}
}
“`
2. Абстрактні методи:
Абстрактний метод — це метод без реалізації, який оголошується за допомогою ключового слова abstract. Його реалізація повинна бути надана в дочірньому класі.
Приклад реалізації абстрактного методу в дочірньому класі:
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println(“Dog barks”);
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // Виведе “Dog barks”
dog.sleep(); // Виведе “Animal is sleeping”, метод з базового класу
}
}
“`
3. Правила для абстрактних класів:
- Абстрактний клас не можна інстанціювати, тобто не можна створити його об’єкт:
Animal animal = new Animal(); // Помилка
- Якщо клас містить хоча б один абстрактний метод, сам клас має бути оголошений абстрактним.
- Абстрактні методи реалізуються в дочірніх класах, які не є абстрактними.
2. Ієрархія успадкування
Ієрархія успадкування — це структура, в якій класи наслідуються один від одного, утворюючи дерево класів. Кожен дочірній клас може успадковувати методи та поля від свого батьківського класу, а також перевизначати їх для додавання своєї специфічної поведінки.
Основні моменти:
1. Базовий клас:
- Це клас, від якого успадковуються інші класи. Він містить загальні характеристики та поведінку для всіх дочірніх класів.
Приклад базового класу:
public class Animal {
public void makeSound() {
System.out.println(“Animal makes a sound”);
}
}
2. Дочірні класи:
- Це класи, які успадковують базовий клас і можуть додавати свою специфічну поведінку або змінювати (перевизначати) існуючі методи.
Приклад ієрархії:
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println(“Dog barks”);
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println(“Cat meows”);
}
}
3. Поліморфізм та ієрархія успадкування:
Поліморфізм дозволяє використовувати батьківський клас для посилань на об’єкти дочірніх класів, а поведінка буде залежати від конкретного типу об’єкта.
Приклад поліморфізму:
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog(); // Поліморфізм
myAnimal.makeSound(); // Викличе метод Dog, виведе “Dog barks”
myAnimal = new Cat();
myAnimal.makeSound(); // Викличе метод Cat, виведе “Cat meows”
}
}
4. Ієрархія з кількома рівнями:
- Успадкування може бути багаторівневим, де один клас успадковує інший, який у свою чергу успадковує ще один клас.
Приклад багаторівневого успадкування:
public class Animal {
public void makeSound() {
System.out.println(“Animal sound”);
}
}
public class Mammal extends Animal {
@Override
public void makeSound() {
System.out.println(“Mammal sound”);
}
}
public class Dog extends Mammal {
@Override
public void makeSound() {
System.out.println(“Dog barks”);
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // Виведе “Dog barks”
}
}
3. Перетворення типів
Перетворення типів (casting) у Java дозволяє змінювати тип об’єкта в ієрархії класів. Є два види перетворень:
1. Неявне (implicit) перетворення (вгору по ієрархії, “upcasting”):
- Це автоматичне перетворення об’єкта дочірнього класу до типу батьківського класу.
- Наприклад, об’єкт типу `Dog` може бути автоматично приведений до типу Animal.
Приклад:
Animal myAnimal = new Dog(); // Автоматичне перетворення до типу Animal
2. Явне (explicit) перетворення (вниз по ієрархії, “downcasting”):
- Явне перетворення потрібно для перетворення об’єкта з типу батьківського класу до типу дочірнього класу.
- Таке перетворення можливе, тільки якщо об’єкт насправді є екземпляром дочірнього класу, інакше виникне помилка `ClassCastException`.
Приклад:
Animal myAnimal = new Dog(); // Upcasting
Dog myDog = (Dog) myAnimal; // Downcasting (явне перетворення)
myDog.makeSound(); // Викличе метод Dog
3. Оператор instanceof:
- Оператор instanceof використовується для перевірки, чи є об’єкт екземпляром певного класу або його нащадка. Це корисно для безпечного перетворення типів.
Приклад:
Animal myAnimal = new Dog();
if (myAnimal instanceof Dog) {
Dog myDog = (Dog) myAnimal;
myDog.makeSound(); // Виведе “Dog barks”
}
Висновок
- Абстрактні класи дозволяють визначити загальні характеристики та поведінку для класів, але їх не можна створювати безпосередньо.
- Ієрархія успадкування забезпечує можливість організовувати класи у вигляді дерева, що полегшує повторне використання коду та поліморфізм.
- Перетворення типів дозволяє змінювати типи об’єктів у межах ієрархії класів для роботи з ними в контексті поліморфізму.
Абстрактні класи Ієрархія успадкування та перетворення типів