Как проверить, является ли объект определенного типа в Java

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Затем вы протестируете оператор instanceof с различными типами классов и изучите, как он ведет себя с подклассами и суперклассами. Наконец, вы научитесь обрабатывать нулевые объекты (null objects) при использовании instanceof, чтобы избежать потенциальных ошибок.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/inheritance("Inheritance") subgraph Lab Skills java/if_else -.-> lab-560012{{"Как проверить, является ли объект определенного типа в Java"}} java/classes_objects -.-> lab-560012{{"Как проверить, является ли объект определенного типа в Java"}} java/inheritance -.-> lab-560012{{"Как проверить, является ли объект определенного типа в Java"}} end

Использование оператора instanceof

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

Создадим простую Java-программу, чтобы продемонстрировать, как работает оператор instanceof.

  1. Откройте файл HelloJava.java в редакторе WebIDE, если он еще не открыт.

  2. Замените все содержимое файла следующим кодом:

    class Animal {
        public void makeSound() {
            System.out.println("Generic animal sound");
        }
    }
    
    class Dog extends Animal {
        public void makeSound() {
            System.out.println("Woof!");
        }
    }
    
    class Cat extends Animal {
        public void makeSound() {
            System.out.println("Meow!");
        }
    }
    
    public class HelloJava {
        public static void main(String[] args) {
            Animal myAnimal = new Dog();
    
            if (myAnimal instanceof Dog) {
                System.out.println("myAnimal is an instance of Dog");
            }
    
            if (myAnimal instanceof Cat) {
                System.out.println("myAnimal is an instance of Cat");
            }
    
            if (myAnimal instanceof Animal) {
                System.out.println("myAnimal is an instance of Animal");
            }
        }
    }

    В этом коде:

    • Мы определяем базовый класс Animal и два подкласса Dog и Cat.
    • В методе main мы создаем переменную myAnimal типа Animal и присваиваем ей объект класса Dog.
    • Затем мы используем оператор instanceof для проверки, является ли myAnimal экземпляром классов Dog, Cat и Animal.
  3. Сохраните файл (Ctrl+S или Cmd+S).

  4. Скомпилируйте программу с помощью команды javac в терминале:

    javac HelloJava.java
  5. Запустите скомпилированную программу с помощью команды java:

    java HelloJava

    Вы должны увидеть вывод, показывающий, какие проверки с использованием instanceof вернули true.

    myAnimal is an instance of Dog
    myAnimal is an instance of Animal

    Как вы можете видеть, myAnimal является экземпляром класса Dog (потому что мы создали объект класса Dog) и также экземпляром класса Animal (потому что Dog является подклассом Animal). Он не является экземпляром класса Cat.

Тестирование с разными классами

На предыдущем этапе вы увидели, как работает оператор instanceof с подклассом и его суперклассом. Теперь давайте исследуем, как он ведет себя при проверке на принадлежность к разным, несвязанным классам.

Мы изменим существующий файл HelloJava.java, чтобы добавить еще один класс и протестировать оператор instanceof с объектами разных типов.

  1. Откройте файл HelloJava.java в редакторе WebIDE.

  2. Добавьте новый класс с именем Car в файл. Вы можете добавить это определение класса до или после классов Animal, Dog и Cat, но вне класса HelloJava.

    class Car {
        public void drive() {
            System.out.println("Driving a car");
        }
    }
  3. Теперь изменим метод main в классе HelloJava, чтобы создать объект класса Car и протестировать оператор instanceof. Обновите метод main так, чтобы он выглядел следующим образом:

    public class HelloJava {
        public static void main(String[] args) {
            Animal myAnimal = new Dog();
            Car myCar = new Car();
    
            if (myAnimal instanceof Dog) {
                System.out.println("myAnimal is an instance of Dog");
            }
    
            if (myAnimal instanceof Cat) {
                System.out.println("myAnimal is an instance of Cat");
            }
    
            if (myAnimal instanceof Animal) {
                System.out.println("myAnimal is an instance of Animal");
            }
    
            System.out.println("--- Testing Car object ---");
    
            if (myCar instanceof Car) {
                System.out.println("myCar is an instance of Car");
            }
    
            if (myCar instanceof Animal) {
                System.out.println("myCar is an instance of Animal");
            }
        }
    }

    Мы добавили новый объект myCar класса Car и включили проверки с использованием instanceof для него по отношению к классам Car и Animal.

  4. Сохраните файл (Ctrl+S или Cmd+S).

  5. Скомпилируйте модифицированную программу:

    javac HelloJava.java
  6. Запустите программу:

    java HelloJava

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

    myAnimal is an instance of Dog
    myAnimal is an instance of Animal
    --- Testing Car object ---
    myCar is an instance of Car

    Этот вывод подтверждает, что myCar является экземпляром класса Car, но не является экземпляром класса Animal, потому что класс Car не наследуется от класса Animal. Оператор instanceof правильно определяет тип связи (или ее отсутствие) между объектами и классами.

