Какие базовые принципы ООП: абстракция, наследование, инкапсуляция, полиморфизм
Что проверяют
Базовый вопрос для отсева: выдерживают ли ваши определения пару уточнений. Следом обычно спрашивают, чем абстрактный класс отличается от интерфейса и чем перегрузка отличается от переопределения.
Как отвечать
На каждый принцип дайте определение и покажите, чем он выражен в Java:
- абстракция: работа с объектом через его контракт, без деталей реализации. Инструменты: интерфейсы и абстрактные классы. С Java 8 у интерфейсов есть
default-методы, поэтому граница проходит по состоянию: у абстрактного класса могут быть поля экземпляра и конструктор, у интерфейса только константы; - инкапсуляция: объект сам защищает свои инварианты. Модификаторы
private, package-private,protected,publicлишь инструмент, суть в том, что изменить состояние в обход проверок нельзя. Сильнее всего работает неизменяемость:final-поля,recordс Java 16, защитные копии черезList.copyOf(); - наследование: класс расширяет один родительский класс через
extendsи может реализовывать сколько угодно интерфейсов. Sealed-классы с Java 17 позволяют явно перечислить допустимых наследников; - полиморфизм: вызов через ссылку на базовый тип исполняет метод фактического класса объекта. Нестатические и неприватные методы в Java виртуальные по умолчанию,
finalзапрещает переопределение. Перегрузку выбирает компилятор по объявленным типам аргументов, переопределённый метод выбирается по реальному типу объекта во время выполнения.
Сильный ответ добавит принцип подстановки Лисков и совет предпочитать композицию наследованию: глубокие иерархии ломаются от правки базового класса.
Где спотыкаются
Сводят инкапсуляцию к геттерам и сеттерам на каждое поле. Публичный сеттер без проверок раскрывает состояние так же, как публичное поле.
Думают, что статический метод можно переопределить. Он скрывается (hiding), и вызов выбирается по объявленному типу ссылки, а не по объекту. Поля тоже не полиморфны: обращение к полю берёт его из объявленного типа.
Забывают @Override. Без аннотации опечатка в сигнатуре превращает переопределение в перегрузку, и компилятор промолчит.