Интерфейсы и абстрактные классы в Java: в чём разница

«Чем интерфейс отличается от абстрактного класса?» — вопрос, который почти гарантированно прозвучит на собеседовании. Попробуем разобраться так, чтобы ответить своими словами, а не цитатой из учебника.
Редакция Бинариума
Пишем о профессиях в дизайне, BIM и IT · 6 минут чтения
Из этой статьи вы узнаете:
Интерфейс — договор о возможностях
Интерфейс описывает, что объект умеет делать, но не говорит, кто он. «Умеет летать» могут и птица, и самолёт.
interface Payable {
void pay(int amount);
}
class Card implements Payable {
public void pay(int amount) { /* списать с карты */ }
}Абстрактный класс — общий фундамент
Абстрактный класс описывает, кем объект является, и может хранить общее состояние и готовые методы для наследников.
abstract class Employee {
protected String name;
abstract int salary();
String card() { return name + ": " + salary(); }
}Курс Бинариума
Java-разработчик с нуля — ООП на практических проектах
Сравнение
| Критерий | Интерфейс | Абстрактный класс |
|---|---|---|
| Смысл | Что умеет | Кем является |
| Сколько можно | Класс реализует любое число | Наследоваться можно от одного |
| Поля-состояние | Только константы | Любые поля |
| Конструктор | Нет | Есть |
| Готовые методы | default и static методы | Любые |
Когда что выбирать
- Интерфейс — когда разные, не связанные классы должны уметь одно и то же: оплачиваться, сравниваться, сохраняться.
- Абстрактный класс — когда у группы родственных классов есть общие данные и общая логика.
- Часто их сочетают: интерфейс задаёт контракт, абстрактный класс даёт базовую реализацию.
Главное
- Интерфейс — «что умеет», абстрактный класс — «кем является».
- Интерфейсов можно реализовать много, родитель — один.
- Состояние и конструктор есть только у абстрактного класса.
- По умолчанию начинайте с интерфейса.
Частые вопросы
Можно ли создать объект абстрактного класса?
Нет, только объект его конкретного наследника.
Зачем default-методы в интерфейсах?
Чтобы добавлять в интерфейс новые методы, не ломая все классы, которые его уже реализуют.
Курс Бинариума
Java-разработчик с нуля
Поймите ООП на практике и уверенно отвечайте на собеседованиях.
- 11 недель обучения
- 10+ практических работ
- Проект на GitHub