Абстрактные классы и интерфейсы в Java
Абстрактные классы и интерфейсы в Java: abstract, implements, чем они различаются и когда что выбирать.
Абстракция — это описание того, что объект делает, без деталей, как именно. В Java для этого служат абстрактные классы и интерфейсы.
Абстрактный класс
Класс с модификатором abstract нельзя создать через new — он задаёт общую основу для потомков. В нём могут быть как обычные методы, так и абстрактные — объявленные без тела. Потомок обязан их реализовать.
abstract class Animal {
String name;
abstract void sound(); // без тела — потомок обязан реализовать
void sleep() { // обычный метод — общий для всех
System.out.println(name + " спит");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("Мяу");
}
}
Cat c = new Cat();
c.name = "Барсик";
c.sound();
c.sleep();
// Animal a = new Animal(); // ← ошибка: абстрактный класс нельзя создать
Вывод:
Мяу Барсик спит
Интерфейс
Интерфейс — это контракт: набор методов, которые класс обязуется реализовать. Класс подключает интерфейс через implements. В отличие от класса, интерфейсов можно реализовать сразу несколько.
interface Drawable {
void draw(); // методы интерфейса по умолчанию абстрактны
}
interface Clickable {
void click();
}
class Button implements Drawable, Clickable { // сразу два интерфейса
@Override
public void draw() {
System.out.println("Рисую кнопку");
}
@Override
public void click() {
System.out.println("Клик");
}
}
Button b = new Button();
b.draw();
b.click();
Вывод:
Рисую кнопку Клик
Что выбрать
Абстрактный класс | Интерфейс |
можно наследовать только один | можно реализовать несколько |
есть поля и готовые методы | в основном контракт (методы) |
«является» (Cat — это Animal) | «умеет» (Button умеет draw) |
Правило-ориентир: используйте абстрактный класс, когда у объектов общая природа и общий код; интерфейс — когда нужно описать способность, которую могут иметь несовместимые классы.
Коротко
- Абстрактный класс задаёт основу для потомков; его нельзя создать через
new. - Абстрактный метод объявлен без тела — потомок обязан его реализовать.
- Интерфейс — контракт; класс подключает его через
implements, причём несколько сразу. - Абстрактный класс = «является», интерфейс = «умеет».