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

Оператор instanceof

Открыта

— Привет, Амиго! Ты уже раньше знакомился с оператором 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.

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

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

Комментарии (147)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
C0N5P1RACY
Уровень 38
27 января, 09:26
Эх, а мне нравились всякие истории в самом начале курса, которые были в прошлом квесте :(
Anonymous #3585174
Уровень 33
11 августа 2025, 10:45
Like
8 апреля 2025, 12:21
есть мнение, что присутствие в коде instanceof является маркером "плохого" кода
Евгений
Уровень 37
21 апреля 2025, 12:56
почему?
21 апреля 2025, 18:57
потому что чаще всего это костыль для того, чтобы не делать полиморфизм или не переписывать много кода.
21 апреля 2025, 18:57
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, 18:58
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, 17:12
Пролетарии всех стран, соединяйтесь!
Майор IT
Уровень 26
18 января 2025, 10:39
Трудно, но я иду!
11 декабря 2024, 10:36
Philipp Vasichev
Уровень 28
22 сентября 2024, 10:35
🤫
Vladislav Ermolaev
Уровень 1
5 сентября 2024, 07:55
+
{Java_Shark}
Уровень 36
26 августа 2024, 13:06
++
27 июля 2024, 07:40
++🍅🍅