#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