Введение
В этом практическом занятии (лабораторной работе) вы узнаете, как проверить, является ли объект экземпляром определенного класса или интерфейса в Java с использованием ключевого слова instanceof. Мы рассмотрим его базовое использование, протестируем его поведение с подклассами и поймем, как оно обрабатывает нулевые объекты.
С помощью практических примеров вы получите практический опыт использования instanceof для выполнения проверки типа во время выполнения, что является фундаментальным концептом в объектно-ориентированном программировании.
Использование instanceof для проверки класса
На этом этапе мы рассмотрим ключевое слово instanceof в Java. Ключевое слово instanceof используется для проверки, является ли объект экземпляром определенного класса или реализует определенный интерфейс. Это полезный инструмент для проверки типа объекта во время выполнения программы.
Создадим простую Java-программу, чтобы продемонстрировать, как работает instanceof.
Откройте WebIDE и убедитесь, что вы находитесь в каталоге
~/project. Вы можете это проверить, посмотрев на приглашение в терминале или введяpwdи нажав Enter.Создайте новый Java-файл с именем
TypeCheck.javaв каталоге~/project. Для этого щелкните правой кнопкой мыши в проводнике файлов слева и выберите "New File", затем введитеTypeCheck.java.Откройте файл
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.
- Мы определяем базовый класс
Сохраните файл
TypeCheck.java(Ctrl+S или Cmd+S).Скомпилируйте Java-программу, открыв терминал внизу WebIDE и выполнив следующую команду:
javac TypeCheck.javaЕсли нет ошибок, эта команда создаст файлы
TypeCheck.class,Animal.class,Dog.classиCat.classв каталоге~/project.Запустите скомпилированную программу с помощью следующей команды:
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.
Откройте файл
TypeCheck.javaв редакторе WebIDE.Найдите метод
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"); } } }Сохраните измененный файл
TypeCheck.java.Скомпилируйте программу снова в терминале:
javac TypeCheck.javaЗапустите скомпилированную программу:
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-объектом.
Откройте файл
TypeCheck.javaв редакторе WebIDE.Добавьте следующие строки кода в конце метода
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"); } } }Сохраните измененный файл
TypeCheck.java.Скомпилируйте программу в терминале:
javac TypeCheck.javaЗапустите скомпилированную программу:
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.



