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

#java #abstract-class

#java #абстрактный класс

Вопрос:

 package corejava;
abstract class abstractA      // abstract class A
{
    abstract void abst();         // Abstarct Method
    void eat()                    // Non abstract method
    {
        System.out.println("non abstract");
    }
}
class B extends abstractA        // class B extends abstract Class
{
    @Override                          // define body of abstract method
    void abst() {
        System.out.println("abstract method define");
    }
    void eat()                         // override eat method
    {
        System.out.println("non abstract override ");
    }
}
public class alloops {             // Main class
    public static void main(String[] args)
    {
        B b=new B();                         // create Object B Class
        abstractA a = new abstractA() {          // create Object of abstract Class
            @Override
            void abst() {
                System.out.println("again abstract");
            }
        };
        a.eat();  //instance of abstract class
        System.out.println(a instanceof abstractA);
        b.abst();
        b.eat();
        a.abst();
    }
}
  

Вывод:

неабстрактное
значение true,
определение абстрактного метода,
неабстрактное переопределение
, снова абстрактное

В этом случае вывод находится выше. Я хочу знать, правильно это или неправильно. Обязательно ли мне создавать экземпляр абстрактного класса или нет?

Комментарии:

1. Вы не можете создать экземпляр абстрактного класса. Вот и все. В Java для этого нет обходного пути. Вы создаете анонимный внутренний класс, не создающий экземпляр абстрактного класса.

Ответ №1:

То, что вы сделали, — это создание анонимного внутреннего класса.

 abstractA a = new abstractA() {          // create Object of abstract Class
        @Override
        void abst() {
            System.out.println("again abstract");
        }
    };
  

Ответ №2:

 abstractA a = new abstractA() { 
     @Override
      void abst() {
                System.out.println("again abstract");
      }
};
  

Приведенный выше код фактически определил анонимный класс, расширяющий ваш абстрактный класс. Ваш код работает так, как и ожидалось.

Ответ №3:

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

    a instanceof abstractA
  

instanceof используется для проверки, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, который реализует определенный интерфейс.

В этом случае abstractA является экземпляром подкласса абстрактного класса.

Вывод будет более понятным, если вы будете использовать эти строки для определения типов классов экземпляров

   System.out.println(b.getClass().toString());
  System.out.println(a.getClass().toString());
  

Вывод:

класс corejava.B
стоимость класса corejava.alloops составляет$ 1

Первая строка выходных данных сообщает, что b является экземпляром класса B в пакете corejava

Вторая строка сообщает, что a является первым анонимным внутренним классом ($ 1) класса alloops пакета corejava