JavaRush /Курсы /Java Core /Оператор instanceof

Оператор instanceof

Java Core
4 уровень , 1 лекция
Открыта

— Привет, Амиго! Ты уже раньше знакомился с оператором instanceof. Сегодня я расскажу тебе, как и где его можно использовать. instanceof – это очень простой и эффективный в использовании оператор.

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

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

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

Код Описание
Object o = new Integer(3);
boolean isInt = o instanceof Integer;
isInt будет равно true. Объект, на который ссылается переменная o, является объектом класса Integer.
Object o = "Mama";
boolean isInt = o instanceof Integer;
isInt будет равно false. Объект, на который ссылается переменная o, не является объектом класса Integer, он является объектом класса String.
InputStream is = new FileInputStream("");
boolean isFIS = is instanceof
FileInputStream;
isFIS будет равно true. Объект, на который ссылается переменная is, является объектом класса FileInputStream.
4
Задача
Java Core, 4 уровень, 1 лекция
Недоступна
Набираем код Ӏ Java Core: 4 уровень, 1 лекция
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;
isCat будет равно true.
isTiger будет равно true.
isAnimal будет равно true.
Object o = new Animal();
boolean isCat = o instanceof Cat;
boolean isTiger = o instanceof Tiger;
boolean isAnimal = o instanceof Animal;
isCat будет равно false.
isTiger будет равно false.
isAnimal будет равно true.

И даже интерфейсы:

Код Описание
interface Moveable {}
class Cat {}
class TomCat extends Cat implements Moveable {}
Создадим два класса: Cat, TomCat и интерфейс Moveable
Cat o = new TomCat();
boolean isCat = o instanceof Cat;
boolean isMoveable = o instanceof Moveable;
boolean isTom = o instanceof TomCat;
isCat будет равно true.
isMoveable будет равно true.
isTom будет равно true.
Cat o = new Cat();
boolean isCat = o instanceof Cat;
boolean isMoveable = o instanceof Moveable;
boolean isTom = o instanceof TomCat;
isCat будет равно true.
isMoveable будет равно false.
isTom будет равно false.

Оператор instanceof имеет вид: a instanceof B.

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

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

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

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

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

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

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

Комментарии (146)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3585174 Уровень 33
11 августа 2025
Like
8 апреля 2025
есть мнение, что присутствие в коде instanceof является маркером "плохого" кода
Евгений Уровень 37
21 апреля 2025
почему?
21 апреля 2025
потому что чаще всего это костыль для того, чтобы не делать полиморфизм или не переписывать много кода.
21 апреля 2025

package org.example.sample;

import lombok.extern.slf4j.Slf4j;

import java.util.List;

@Slf4j
public class BadSample {

    public static void main(String[] args) {

        List.of(new Tiger(), new Wolf(), new Tiger()).forEach(animal -> {
            if (animal instanceof Tiger) {
                petTiger();
            } else if (animal instanceof Wolf) {
                petWolf();
            } else {
                log.info("wtf?!");
            }
        });
    }

    public static abstract class Animal {

    }

    public static class Tiger extends Animal {

    }

    public static class Wolf extends Animal {

    }

    private static void petTiger() {
        log.info("Meow-meow-meow!");
    }

    private static void petWolf() {
        log.info("Auf-auf-auf!");
    }
}

21 апреля 2025

package org.example.sample;

import lombok.extern.slf4j.Slf4j;

import java.util.List;

@Slf4j
public class BetterSample {

    public static void main(String[] args) {

        List.of(new Tiger(), new Wolf(), new Tiger()).forEach(BetterSample::pet);
    }

    public static abstract class Animal {

        public abstract void pet();
    }

    public static class Tiger extends Animal {

        @Override
        public void pet() {
            log.info("Meow-meow-meow!");
        }
    }

    public static class Wolf extends Animal {

        @Override
        public void pet() {
            log.info("Auf-auf-auf!");
        }
    }

    private static void pet(Animal animal) {
        animal.pet();
    }
}


Artemii Уровень 30
28 января 2025
Пролетарии всех стран, соединяйтесь!
Майор IT Уровень 26
18 января 2025
Трудно, но я иду!
11 декабря 2024
Philipp Vasichev Уровень 28
22 сентября 2024
🤫
Vladislav Ermolaev Уровень 1
5 сентября 2024
+
{Java_Shark} Уровень 36
26 августа 2024
++
Korneplod 19 y.o. talent Уровень 3
27 июля 2024
++🍅🍅
Кирилл Уровень 34
20 марта 2024
С новым уровнем всех! Вошло в привычку после каждой лекции заглянуть в комментарии. 2-3 страницы свежих, и 1-2 топовых. Пишите коллеги, вас правда читают😄