instanceof java что это

Проверка класса: «instanceof»

Оператор instanceof позволяет проверить, к какому классу принадлежит объект, с учётом наследования.

Такая проверка может потребоваться во многих случаях. Здесь мы используем её для создания полиморфной функции, которая интерпретирует аргументы по-разному в зависимости от их типа.

Оператор instanceof

Также это работает с функциями-конструкторами:

…И для встроенных классов, таких как Array :

Алгоритм работы obj instanceof Class работает примерно так:

Другими словами, сравнивается:

В случае с наследованием, совпадение будет на втором шаге:

Вот иллюстрация того как rabbit instanceof Animal сравнивается с Animal.prototype :

Это может приводить к интересным последствиям при изменении свойства prototype после создания объекта.

Бонус: Object.prototype.toString возвращает тип

Мы уже знаем, что обычные объекты преобразуется к строке как [object Object] :

Звучит странно? Так и есть. Давайте развеем мистику.

Согласно спецификации встроенный метод toString может быть позаимствован у объекта и вызван в контексте любого другого значения. И результат зависит от типа этого значения.

Внутри, алгоритм метода toString анализирует контекст вызова this и возвращает соответствующий результат. Больше примеров:

Symbol.toStringTag

Такое свойство есть у большей части объектов, специфичных для определённых окружений. Вот несколько примеров для браузера:

В итоге мы получили «typeof на стероидах», который не только работает с примитивными типами данных, но также и со встроенными объектами, и даже может быть настроен.

Можно использовать <>.toString.call вместо instanceof для встроенных объектов, когда мы хотим получить тип в виде строки, а не просто сделать проверку.

Итого

Давайте обобщим, какие методы для проверки типа мы знаем:

работает для возвращает
typeof примитивов строка
<>.toString примитивов, встроенных объектов, объектов с Symbol.toStringTag строка
instanceof объектов true/false

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

Задачи

Странный instanceof

Источник

Оператор instanceof

— Звучит, как реклама!

— Он, и правда, очень простой. Он используется в виде: «объект» instanceof «класс».

Он проверяет, является ли объект объектом определенного класса. Все еще проще, чем я говорю. Смотри пример:

Код Описание
isInt будет равно true. Объект, на который ссылается переменная o, является объектом класса Integer.
isInt будет равно false. Объект, на который ссылается переменная o, не является объектом класса Integer, он является объектом класса String.
isFIS будет равно true. Объект, на который ссылается переменная is, является объектом класса FileInputStream.

— Этот оператор учитывает и наследование. Вот смотри.

Код Описание
Тут мы видим три объявленных класса: животное, кот и тигр. Кот наследуется от Животного. А Тигр от Кота.
isCat будет равно true.
isTiger будет равно true.
isAnimal будет равно true.
isCat будет равно false.
isTiger будет равно false.
isAnimal будет равно true.
Код Описание
Создадим два класса: Cat, TomCat и интерфейс Moveable
isCat будет равно true.
isMoveable будет равно true.
isTom будет равно true.
isCat будет равно true.
isMoveable будет равно false.
isTom будет равно false.

Другими словами, оператор instanceof вернет значение true, если:

1) переменная а хранит ссылку на объект типа B

2) переменная a хранит ссылку на объект, класс которого унаследован от B

3) переменная а хранит ссылку на объект реализующий интерфейс B

Иначе оператор instanceof вернет значение false.

— Понятно. А зачем это нужно, дядя Риша?

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

Источник

Instanceof java что это

В прошлой главе говорилось о преобразованиях объектов простых типов. Однако с объектами классов все происходит немного по-другому. Допустим, у нас есть следующая иерархия классов:

Суперклассы обычно размещаются выше подклассов, поэтому на вершине наследования находится класс Object, а в самом низу Employee и Client.

Объект подкласса также представляет объект суперкласса. Поэтому в программе мы можем написать следующим образом:

Это так называемое восходящее преобразование (от подкласса внизу к суперклассу вверху иерархии) или upcasting. Такое преобразование осуществляется автоматически.

Обратное не всегда верно. Например, объект Person не всегда является объектом Employee или Client. Поэтому нисходящее преобразование или downcasting от суперкласса к подклассу автоматически не выполняется. В этом случае нам надо использовать операцию преобразования типов.

В данном случае переменная sam приводится к типу Employee. И затем через объект emp мы можем обратиться к функционалу объекта Employee.

Мы можем преобразовать объект Employee по всей прямой линии наследования от Object к Employee.

Примеры нисходящих перобразований:

Но рассмотрим еще одну ситуацию:

В данном случае переменная типа Object хранит ссылку на объект Client. Мы можем без ошибок привести этот объект к типам Person или Client. Но при попытке преобразования к типу Employee мы получим ошибку во время выполнения. Так как kate не представляет объект типа Employee.

Оператор instanceof

А выражение kate instanceof Client возвратило бы true :

Следует отметить, что начиная с версии Java 16 мы можем упростить преобразование типов следующим образом:

Источник

Собеседование по Java — ООП (вопросы и ответы). Часть 2

Вторая часть ответов и вопросов для собеседования по ООП в Java.

Вопросы. Часть 2

21. Зачем нужен оператор instanceof?
22. Зачем нужны и какие бывают блоки инициализации?
23. Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?
24. Где и для чего используется модификатор abstract?
25. Можно ли объявить метод абстрактным и статическим одновременно?
26. Что означает ключевое слово static?
27. К каким конструкциям Java применим модификатор static?
28. Что будет, если в static блоке кода возникнет исключительная ситуация?
29. Можно ли перегрузить static метод?
30. Что такое статический класс, какие особенности его использования?
31. Какие особенности инициализации final static переменных?
32. Как влияет модификатор static на класс/метод/поле?
33. О чем говорит ключевое слово final?
34. Дайте определение понятию “интерфейс”.
35. Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
36. Почему нельзя объявить метод интерфейса с модификатором final или static?
37. Какие типы классов бывают в java (вложенные… и.т.д.)
38. Какие особенности создания вложенных классов: простых и статических.
39. Что вы знаете о вложенных классах, зачем они используются? Классификация, варианты использования, о нарушении инкапсуляции.
40. В чем разница вложенных и внутренних классов?
41. Какие классы называются анонимными?
42. Каким образом из вложенного класса получить доступ к полю внешнего класса?

Ответы. Часть 2

21. Зачем нужен оператор instanceof?

Оператор instanceof возвращает true, если объект является экземпляром класса или его потомком.

Источник

Читайте также:  чартерный полет что значит
Сказочный портал