Что такое наследование в ООП?

«Что такое наследование в ООП?» — вопрос из категории ООП, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Наследование — это механизм объектно-ориентированного программирования, который позволяет одному классу (дочернему, производному) наследовать структуру (поля) и поведение (методы) другого класса (родительского, базового). Это реализует отношение «является» (is-a) и способствует повторному использованию кода и созданию иерархий.

Простой пример:

// Базовый (родительский) класс
class Vehicle {
    protected String brand;

    public Vehicle(String brand) {
        this.brand = brand;
    }

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

// Дочерний класс, наследует Vehicle
class Car extends Vehicle {
    private int numberOfDoors;

    public Car(String brand, int doors) {
        super(brand); // Вызов конструктора родительского класса
        this.numberOfDoors = doors;
    }

    public void displayInfo() {
        System.out.println("This is a " + brand + " car with " + numberOfDoors + " doors.");
        honk(); // Можно использовать унаследованный метод
    }
}

// Использование
public class Main {
    public static void main(String[] args) {
        Car myCar = new Car("Toyota", 4);
        myCar.displayInfo(); // Вывод: This is a Toyota car with 4 doors. Beep beep!
        myCar.honk(); // Метод доступен, так как унаследован
    }
}

Основные концепции, связанные с наследованием:

  • Переопределение методов (Override): Дочерний класс может предоставить свою собственную реализацию метода, уже существующего в родительском классе.
    class ElectricCar extends Car {
        @Override
        public void honk() {
            System.out.println("Silent electric beep!"); // Своя реализация
        }
    }
  • Абстрактные классы и методы: Родительский класс может объявить метод без реализации (abstract), обязывая дочерние классы его реализовать.
  • Полиморфизм: Объект дочернего класса может рассматриваться как объект родительского класса. Это позволяет работать с разными типами через общий интерфейс.
    Vehicle myVehicle = new Car("Ford", 2); // Полиморфизм
    myVehicle.honk(); // Вызовется переопределенный метод, если он есть
  • Инкапсуляция и доступ: Модификаторы доступа (private, protected, public) контролируют, какие члены родительского класса видны в дочернем.

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

Видео-ответы