Насколько я знаю интерфейс с одной из недавних версий могут иметь реализацию по умолчанию, отсюда вопрос зачем нужны абстрактные классы, если они теперь лишены своего преимущества, но имеют ограничения в наследовании в отличии от интерфейсов
В абстрактном классе можно делать поля экземпляра, чего нельзя делать в интерфейсах. Зачем нужны? Риторический вопрос, я вот лично терпеть не могу абстрактные классы. Но вот на работе постоянно сталкиваюсь с ними.
Абстрактные классы используются там, где можно выделить иерархию и единый функционал для подклассов.
То есть зачастую в абстрактном классе описываются методы (часто с protected модификатором доступа), которые доступны только дочерним классам и устраняют дублирование кода в подклассах или же реализуют метод интерфейса по умолчанию.
Один из ярких примеров библиотека Swing для Java:
Есть интерфейс TableModel, который имеет 9 методов для реализации.
Все 9 методов обычному программисту может быть ненужно реализовывать, для этого разработчики вводят абстрактный класс, который так и называется AbstractTableModel, который уже реализует некоторые методы по умолчанию, таким образом, программисту вместо реализации всех методов из интерфейса, достаточно наследовать класс и описать только нужные ему методы.
Более того, разработчики Swing пошли дальше и создали класс DefaultTableModel, который вообще реализует весь функционал и программисту остается только переопределить методы. которые необходимы для его конкретной задачи.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники