Перейти до основного вмісту
Модуль 3 · Урок 1 із 25/14 у курсі~12 min
Модульні уроки (1/2)

Спадщина

Спадкування — це фундаментальний механізм ООП, який дозволяє класу (званому дочірнім класом або підкласом) успадковувати поля та методи від іншого класу (званого батьківським класом або суперкласом).

Це сприяє повторному використанню коду та уникає непотрібних повторень.

Розширення класу за допомогою extends

У Java ми використовуємо ключове слово extends, щоб вказати, що клас успадковується від іншого:

Java
class Vehicle {
    protected int speed; // 'protected' makes the field visible to subclasses

    public void honk() {
        System.out.println("Beep beep!");
    }
}

class Car extends Vehicle {
    // Car automatically inherits the speed field and the honk() method
}

Конструктор і ключове слово super()

Якщо суперклас має конструктор, який приймає параметри, підклас має викликати його явно у своєму конструкторі, використовуючи super(...) як самий перший оператор:

Java
class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    int studentId;

    public Student(String name, int studentId) {
        super(name); // Invokes the constructor of Person
        this.studentId = studentId;
    }
}

Перевизначення методу (@Override)

Підклас може забезпечити власну специфічну реалізацію методу, успадкованого від суперкласу. Ця операція називається перевизначенням (перевизначення методу) і позначається анотацією @Override.

Java
class Animal {
    public void makeSound() {
        System.out.println("Rumore generico");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miao!");
    }
}

Модифікатор protected

Модифікатор доступу protected відіграє ключову роль у спадкуванні. На відміну від private, який робить членів видимими лише в межах одного класу, protected дозволяє доступ до полів і методів як у межах одного пакета, так і для всіх підкласів, навіть якщо вони знаходяться в різних пакетах.

Доступ до батьківських учасників за допомогою super

На додаток до виклику конструктора суперкласу, ключове слово super можна використовувати в методах підкласу для посилання на методи або змінні батьківського класу. Це особливо корисно, коли метод перевизначено, але ви все одно хочете викликати оригінальну батьківську поведінку:

Java
class Animal {
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Executes the behavior of Animal
        System.out.println("The cat purrs while sleeping.");
    }
}

Єдине успадкування в Java

У Java клас може розширювати лише один клас (єдине успадкування). Пряме успадкування від кількох класів (множинне успадкування) не допускається; наприклад, class Cat extends Animal, Mammal спричинить помилку компіляції. Цей вибір дизайну дозволяє уникнути неоднозначності, відомої як «ромбовидна проблема» (коли два суперкласи визначають той самий метод з різними реалізаціями). Щоб подолати це обмеження, Java вводить концепцію інтерфейсів, яку ми розглянемо в наступному модулі.


Спробуйте самі

вправи#java.m3.l1.e1
Спроби: 0Завантаження…

Доповніть підклас Dog, розширивши Animal. Оголошіть конструктор Dog, який приймає ім’я (String) і використовує super(name), щоб передати його конструктору Animal.

Завантаження редактора…
Показати підказку

Напишіть `public Dog(String name) { super(name); }` всередині класу Dog.

Рішення доступне після 3 спроб

вправи#java.m3.l1.e2
Спроби: 0Завантаження…

Розширте Dog з Animal і замініть метод makeSound(), щоб він повертав рядок Woof замість Generic Sound. Використовуйте анотацію @Override.

Завантаження редактора…
Показати підказку

Напишіть `@Override` над оголошенням `public String makeSound() { return 'Woof'; }` всередині собаки.

Рішення доступне після 3 спроб

вправи#java.m3.l1.e3
Спроби: 0Завантаження…

Оголошіть клас Cat, який розширює Animal і замінює метод makeSound(), щоб повернути рядок Meow. У класі Animal вже є конструктор, який приймає назву; переконайтеся, що конструктор Cat також приймає ім’я та правильно передає його конструктору суперкласу.

Завантаження редактора…
Показати підказку

Створіть клас `Cat`, що розширює `Animal`. Оголошіть конструктор `public Cat(String name) { super(name); }` і перевизначте метод makeSound() за допомогою @Override, щоб повернути «Мяу».

Рішення доступне після 3 спроб