Абстрактные классы и интерфейсы

  1. Абстрактные классы:

    • Абстрактный класс в Java - это класс, который содержит один или несколько абстрактных методов.

    • Абстрактный метод - это метод, который объявлен, но не имеет реализации в абстрактном классе. Реализация абстрактного метода оставляется на усмотрение подкласса.

    • Абстрактные классы нельзя инстанциировать, т.е. нельзя создать объект абстрактного класса. Они используются в основном для создания шаблонов, которые наследуются подклассами для предоставления конкретной реализации.

    • Абстрактный класс может содержать как абстрактные методы, так и обычные методы с реализацией.

    • Для объявления абстрактного класса используется ключевое слово abstract.

Пример:

abstract class Shape {
    // Абстрактный метод
    abstract void draw();
    
    // Обычный метод
    void resize() {
        System.out.println("Resize shape");
    }
}
  1. Интерфейсы:

    • Интерфейс в Java - это абстрактный тип данных, определяющий методы, но не предоставляющий их реализации.

    • В интерфейсе могут быть только абстрактные методы (до Java 8), а также методы с реализацией и статические методы (начиная с Java 8).

    • Классы могут реализовывать (implements) один или несколько интерфейсов. При этом класс обязан предоставить реализацию всех методов интерфейса.

    • Интерфейсы предоставляют способ реализации множественного наследования в Java.

    • Для объявления интерфейса используется ключевое слово interface.

Пример:

interface Drawable {
    // Абстрактный метод
    void draw();
    
    // Метод с реализацией (начиная с Java 8)
    default void resize() {
        System.out.println("Resize shape");
    }
}

Подведем итоги:

  • Абстрактные классы предоставляют частичную реализацию, в то время как интерфейсы определяют контракт для классов.

  • Класс может наследоваться только от одного класса (абстрактного или не абстрактного), но может реализовывать несколько интерфейсов.

  • Используйте абстрактные классы, если хотите предоставить базовую реализацию и иметь возможность расширения этой реализации. Используйте интерфейсы, если хотите определить контракт для классов без предоставления какой-либо реализации.

Last updated