Как проверить, является ли объект экземпляром класса в Java

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

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

Введение

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

С помощью практических примеров вы получите практический опыт использования 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/oop("OOP") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/inheritance("Inheritance") subgraph Lab Skills java/if_else -.-> lab-560010{{"Как проверить, является ли объект экземпляром класса в Java"}} java/classes_objects -.-> lab-560010{{"Как проверить, является ли объект экземпляром класса в Java"}} java/oop -.-> lab-560010{{"Как проверить, является ли объект экземпляром класса в Java"}} java/inheritance -.-> lab-560010{{"Как проверить, является ли объект экземпляром класса в Java"}} end

Использование instanceof для проверки класса

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

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

  1. Откройте WebIDE и убедитесь, что вы находитесь в каталоге ~/project. Вы можете это проверить, посмотрев на приглашение в терминале или введя pwd и нажав Enter.

  2. Создайте новый Java-файл с именем TypeCheck.java в каталоге ~/project. Для этого щелкните правой кнопкой мыши в проводнике файлов слева и выберите "New File", затем введите TypeCheck.java.

  3. Откройте файл TypeCheck.java в редакторе и вставьте следующий код:

    class Animal {
        // Base class
    }
    
    class Dog extends Animal {
        // Subclass of Animal
    }
    
    class Cat extends Animal {
        // Subclass of Animal
    }
    
    public class TypeCheck {
        public static void main(String[] args) {
            Animal myAnimal = new Dog();
    
            // Check if myAnimal is an instance of Dog
            if (myAnimal instanceof Dog) {
                System.out.println("myAnimal is an instance of Dog");
            } else {
                System.out.println("myAnimal is not an instance of Dog");
            }
    
            // Check if myAnimal is an instance of Cat
            if (myAnimal instanceof Cat) {
                System.out.println("myAnimal is an instance of Cat");
            } else {
                System.out.println("myAnimal is not an instance of Cat");
            }
    
            // Check if myAnimal is an instance of Animal
            if (myAnimal instanceof Animal) {
                System.out.println("myAnimal is an instance of Animal");
            } else {
                System.out.println("myAnimal is not an instance of Animal");
            }
        }
    }

    В этом коде:

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

  5. Скомпилируйте Java-программу, открыв терминал внизу WebIDE и выполнив следующую команду:

    javac TypeCheck.java

    Если нет ошибок, эта команда создаст файлы TypeCheck.class, Animal.class, Dog.class и Cat.class в каталоге ~/project.

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

    java TypeCheck

    Вы должны увидеть вывод, похожий на следующий:

    myAnimal is an instance of Dog
    myAnimal is not an instance of Cat
    myAnimal is an instance of Animal

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

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

Тестирование с подклассами

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

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

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

  2. Найдите метод main и добавьте следующие строки кода после существующих проверок для myAnimal:

            System.out.println("\n--- Testing with a Cat object ---");
            Animal anotherAnimal = new Cat();
    
            // Check if anotherAnimal is an instance of Dog
            if (anotherAnimal instanceof Dog) {
                System.out.println("anotherAnimal is an instance of Dog");
            } else {
                System.out.println("anotherAnimal is not an instance of Dog");
            }
    
            // Check if anotherAnimal is an instance of Cat
            if (anotherAnimal instanceof Cat) {
                System.out.println("anotherAnimal is an instance of Cat");
            } else {
                System.out.println("anotherAnimal is not an instance of Cat");
            }
    
            // Check if anotherAnimal is an instance of Animal
            if (anotherAnimal instanceof Animal) {
                System.out.println("anotherAnimal is an instance of Animal");
            } else {
                System.out.println("anotherAnimal is not an instance of Animal");
            }

    Теперь ваш полный файл TypeCheck.java должен выглядеть следующим образом:

    class Animal {
        // Base class
    }
    
    class Dog extends Animal {
        // Subclass of Animal
    }
    
    class Cat extends Animal {
        // Subclass of Animal
    }
    
    public class TypeCheck {
        public static void main(String[] args) {
            Animal myAnimal = new Dog();
    
            // Check if myAnimal is an instance of Dog
            if (myAnimal instanceof Dog) {
                System.out.println("myAnimal is an instance of Dog");
            } else {
                System.out.println("myAnimal is not an instance of Dog");
            }
    
            // Check if myAnimal is an instance of Cat
            if (myAnimal instanceof Cat) {
                System.out.println("myAnimal is an instance of Cat");
            } else {
                System.out.println("myAnimal is not an instance of Cat");
            }
    
            // Check if myAnimal is an instance of Animal
            if (myAnimal instanceof Animal) {
                System.out.println("myAnimal is an instance of Animal");
            } else {
                System.out.println("myAnimal is not an instance of Animal");
            }
    
            System.out.println("\n--- Testing with a Cat object ---");
            Animal anotherAnimal = new Cat();
    
            // Check if anotherAnimal is an instance of Dog
            if (anotherAnimal instanceof Dog) {
                System.out.println("anotherAnimal is an instance of Dog");
            } else {
                System.out.println("anotherAnimal is not an instance of Dog");
            }
    
            // Check if anotherAnimal is an instance of Cat
            if (anotherAnimal instanceof Cat) {
                System.out.println("anotherAnimal is an instance of Cat");
            } else {
                System.out.println("anotherAnimal is not an instance of Cat");
            }
    
            // Check if anotherAnimal is an instance of Animal
            if (anotherAnimal instanceof Animal) {
                System.out.println("anotherAnimal is an instance of Animal");
            } else {
                System.out.println("anotherAnimal is not an instance of Animal");
            }
        }
    }
  3. Сохраните измененный файл TypeCheck.java.

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

    javac TypeCheck.java
  5. Запустите скомпилированную программу:

    java TypeCheck

    Теперь вы должны увидеть вывод, похожий на следующий:

    myAnimal is an instance of Dog
    myAnimal is not an instance of Cat
    myAnimal is an instance of Animal
    
    --- Testing with a Cat object ---
    anotherAnimal is not an instance of Dog
    anotherAnimal is an instance of Cat
    anotherAnimal is an instance of Animal

    Этот вывод показывает, что anotherAnimal, который содержит объект Cat, является экземпляром Cat и Animal, но не Dog. Это подтверждает концепцию, что instanceof проверяет фактический тип объекта и его иерархию наследования.

