Абстрактные классы и интерфейсы в 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, причём несколько сразу.
  • Абстрактный класс = «является», интерфейс = «умеет».
Проверьте себя
1. Можно ли создать объект абстрактного класса через new?
AДа, как обычно
BНет, абстрактный класс нельзя инстанцировать
CТолько в main
DТолько если нет полей
2. Каким ключевым словом класс реализует интерфейс?
Aextends
Bimplements
Cuses
Dabstract
3. Сколько интерфейсов может реализовать один класс?
AТолько один
BНесколько
CНи одного
DРовно два