Интерфейсы не могут объявлять переменные экземпляра, а абстрактные классы могут. Это фундаментальное структурное различие — абстрактные классы позволяют тебе хранить состояние через переменные экземпляра, тогда как интерфейсы предназначены в основном для определения контрактов без хранения данных.
Абстрактные классы могут включать конструкторы для инициализации состояния при создании экземпляров. Интерфейсы не могут иметь конструкторы, так как их нельзя напрямую инстанцировать.
Это означает, что абстрактные классы дают больше гибкости для совместного использования логики реализации между подклассами.
Функциональный интерфейс — интерфейс ровно с одним абстрактным методом (плюс любое количество методов по умолчанию) — можно использовать с лямбда-выражениями. Абстрактные классы так использовать нельзя, поскольку они не являются функциональными интерфейсами.
Хотя методы по умолчанию в Java 8 размыли границу между интерфейсами и абстрактными классами, различие по-прежнему остаётся важным:
Выбор зависит от твоих архитектурных целей и от того, нужны ли тебе переменные экземпляра и конструкторы.
Интерфейс в Java 8 может объявлять переменные экземпляра для сохранения состояния, так же как это может делать абстрактный класс.
Новый — ещё не проверен сообществом
Вы