Вы успешно протестировали ключевое слово instanceof с разными объектами подклассов. На следующем этапе мы увидим, как instanceof ведет себя с null-объектами.

Проверка с null-объектами

На этом последнем этапе мы исследуем, как ведет себя ключевое слово instanceof, когда проверяемый объект равен null. Понимание этого аспекта важно для избежания потенциальных ошибок в ваших Java-программах.

Мы снова изменим файл TypeCheck.java, чтобы включить тест с null-объектом.

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

  2. Добавьте следующие строки кода в конце метода main, после предыдущих тестов:

            System.out.println("\n--- Testing with a null object ---");
            Animal nullAnimal = null;
    
            // Check if nullAnimal is an instance of Dog
            if (nullAnimal instanceof Dog) {
                System.out.println("nullAnimal is an instance of Dog");
            } else {
                System.out.println("nullAnimal is not an instance of Dog");
            }
    
            // Check if nullAnimal is an instance of Animal
            if (nullAnimal instanceof Animal) {
                System.out.println("nullAnimal is an instance of Animal");
            } else {
                System.out.println("nullAnimal is not an instance of Animal");
            }

    Теперь ваш полный файл TypeCheck.java должен выглядеть следующим образом:

    class Animal {
        // Base class
    }
    
    class Dog extends Animal {
        // Subclass of Animal
    }
    
    class Cat extends Animal {
        // Subclass of Animal
    }
    
    public class TypeCheck {
        public static void main(String[] args) {
            Animal myAnimal = new Dog();
    
            // Check if myAnimal is an instance of Dog
            if (myAnimal instanceof Dog) {
                System.out.println("myAnimal is an instance of Dog");
            } else {
                System.out.println("myAnimal is not an instance of Dog");
            }
    
            // Check if myAnimal is an instance of Cat
            if (myAnimal instanceof Cat) {
                System.out.println("myAnimal is not an instance of Cat");
            } else {
                System.out.println("myAnimal is not an instance of Cat");
            }
    
            // Check if myAnimal is an instance of Animal
            if (myAnimal instanceof Animal) {
                System.out.println("myAnimal is an instance of Animal");
            } else {
                System.out.println("myAnimal is not an instance of Animal");
            }
    
            System.out.println("\n--- Testing with a Cat object ---");
            Animal anotherAnimal = new Cat();
    
            // Check if anotherAnimal is an instance of Dog
            if (anotherAnimal instanceof Dog) {
                System.out.println("anotherAnimal is not an instance of Dog");
            } else {
                System.out.println("anotherAnimal is not an instance of Dog");
            }
    
            // Check if anotherAnimal is an instance of Cat
            if (anotherAnimal instanceof Cat) {
                System.out.println("anotherAnimal is an instance of Cat");
            } else {
                System.out.println("anotherAnimal is an instance of Cat");
            }
    
            // Check if anotherAnimal is an instance of Animal
            if (anotherAnimal instanceof Animal) {
                System.out.println("anotherAnimal is an instance of Animal");
            } else {
                System.out.println("anotherAnimal is an instance of Animal");
            }
    
            System.out.println("\n--- Testing with a null object ---");
            Animal nullAnimal = null;
    
            // Check if nullAnimal is an instance of Dog
            if (nullAnimal instanceof Dog) {
                System.out.println("nullAnimal is an instance of Dog");
            } else {
                System.out.println("nullAnimal is not an instance of Dog");
            }
    
            // Check if nullAnimal is an instance of Animal
            if (nullAnimal instanceof Animal) {
                System.out.println("nullAnimal is an instance of Animal");
            } else {
                System.out.println("nullAnimal is not an instance of Animal");
            }
        }
    }
  3. Сохраните измененный файл TypeCheck.java.

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

    javac TypeCheck.java
  5. Запустите скомпилированную программу:

    java TypeCheck

    Вы должны увидеть вывод, похожий на следующий:

    myAnimal is an instance of Dog
    myAnimal is not an instance of Cat
    myAnimal is an instance of Animal
    
    --- Testing with a Cat object ---
    anotherAnimal is not an instance of Dog
    anotherAnimal is an instance of Cat
    anotherAnimal is an instance of Animal
    
    --- Testing with a null object ---
    nullAnimal is not an instance of Dog
    nullAnimal is not an instance of Animal

    Как вы можете видеть из вывода, когда объект, проверяемый с использованием instanceof, равен null, результат всегда false. Это важный момент, который необходимо помнить при использовании instanceof, чтобы избежать неожиданного поведения или NullPointerException.

Вы успешно проверили, как ведет себя ключевое слово instanceof с null-объектами. Это завершает наше исследование ключевого слова instanceof.

Резюме

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

Мы также исследовали, как instanceof ведет себя с подклассами, подтвердив, что объект считается экземпляром своего собственного класса, а также любых суперклассов. Наконец, мы изучили поведение instanceof при применении к null-объектам и поняли, что в таких случаях оно всегда возвращает false.