articles
15 уровень

Оператор instanceof

Пост из группы Архив info.javarush.ru
3745 участников
Используя оператор instanceof, можно узнать, от какого класса произошел объект. Этот оператор имеет два аргумента. Слева указывается ссылка на объект, а справа — имя типа, на совместимость с которым проверяется объект. Например: Parent р = new Child(); // проверяем переменную р типа Parent // на совместимость с типом Child print(p instanceof Child); Результатом будет true. Таким образом, оператор instanceof опирается не на тип ссылки, а на свойства объекта, на который она ссылается. Но этот оператор возвращает истинное значение не только для того типа, от которого был порожден объект. Добавим к уже объявленным классам еще один: // Объявляем новый класс и наследуем // его от класса Child class ChildOfChild extends Child {} Теперь заведем переменную нового типа: Parent p = new ChildOfChild(); print(p instanceof Child); В первой строке объявляется переменная типа Parent, которая инициализируется ссылкой на объект, порожденный от ChildOfChild. Во второй строке оператор instanceof анализирует совместимость ссылки типа Parent с классом Child, причем задействованный объект не порожден ни от первого, ни от второго класса. Тем не менее, оператор вернет true, поскольку класс, от которого этот объект порожден, наследуется от Child. Ссылка на первоисточник: http://2rrr.ru/?Operaciya_sozdaniya_obtzekta:Operator_instanceof
Комментарии (9)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
lichMax40 уровень, Санкт-Петербург
25 февраля 2017, 11:28
Кстати, узнать класс объекта можно и с помощью метода gerClass(). Разве, что не узнаешь предков текущего объектов.
Так, что лучше применять и когда?
Chpok20 уровень, Казань
19 ноября 2017, 17:11
instanceOf возвращает true или false.
lichMax40 уровень, Санкт-Петербург
19 ноября 2017, 20:18
ага, а трава зелёная, небо — синее, земля — чёрная.
t95232 уровень
25 сентября 2016, 13:14
Очень часто во многих источниках встречается информация о том что оператор instanceof очень медленный и использование его можно ограничить полиморфизмом

Например:
Старайтесь как можно реже использовать оператор instanceOf. Это один из самых медленных java операторов и подходить к его использованию нужно осторожно. Имейте в виду — чаще всего наличие этого оператора в коде означает непонимание принципов ООП, нежели попытка реализовать некий паттерн. Почти всегда полиморфизм способен помочь избавится от этого оператора.
P. S. Многие в комментариях аппелируют к «Это один из самых медленных java операторов». Это действительно так. Конечно, не совсем корректно сравнивать операторы языка по производительности, так как они выполняют абсолютно разные задачи, но, тем не менее, механизм работы instanceOf гораздо сложнее, например, оператора '*'.
https://habrahabr.ru/post/132241/
lichMax40 уровень, Санкт-Петербург
25 февраля 2017, 11:26
А какая тогда у него есть альтернатива?
fatfaggy26 уровень, Киев
19 ноября 2017, 22:59
когда-то на стековерфлоу по похожему вопросу ответили. и как я понял, то через полиморфизм это можно сделать вот так.

допустим у нас есть такие классы:
public class A {}
public class B extends A {}


и есть ссылка на объект, о которой мы знаем только то, что это объект класса А или его наследников.
задача: как проверить что объект по ссылке лежит именно класса А, а не его наследников? именно при помощи полиморфизма

предложили примерно вот так:

public class A {
    public boolean isClassA() {
        return true;
    }
}

public class B extends A {
    @Override
    public boolean isClassA() {
        return false;
    }
}


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

вообще там вопрос был про сортировку объектов разных классов, которые наследуются от класса Car. и там предложили просто завести протектед поле в классе Car и хранить в нем марку авто. таким образом каждый объект будет знать какого он класса, не прибегая к вызову getClass()

поэтому мой пример можно переписать так:
public class A {
    protected String className;

    public A() {
        this.className = "A";
    }

    public String getClassName() {
        return className;
    }
}

public class B extends A {
    public B() {
        super();
        this.className = "B";
    }
}
fatfaggy26 уровень, Киев
19 ноября 2017, 23:05
конечно, instanceof хорош тем, что проверяет не только класс самого объекта, но и всю иерархию наследования (в том числе и интерфейсы).

как сделать аналог instanceof через полиморфизм я пока не знаю :)
espajava10 уровень, Valencia
25 сентября 2016, 02:51
Эта ссылка: «Ссылка на первоисточник: 2rrr.ru/?Operaciya_sozdaniya_obtzekta:Operator_instanceof» ведёт на какой-то фейковый фишинг форум!!!
mrANDERSON26 уровень, Харьков
16 января 2016, 16:42
Спасибо! Everything is clear!)