Как ответить
ООП — это подход к проектированию программ, в котором данные и методы их обработки объединяются в объекты. Вместо того чтобы писать процедуры, которые оперируют разрозненными данными, мы описываем сущности предметной области и их взаимодействие.
Четыре базовых принципа ООП:
- Инкапсуляция — скрытие внутреннего устройства объекта. Внешний код не должен напрямую менять поля объекта, только через публичные методы. В Java это модификаторы доступа private/protected/public. Пример: класс BankAccount с private полем balance и методами deposit()/withdraw(), которые проверяют лимиты.
- Наследование — создание нового класса на основе существующего. Дочерний класс получает поля и методы родителя и может их переопределить. В Java — extends. Пример: класс Car наследует Vehicle, добавляя поле numberOfDoors и переопределяя метод startEngine().
- Полиморфизм — один интерфейс, разная реализация. Позволяет работать с объектами разных типов через общий предок или интерфейс. В Java — переопределение методов (override) и перегрузка (overload). Пример: List<Animal> animals содержит Cat и Dog; вызов animal.makeSound() даёт "meow" или "bark".
- Абстракция — выделение существенных характеристик объекта и игнорирование несущественных. В Java — абстрактные классы и интерфейсы. Пример: интерфейс Drawable с методом draw(), неважно, как именно рисует круг или квадрат.
На практике ООП упрощает поддержку кода: изменения в одном классе реже ломают другие части программы. Для junior-разработчика важно понимать, что наследование часто ведёт к жёстким связям, поэтому лучше предпочитать композицию — передачу объектов через конструктор. Например, не наследовать ReportGenerator от DatabaseConnection, а передавать DatabaseConnection в конструктор ReportGenerator.
Основные понятия, которые нужно знать: класс (шаблон), объект (экземпляр), конструктор, this/self, статические методы и поля, геттеры/сеттеры. Типичная ошибка новичка — делать все поля публичными или создавать глубокие иерархии наследования.
В реальных проектах ООП применяется вместе с принципами SOLID. Например, Dependency Inversion: класс OrderProcessor не должен сам создавать объект DatabaseLogger, ему передают интерфейс Logger в конструктор. Это позволяет легко менять логирование (файл, консоль, удалённый сервис) без изменения OrderProcessor.