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

abstract class A {
    public void disp() {
        System.out.print("Abstract");
    }
}

public class B {
    public static void main(String args[]) {
        A object = new A(){ };
        object.disp();
    }
} 

Я знаю, что абстрактные классы не могут быть созданы, но запутаны в этом коде. Собственно, что означает этот код?

Ответы

Ответ 1

Тонкость здесь находится в "{}". Это означает, что явно предоставляет анонимную реализацию для отсутствующих частей (недостающие части - абстрактные методы) абстрактного класса A, позволяющие создать его экземпляр.

Но в A нет абстрактного метода, поэтому анонимная реализация пуста.

Пример, показывающий поведение по крайней мере с одним абстрактным методом:

public abstract class A {
    public abstract void bar();
    public void disp() { System.out.print("Abstract"); } 
}

public class B { 
    public static void main(String args[]) { 
        A object = new A() { 
            @Override public void bar() { System.out.print("bar"); } 
        }; 
        object.disp(); //prints "Abstract" 
        object.bar(); //prints "bar"
    } 
} 

Ответ 2

Это называется анонимным внутренним классом. Вы не создаете абстрактный класс, вы создаете конкретный анонимный внутренний класс, который расширяет абстрактный класс. Конечно, для того, чтобы это было разрешено, анонимный внутренний класс должен обеспечивать реализации для всех абстрактных членов абстрактного суперкласса... который он делает в этом случае, потому что абстрактный суперкласс не имеет абстрактных членов.