JavaRush /Java блог /Архив info.javarush /Оператор instanceof
articles
15 уровень

Оператор instanceof

Статья из группы Архив info.javarush
Используя оператор instanceof, можно узнать, от какого класса произошел объект. Этот оператор имеет два аргумента. Слева указывается ссылка на объект, а справа — имя типа, на совместимость с которым проверяется объект. Например: Оператор instanceof - 1

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. Ссылка на первоисточник: Operator instanceof
Комментарии (9)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Zhandik Уровень 18
21 ноября 2019
Ссылка на первоисточник неисправна.(ERR_NAME_NOT_RESOLVED)
Viktor Уровень 17
21 марта 2019
написал кодик сравнения скорости работы instanceOf и object.getClass() - получилось примерно одинаково.. НО! если после object.getClass() выполнять .getSimpleName() то получается в 3 раза дольше.. instanceOf - 100милисекунд object.getClass().getSimpleName() - 350 милисекунд
lichMax Уровень 40
25 февраля 2017
Кстати, узнать класс объекта можно и с помощью метода gerClass(). Разве, что не узнаешь предков текущего объектов.
Так, что лучше применять и когда?
t952 Уровень 32
25 сентября 2016
Очень часто во многих источниках встречается информация о том что оператор instanceof очень медленный и использование его можно ограничить полиморфизмом Например: Старайтесь как можно реже использовать оператор instanceOf. Это один из самых медленных java операторов и подходить к его использованию нужно осторожно. Имейте в виду — чаще всего наличие этого оператора в коде означает непонимание принципов ООП, нежели попытка реализовать некий паттерн. Почти всегда полиморфизм способен помочь избавится от этого оператора.
P. S. Многие в комментариях аппелируют к «Это один из самых медленных java операторов». Это действительно так. Конечно, не совсем корректно сравнивать операторы языка по производительности, так как они выполняют абсолютно разные задачи, но, тем не менее, механизм работы instanceOf гораздо сложнее, например, оператора '*'. https://habrahabr.ru/post/132241/
mrANDERSON Уровень 26
16 января 2016
Спасибо! Everything is clear!)