Работа с нулевыми объектами

На этом последнем этапе мы рассмотрим, как работает оператор instanceof при работе с нулевыми (null) объектами. Понимание этого аспекта важно для избежания непредвиденных ошибок в ваших программах.

В Java нулевая ссылка (null reference) означает, что переменная не ссылается ни на какой объект. Когда вы используете оператор instanceof с нулевой ссылкой, он всегда возвращает false. Это встроенная защитная функция оператора.

Давайте внесем последнее изменение в файл HelloJava.java, чтобы включить нулевой объект и протестировать оператор instanceof.

  1. Откройте файл HelloJava.java в редакторе WebIDE.

  2. Измените метод main в классе HelloJava, чтобы включить нулевую ссылку на объект класса Animal и проверить ее. Обновите метод main так, чтобы он выглядел следующим образом:

    class Animal {
        public void makeSound() {
            System.out.println("Generic animal sound");
        }
    }
    
    class Dog extends Animal {
        public void makeSound() {
            System.out.println("Woof!");
        }
    }
    
    class Cat extends Animal {
        public void makeSound() {
            System.out.println("Meow!");
        }
    }
    
    class Car {
        public void drive() {
            System.out.println("Driving a car");
        }
    }
    
    public class HelloJava {
        public static void main(String[] args) {
            Animal myAnimal = new Dog();
            Car myCar = new Car();
            Animal nullAnimal = null; // Declare a null Animal reference
    
            if (myAnimal instanceof Dog) {
                System.out.println("myAnimal is an instance of Dog");
            }
    
            if (myAnimal instanceof Cat) {
                System.out.println("myAnimal is an instance of Cat");
            }
    
            if (myAnimal instanceof Animal) {
                System.out.println("myAnimal is an instance of Animal");
            }
    
            System.out.println("--- Testing Car object ---");
    
            if (myCar instanceof Car) {
                System.out.println("myCar is an instance of Car");
            }
    
            if (myCar instanceof Animal) {
                System.out.println("myCar is an instance of Animal");
            }
    
            System.out.println("--- Testing null object ---");
    
            if (nullAnimal instanceof Animal) {
                System.out.println("nullAnimal is an instance of Animal");
            }
    
            if (nullAnimal instanceof Dog) {
                System.out.println("nullAnimal is an instance of Dog");
            }
        }
    }

    Мы добавили новую переменную nullAnimal типа Animal и инициализировали ее значением null. Затем мы выполняем проверки с использованием instanceof для этой переменной.

  3. Сохраните файл (Ctrl+S или Cmd+S).

  4. Скомпилируйте программу:

    javac HelloJava.java
  5. Запустите программу:

    java HelloJava

    Обратите внимание на вывод. Вы должны увидеть результаты предыдущих этапов, за которыми следуют результаты проверок для nullAnimal.

    myAnimal is an instance of Dog
    myAnimal is an instance of Animal
    --- Testing Car object ---
    myCar is an instance of Car
    --- Testing null object ---

    Обратите внимание, что строки внутри блоков if для nullAnimal не выводятся. Это потому, что выражения nullAnimal instanceof Animal и nullAnimal instanceof Dog оба оцениваются в false. Это демонстрирует, что оператор instanceof правильно обрабатывает нулевые ссылки, возвращая false.

Понимание того, как работает instanceof с нулевыми ссылками, является важным аспектом при написании надежного Java-кода, который избавляет от ошибок NullPointerException.

Резюме

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