Можно ли создать экземпляр абстрактного класса в Java?

«Можно ли создать экземпляр абстрактного класса в Java?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, напрямую создать экземпляр абстрактного класса с помощью оператора new нельзя. Абстрактный класс — это неполная реализация, предназначенная исключительно для наследования. Он может содержать абстрактные методы (без тела), которые должны быть реализованы в конкретном подклассе.

Попытка вызовет ошибку компиляции:

abstract class Animal {
    abstract void makeSound();
}

// ОШИБКА COMPILATION: 'Animal' is abstract; cannot be instantiated
Animal a = new Animal();

Однако можно создать экземпляр анонимного класса, который является наследником абстрактного класса и предоставляет реализацию всех его абстрактных методов. Синтаксически это выглядит как создание экземпляра, но фактически создается объект анонимного подкласса.

Пример с анонимным классом:

abstract class Animal {
    abstract void makeSound();
    void breathe() {
        System.out.println("Breathing...");
    }
}

public class Main {
    public static void main(String[] args) {
        // Создание экземпляра анонимного класса, наследующего Animal
        Animal cat = new Animal() {
            @Override
            void makeSound() {
                System.out.println("Meow");
            }
        };

        cat.makeSound(); // Вывод: Meow
        cat.breathe();   // Вывод: Breathing... (унаследованный метод)
        // cat является объектом анонимного подкласса, а не класса Animal.
    }
}

Как это работает:

  1. Компилятор создает неименованный (анонимный) класс, который расширяет Animal.
  2. В этом классе реализуется метод makeSound().
  3. Оператор new создает экземпляр именно этого анонимного класса.

Вывод: Нельзя создать объект самого абстрактного класса, но можно создать объект его конкретного подкласса, в том числе анонимного.