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

вроде везде где читаю написано, что нельзя создать экземпляр абстрактного класса

public abstract class AbstractClass {
    public abstract void move();
}

class Test {

    public static void main(String[] args) {
        AbstractClass abstractClass = new AbstractClass() {
            @Override
            public void move() {
            }
        };

        System.out.println(abstractClass);
    }

}

но данный код компилируется, или я что-то не так понимаю? (имплементировать метод IDE предложила)


Ответы (2 шт):

Автор решения: Anton Shchyrov

Не понимаете. Вы создаете объект анонимного класса наследника AbstractClass и у этого наследника перекрываете абстрактный метод move. Так же можно поступать и с интерфейсами

→ Ссылка
Автор решения: NaClnik

Этим куском кода

AbstractClass abstractClass = new AbstractClass() {
                @Override
                public void move() {
                }
            };

Вы создаёте объект класса, который является не самим экземпляром абстрактного класса, а его наследником. Просто в данном случае класс наследника является анонимным. То есть это то же самое, что создать новый класс, который наследуется от AbstractClass и создать его экземпляр:

public class HelloWorld{

     public static void main(String []args){
        System.out.println("Hello World");
     }
}

public abstract class AbstractClass {
    public abstract void move();
}
    
public class DerivedClass extends AbstractClass{
    @Override
    public void move(){
    }
}
    
    
class Test {

    public static void main(String[] args) {
        AbstractClass abstractClass = new DerivedClass();

        System.out.println(abstractClass);
    }
    
}
→ Ссылка