Используя оператор
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
.
Ссылка на первоисточник: Operator instanceof
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Так, что лучше применять и когда?
P. S. Многие в комментариях аппелируют к «Это один из самых медленных java операторов». Это действительно так. Конечно, не совсем корректно сравнивать операторы языка по производительности, так как они выполняют абсолютно разные задачи, но, тем не менее, механизм работы instanceOf гораздо сложнее, например, оператора '*'. https://habrahabr.ru/post/132241/