Знаете ли основные принципы объектно-ориентированного программирования
Что проверяют
Четыре слова знают все, поэтому смотрят на другое: можете ли вы объяснить каждый принцип через механизм Java и пример из своего кода. Следом почти наверняка спросят про перегрузку и переопределение, композицию против наследования или про SOLID.
Как отвечать
- инкапсуляция: объект сам отвечает за корректность своего состояния, а снаружи виден только контракт. Модификатор
privateэто инструмент, а суть в инвариантах: уAccountнетsetBalance(), естьwithdraw(), который не даст уйти в минус. Неизменяемые объекты иrecordдоводят идею до предела; - наследование: подкласс получает поведение родителя и может его расширить. В Java один родительский класс и сколько угодно интерфейсов, с Java 8 интерфейсы могут содержать
default-методы. Наследование выражает отношение «является», а не способ переиспользовать код; - полиморфизм: код работает с
List, а выполняется методArrayListилиLinkedList. Нестатические, неприватные и нефинальные методы в Java вызываются через позднее связывание: реализация выбирается по реальному типу объекта во время выполнения. Перегрузку тоже относят к полиморфизму, но она разрешается при компиляции по объявленным типам аргументов; - абстракция: выделить существенное и спрятать детали за интерфейсом.
PaymentGatewayс методомcharge()не говорит, какой банк внутри.
Хорошо добавить современный взгляд: композицию давно предпочитают наследованию, а sealed-иерархии (Java 17) вместе с switch по образцам (Java 21) позволяют описать закрытый набор вариантов без глубоких деревьев классов.
Где спотыкаются
Сводят инкапсуляцию к «private поля плюс геттеры и сеттеры». Сеттер на каждое поле как раз ломает инкапсуляцию: состояние снова меняется откуда угодно.
Приводят наследование как способ переиспользовать код. Классический антипример из самого JDK: Stack extends Vector, из-за чего у стека есть insertElementAt() и доступ по индексу.
Утверждают, что статические методы переопределяются. Они скрываются: вызов выбирается по объявленному типу ссылки, а не по объекту.