Какие основные принципы объектно-ориентированного программирования (ООП)?

«Какие основные принципы объектно-ориентированного программирования (ООП)?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основные принципы ООП — это четыре фундаментальные концепции, на которых строится парадигма. Дополнительно к ним существуют уточняющие принципы SOLID.

1. Инкапсуляция

Сокрытие внутреннего состояния объекта и защита данных через публичный интерфейс.

class BankAccount {
    // Данные скрыты (private)
    private double balance;
    private String owner;

    // Доступ только через публичные методы
    public BankAccount(String owner) {
        this.owner = owner;
        this.balance = 0.0;
    }

    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    public double getBalance() {
        return balance;
    }
}

Суть: Объект — «черный ящик» с четким контрактом (публичными методами).

2. Наследование

Создание нового класса (потомка) на основе существующего (родителя) с возможностью переиспользования и расширения его функциональности.

// Базовый класс
class Animal {
    String name;
    void makeSound() {
        System.out.println("Some generic sound");
    }
}

// Производный класс
class Dog extends Animal {
    // Переопределение метода (полиморфизм)
    @Override
    void makeSound() {
        System.out.println("Woof!");
    }

    // Новое поведение
    void fetch() {
        System.out.println("Fetching the ball...");
    }
}

3. Полиморфизм

Возможность объектов с одинаковым интерфейсом (или базовым типом) выполнять операции по-разному.

Animal myAnimal = new Dog(); // Ссылка базового типа на объект потомка
myAnimal.makeSound(); // Выведет "Woof!" (вызовется метод Dog)

// Полиморфизм в коллекциях
List<Animal> zoo = Arrays.asList(new Dog(), new Cat());
for (Animal a : zoo) {
    a.makeSound(); // Каждое животное издаст свой звук
}

Формы: Переопределение методов (как выше) и перегрузка методов (разные сигнатуры).

4. Абстракция

Выделение существенных характеристик объекта и игнорирование несущественных деталей.

// Абстрактный класс задает концепцию
abstract class Shape {
    // Абстрактный метод — обязательный контракт для потомков
    abstract double calculateArea();

    // Конкретный метод с общей логикой
    void printArea() {
        System.out.println("Area: " + calculateArea());
    }
}

class Circle extends Shape {
    double radius;
    Circle(double r) { radius = r; }

    @Override
    double calculateArea() {
        return Math.PI * radius * radius;
    }
}

Абстракция достигается через: абстрактные классы, интерфейсы.

Принципы SOLID

Это пять дополнительных принципов проектирования, углубляющих базовые концепции ООП:

  • SRP: Принцип единственной ответственности.
  • OCP: Принцип открытости/закрытости.
  • LSP: Принцип подстановки Барбары Лисков.
  • ISP: Принцип разделения интерфейса.
  • DIP: Принцип инверсии зависимостей.