Абстрактные классы и интерфейсы в 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Ровно два
Поддержать проект