Абстрактный класс и интерфейс - это два различных концепта в Java, которые используются для достижения абстракции и полиморфизма.
Абстрактный класс - это класс, который определяет хотя бы один абстрактный метод. Абстрактные методы - это методы без тела, которые должны быть переопределены в подклассах, чтобы дать им конкретную реализацию. Кроме того, абстрактный класс может иметь и конкретные методы с телом.
Интерфейс - это коллекция абстрактных методов, которая определяет действия (методы), которые реализующий класс обязуется поддерживать. В интерфейсах все методы по умолчанию абстрактные и не имеют тела. Кроме того, интерфейс может определять константы.
Основное отличие между абстрактным классом и интерфейсом заключается в том, что абстрактный класс может содержать реализацию методов, а интерфейс может иметь только абстрактные методы - т.е. методы без тела. Кроме того, класс может расширять только один абстрактный класс, но он может реализовывать несколько интерфейсов.
Вот основные различия между ними:
Абстрактный класс:
- Абстрактный класс может содержать как абстрактные, так и конкретные методы.
- Абстрактный класс может иметь поля и конструкторы.
- Класс может наследовать только один абстрактный класс.
- Абстрактный класс может предоставлять реализацию для некоторых или всех своих методов.
- Для создания экземпляра абстрактного класса требуется создать его подкласс и реализовать все абстрактные методы.
Интерфейс:
- Интерфейс может содержать только абстрактные методы (начиная с Java 8, интерфейс может содержать и методы с реализацией по умолчанию).
- Интерфейс не может иметь полей и конструкторов.
- Класс может реализовывать несколько интерфейсов.
- Интерфейс предоставляет только сигнатуры методов, но не их реализацию.
- Для использования интерфейса класс должен реализовать все его методы.
Когда использовать абстрактный класс:
- Когда требуется предоставить базовую реализацию для нескольких классов.
- Когда требуется определить общие поля и методы для нескольких классов.
- Когда требуется использовать модификаторы доступа, отличные от public, для методов и полей.
Когда использовать интерфейс:
- Когда требуется определить только сигнатуры методов без их реализации.
- Когда требуется реализовать множество несвязанных классов с общими методами.
- Когда требуется достичь множественного наследования.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov