Ответ
Нет, напрямую создать экземпляр абстрактного класса с помощью оператора 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.
}
}
Как это работает:
- Компилятор создает неименованный (анонимный) класс, который расширяет
Animal. - В этом классе реализуется метод
makeSound(). - Оператор
newсоздает экземпляр именно этого анонимного класса.
Вывод: Нельзя создать объект самого абстрактного класса, но можно создать объект его конкретного подкласса, в том числе анонимного.