Java instanceof Operator
Java instanceof operator (also called type comparison operator) is used to test whether the specified object is an instance of the specified type (class, subclass, or interface).
- true – if the variable is an instance of the specified class, its parent class or implements specified interface, or its parent interface
- false – if the variable is no instance of the class or implement the interface, or the variable is null.
HashMap map = new HashMap(); assertTrue( map instanceof Map ); assertTrue( map instanceof AbstractMap ); assertFalse( map instanceof List ); map = null; assertFalse( map instanceof Map );
1. Syntax of instanceof Operator
The instanceof operator tests variables to the specified type. Variable is written on the left-hand side of the operator, and type is given on the right side of the operator.
boolean value = variable instanceof ClassType; //or if(variable instanceof ClassType) < //perform some action >
2. The instanceof Operator does not need an Explicit null Check
In Java, null is a type so we do not need to check for NullPointerException when using the instanceof operator. The instanceof does it internally for us.
if(map != null && map instanceof Map) < //some action >
In the previous example, we do not need to make an explicit null check. The correct way to write the expression is:
3. Using instanceof with an Array
In Java, arrays are also considered objects and have associated fields and methods. So we can use instanceof operator with arrays as well.
Primitive arrays are instances of Object and self-type. e.g. int[] is type of Object and int[]. Both comparisons return true.
int[] intArr = new int[0]; Assertions.assertTrue(intArr instanceof Object); Assertions.assertTrue(intArr instanceof int[]);
Object arrays are types of Object, Object[], classtype array, and parent class type array. e.g. Integer[] is type of Object, Object[], Integer[] and Number[] ( Integer extends Number ).
Integer[] integerArr = new Integer[0]; Assertions.assertTrue(integerArr instanceof Object); Assertions.assertTrue(integerArr instanceof Object[]); Assertions.assertTrue(integerArr instanceof Integer[]); Assertions.assertTrue(integerArr instanceof Number[]);
A real-life example of using instanceof operator can be typecasting a variable to another type. The instanceof operator helps in avoiding ClassCastException in runtime.
Consider the following example where we are trying to typecast a list to LinkedList class, where the original variable is of type ArrayList. It will throw ClassCastException.
List list = new ArrayList<>(); LinkedList linkedList = (LinkedList) list; //ClassCastException
To correctly cast the variable, we can use instanceof operator. It will not result in ClassCastException.
List list = new ArrayList<>(); if(list instanceof LinkedList) < LinkedListlinkedList = (LinkedList) list; //other actions > else if(list instanceof ArrayList) < ArrayListarrayList = (ArrayList) list; //other actions >
Since Java 14, instanceof operator supports pattern matching. We can rewrite the above expression more concisely:
List list = new ArrayList<>(); if(list instanceof LinkedList linkedList) < //use linkedlist variable here >else if(list instanceof ArrayList arrayList) < //use arraylist variable here >
Drop me your questions related to the instanceof operator used for type comparison.
Что такое instanceof в java
Привет всем читающим 🙂 value это приватное статичное поле класса String, ей присвоено значение объекта String. String text = «123»; String text2 = «456»; text.equals(text2); // «123» это value
Про реализацию метода equals в классе String: Для пояснений можно взять следующий код: (можно в IDE его скопировать, чтоб посмотреть вывод)
String first = "привет"; String linkToFirst = first; String second = new String ("привет"); System.out.println(first.equals(linkToFirst)); System.out.println(first.equals(second));
Первый System.out.println выведет true. И дойдет проверка только до первого if. Мы вызываем у объекта «first«, типа String, метод equals, передавая в качестве параметра другую строку «linkToFirst«, которая, как мы видим, просто ссылается на тот же самый объект. Оператор «this» ссылается на объект, который вызвал этот метод. В нашем случае — это «first» вызвал метод «equals«, и в качестве передаваемого параметра отправил туда second. Когда мы написали в коде this, то подразумевали — «first«. Т.е. Это можно прочитать как:
public boolean equals(Object anObject) < if (first == second)
Так почему же мы попадем только в первый if? Потому что при использовании оператора == при сравнении объектов, сравниваются не сами объекты, а только ссылки на них. А у нас как раз такая история - мы ссылаемся на один и тот же объект, получаем return true, и вывод в консоль true.
public boolean equals(Object anObject)
Второй System.out.println выведет также true, но проверка уже пойдет по всему методу, ибо первый if выдаст false. Ведь second не ссылается на first привет, а ссылается на новый объект
if (anObject instanceof String) < //Проверяем, является ли строкой, // переданный в метод объект (second) String anotherString = (String) anObject; //если да, то приводим // переданный объект к типу String int n = value.length; // value - это массив символов*, объекта String, // который вызывает метод equals. // value.length - его длина. *- на самом деле это массив байтов, и каждый // символ может быть представлен в виде 1, 2, 3 или даже 4 байтами, // но сути это не меняет if (n == anotherString.value.length) < // сравниваем длину массива // символов текущего объекта, с переданным т.е. длину first и second) char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) < // далее мы в цикле уменьшаем количество // заходов в while и поочередно сравниваем между собой элементы (символы) // массивов исходного "first " и переданного // "second" (берется один и тот же индекс массива - "i"). // Как только они не совпадут - false и выход из цикла. // Если цикл завершился без преждевременного окончания, // значит объекты идентичны. if (v1[i] != v2[i]) return false; i++; > return true; > > return false;
Что такое instanceof в java
Вопрос на собеседовании: Интервьюер: - "Кстати, а почему это вообще работает? Разве так можно делать?" Я: - "Можно. Ведь любой мейн-кун — это кошка. ". Джесси, спасибо! От души в душу.
сорян.. но тут кто-то повторял лекцию по памяти на всеобщее обозрение, а не писал что-то полезное.. конечно может быть это из-за разницы года написания 2018 и прочтения её в 2023 году.. ну тогда видимо надо убрать ссылку на это из основной лекции курса
В примере ниже оба instanceof истинны. Как такое произошло? У интерфейсов появились конструкторы? В java появилось множественное наследование? Интересно услышать мнение и объяснение автора статьи.
public class InstanceOfMyExample < public static void main(String[] args) < Bird bird = new Bird(); System.out.println(bird instanceof Animal); // true System.out.println(bird instanceof Fly); // true >> interface Fly < >class Animal < >class Bird extends Animal implements Fly
И еще момент. Если мы в классе-потомке переопределили метод родительского класса, но хотим вызвать метод родительского класса, то этого можно добиться, добавив слово super с точкой перед вызовом метода родительского класса, например:
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.
Оператор instanceof
— Привет, Амиго! Ты уже раньше знакомился с оператором instanceof . Сегодня я расскажу тебе, как и где его можно использовать. instanceof – это очень простой и эффективный в использовании оператор.
— Он, и правда, очень простой. Он используется в виде: «объект» instanceof «класс».
Он проверяет, является ли объект объектом определенного класса. Все еще проще, чем я говорю. Смотри пример:
Object o = new Integer(3); boolean isInt = o instanceof Integer;
Object o = "Mama"; boolean isInt = o instanceof Integer;
InputStream is = new FileInputStream(""); boolean isFIS = is instanceof FileInputStream;
Java Core: 4 уровень, 1 лекция. Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.
— Этот оператор учитывает и наследование. Вот смотри.
class Animal < >class Cat extends Animal < >class Tiger extends Cat
Object o = new Tiger(); boolean isCat = o instanceof Cat; boolean isTiger = o instanceof Tiger; boolean isAnimal = o instanceof Animal;
Object o = new Animal(); boolean isCat = o instanceof Cat; boolean isTiger = o instanceof Tiger; boolean isAnimal = o instanceof Animal;
interface Moveable < >class Cat < >class TomCat extends Cat implements Moveable
Cat o = new TomCat(); boolean isCat = o instanceof Cat; boolean isMoveable = o instanceof Moveable; boolean isTom = o instanceof TomCat;
Cat o = new Cat(); boolean isCat = o instanceof Cat; boolean isMoveable = o instanceof Moveable; boolean isTom = o instanceof TomCat;
Оператор instanceof имеет вид: a instanceof B .
Другими словами, оператор instanceof вернет значение true, если:
1) переменная а хранит ссылку на объект типа B
2) переменная a хранит ссылку на объект, класс которого унаследован от B
3) переменная а хранит ссылку на объект реализующий интерфейс B
Иначе оператор instanceof вернет значение false.
— Понятно. А зачем это нужно, дядя Риша?
— Об этом сегодня тебе расскажет Элли. Это очень хороший оператор. Сегодня ты в этом убедишься.