Подтвердить что ты не робот

Возвращает ли instanceof true, если экземпляр родителя?

У меня есть класс Child, который расширяет Parent.

Parent child = new Child();

if (child instanceof Parent){
    // Do something
}

Это возвращает true или false, и почему?

4b9b3361

Ответ 1

Да, это так. А почему бы и нет?

Потому что ребенок на самом деле является экземпляром Parent. Если вы хотите выполнить операцию только для ребенка, вы должны проверить

if (child instanceof Child){
}

Однако вы должны помнить следующее высказывание Скотта Мейерса из Effective C++:

"Каждый раз, когда вы обнаруживаете, что пишете код формы", если объект имеет тип T1, тогда что-то делаете, но если он имеет тип T2, тогда делайте что-то еще ", шлепните себя.

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

ПРИМЕЧАНИЕ: я не скомпилировал его.

class Parent {
    public void doSomething() {
        System.out.println("I am the Parent, and I do as I like");
    }
}

class ChildA extends Parent {
    public void doSomething() {
        System.out.println("I am a child named A, but I have my own ways, different from Parent");
    }
}

class ChildB extends Parent {
    public void doSomething() {
        System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings");
    }
}

public class Polymorphism101 {

    public static void main(String[] args) {

        Parent p = new Parent();
        p.doSomething();

        p = new ChildA();
        p.doSomething();

        p = new ChildB();
        p.doSomething();

    }

}

РЕДАКТИРОВАТЬ: лучший пример

Вы могли бы разработать приложение для рисования. Приложение, которое рисует фигуры любого вида. В этом случае у вас должен быть абстрактный тип Shape.

Для целей, как; рисование всех форм; перечислите все формы; найти форму или удалить форму, вам нужно иметь список фигур. Поскольку список имеет родительский тип, он может хранить любые фигуры.

Интерфейс Shape/абстрактный класс/виртуальный класс должен иметь абстрактную/чисто виртуальную функцию Draw(). Итак, в вашем DrawToDeviceLoop вы просто вызываете Draw() для каждой фигуры, вам никогда не нужно проверять, какая это фигура.

Интерфейс Shape может иметь абстрактную реализацию AbstractShape, которая может иметь имя или идентификатор фигуры в качестве членов данных, а также GetName, Cleanup и другие функции с функциями, общими для всех фигур.

Помните, что абстрактный тип не может быть создан, поэтому сам Shape не может быть создан, так как он также не может быть нарисован.

Ответ 3

Да. instanceof будет истинным всякий раз, когда ссылка (левая сторона выражения instanceof) может быть перенесена в ReferenceType (тип в правой части выражения instanceof). Это будет верно для подклассов относительно их родителя:

Child child = new Child();
Parent parent = (Parent) child; //works!
assert child instanceof Parent; //true

От Спецификация языка Java, Java SE 9 Edition:

15.20. Реляционные операторы
...
RelationalExpression instanceof ReferenceType

15.20.2. Пример сравнения экземпляров экземпляра
...
Во время выполнения результат оператора instanceof равен true, если значение RelationalExpression не равно null, и ссылка может быть передана в ReferenceType без повышения a ClassCastException. В противном случае результат false.

Ответ 4

Конечно, он возвращает true, потому что child является экземпляром родительского