Введение
В этом практическом занятии (лабораторной работе) вы научитесь проверять, является ли объект определенного типа в Java с использованием оператора instanceof. Сначала вы познакомитесь с базовым использованием instanceof с разными классами, включая наследование.
Затем вы протестируете оператор instanceof с различными типами классов и изучите, как он ведет себя с подклассами и суперклассами. Наконец, вы научитесь обрабатывать нулевые объекты (null objects) при использовании instanceof, чтобы избежать потенциальных ошибок.
Использование оператора instanceof
На этом этапе вы узнаете о операторе instanceof в Java. Оператор instanceof используется для проверки, является ли объект экземпляром определенного класса или реализует определенный интерфейс. Это полезный инструмент для проверки типа объекта во время выполнения программы.
Создадим простую Java-программу, чтобы продемонстрировать, как работает оператор instanceof.
Откройте файл
HelloJava.javaв редакторе WebIDE, если он еще не открыт.Замените все содержимое файла следующим кодом:
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.
- Мы определяем базовый класс
Сохраните файл (Ctrl+S или Cmd+S).
Скомпилируйте программу с помощью команды
javacв терминале:javac HelloJava.javaЗапустите скомпилированную программу с помощью команды
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 с объектами разных типов.
Откройте файл
HelloJava.javaв редакторе WebIDE.Добавьте новый класс с именем
Carв файл. Вы можете добавить это определение класса до или после классовAnimal,DogиCat, но вне классаHelloJava.class Car { public void drive() { System.out.println("Driving a car"); } }Теперь изменим метод
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.Сохраните файл (Ctrl+S или Cmd+S).
Скомпилируйте модифицированную программу:
javac HelloJava.javaЗапустите программу:
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.
Откройте файл
HelloJava.javaв редакторе WebIDE.Измените метод
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для этой переменной.Сохраните файл (Ctrl+S или Cmd+S).
Скомпилируйте программу:
javac HelloJava.javaЗапустите программу:
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 при проверке объекта по отношению к его фактическому классу, суперклассу и несвязанным классам.



