English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java Управление потоком

Java Массивы

Java Ориентированность на объекты (I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений Java

Java Список (List)

Java Queue (очередь)

Java Map集合

Java Set集合

Java Ввод/вывод (I/O)

Java Reader/Writer

Другие темы Java

Ключевое слово instanceof Java

В этом руководстве вы узнаете о операторе instanceof Java на примерах.

В Java ключевое слово instanceof является двоичным оператором. Оно используется для проверки, является ли объект экземпляром определенного класса.

Оператор также проверяет, является ли объект экземпляром класса, реализующего интерфейс (будет рассмотрено позже в этом руководстве).

Синтаксис instanceof:

result = objectName instanceof className;

 Левая operand оператора instanceof является именем объекта, правая operand - это имя класса. Если объект является экземпляром класса, то результат равен true; если нет, то false.

Пример 1: instanceof

class Main {
    public static void main (String[] args) {
        String name = "w3codebox";
        Integer age = 22;
        System.out.println("name является экземпляром String? "+ (name instanceof String));
        System.out.println("age является экземпляром Integer? "+ (age instanceof Integer));
    }
}

Вывод:

name является экземпляром String? true
age является экземпляром Integer? true

В предыдущем примере мы создали объекты типа String name и另外一个 объект типа Integer age. Затем мы использовали оператор instanceof для проверки, является ли name типом String, а age типом Integer.

instanceof и наследование

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

Пример 2: instanceof в наследовании

class Animal {
}
// Класс Dog является подклассом Animal
class Dog extends Animal {
}
class Main {
    public static void main(String[] args){
        Dog d1 = new Dog();
        // Проверка, является ли d1 объектом Dog
        System.out.println("Является ли d1 экземпляром Dog: " + (d1 instanceof Dog));
       
        // Проверка, является ли d1 объектом Animal
        System.out.println("Является ли d1 экземпляром Animal: " + (d1 instanceof Animal));
    }
}

Вывод:

Является ли d1 экземпляром Dog: true
Является ли d1 экземпляром Animal: true

В примере выше d1 является экземпляром классов Dog и Animal. Поэтому d1 instanceof Dog и d1 instanceof Animal оба true.

Класс Object

В Java все классы наследуются от класса Object, наследование класса Object не требует ключевого слова extends. Это наследование происходит имплицитно в Java.

Пример 3: Класс Object

class Animal {
}
class Dog {
}
class Cat {
}
class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Animal a1 = new Animal();
        Cat c1 = new Cat();
        System.out.println("Является ли d1 экземпляром класса Object: " + (d1 instanceof Object));
        System.out.println("Является ли a1 экземпляром класса Object: " + (a1 instanceof Object));   
        System.out.println("Является ли c1 экземпляром класса Object: " + (c1 instanceof Object));
    }
}

Вывод:

Является ли d1 экземпляром класса Object: true
Является ли a1 экземпляром класса Object: true
Является ли c1 экземпляром класса Object: true

В примере выше мы создали объекты классов Animal, Dog и Cat - a1, d1 и c1. Мы уже использовали оператор instanceof для проверки, являются ли эти объекты a1, d1, c1 также объектами класса Object. Результаты вывода всех true (истина).

Это потому что класс Object является корневым классом, определенным в пакете java.lang. Все другие классы являются подклассами класса Object, формирующего иерархическую структуру в Java.

Преобразование объекта к суперклассу и к подклассу

В Java объект подкласса может рассматриваться как объект суперкласса. Это называется преобразованием к суперклассу.Обычно это означает преобразование объекта подкласса в объект суперкласса. В данном случае объект суперкласса может быть интерфейсом.

Компилятор Java автоматически выполняет преобразование вверх по типу.

Пример 4: Преобразование вверх по типу

class Animal {
    public void displayInfo() {
        System.out.println("Я животное.");
    }
}
class Dog extends Animal {
}
class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Animal a1 = d1;
        a1.displayInfo();
    }
}

Вывод:

Я животное.

В предыдущем примере мы создаем объект класса Dog d1. Мы используем объект d1 для создания объекта класса Animal a1. В Java это называется преобразованием вверх по типу.

Этот код выполняется без проблем. Это потому, что преобразование вверх по типу выполняется автоматически компилятором Java.

Преобразование вниз по типу является обратным процессом преобразования вверх по типу, то есть это процесс, обратный преобразованию вверх по типу, то есть это преобразование объекта класса-предка в объект подкласса.

В случае преобразования вниз по типу объект класса-предка рассматривается как объект подкласса. Мы должны явно указать компилятору на преобразование вниз по типу в Java.

Пример 5: Проблема преобразования вниз по типу

class Animal {
}
class Dog extends Animal {
   public void displayInfo() {
       System.out.println("Я собака.");
   }
}
class Main {
   public static void main(String[] args) {
       Animal a1 = new Animal();
       Dog d1 = (Dog)a1; // Преобразование вниз по типу
 
       d1.displayInfo();
   }
}

При запуске программы возникает исключение ClassCastException. Давайте посмотрим, что происходит здесь.

Здесь мы создаем объект класса-предка Animal a1. Затем мы пытаемся преобразовать объект a1 в объект подкласса Dog d1.

Это вызывает проблему. Это потому, что объект a1 класса-предка Animal может также ссылаться на другие подклассы. Если мы создадим еще один подкласс Cat вместе с Dog, животное может быть и кошкой, и собакой, что вызывает неопределенность.

Чтобы решить эту проблему, мы можем использовать оператор instanceof. Вот как это делается:

Пример 6: Использование instanceof для решения проблемы преобразования вниз по типу

class Animal {
}
class Dog extends Animal {
  public void displayInfo() {
     System.out.println("Я собака");
  }
}
class Main {
  public static void main(String[] args) {
    Dog d1 = new Dog();
    Animal a1 = d1;    // Преобразование вверх по типу
    if (a1 instanceof Dog) {
       Dog d2 = (Dog)a1;    // Преобразование вниз по типу
       d2.displayInfo();
    }
  }
}

Вывод:

Я собака

В предыдущем примере мы используем оператор instanceof для проверки, является ли объект a1 экземпляром класса Dog. Тип преобразования вниз возможен только при условии, что выражение a1 instanceof Dog равно true.

Интерфейс и instanceof

Оператор instanceof также используется для проверки, является ли объект класса также реализацией данного класса интерфейса.

Пример 7: instanceof в интерфейсе

interface Animal {
}
class Dog implements Animal {
}
class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      System.out.println("Является ли объект d1 экземпляром Animal: " + (d1 instanceof Animal));
   }
}

Вывод:

Является ли объект d1 экземпляром Animal: true

В上面的 примере мы создали класс, реализующий интерфейс Animal, Dog.

Затем, создайте объект класса Dog d1. Мы уже использовали оператор instanceof, чтобы проверить, является ли объект d1 также экземпляром интерфейса Animal.