Introdução
Neste laboratório, você aprenderá como verificar se um objeto é de um tipo específico em Java usando o operador instanceof. Você começará entendendo o uso básico de instanceof com diferentes classes, incluindo herança.
Em seguida, você testará o operador instanceof com vários tipos de classe e explorará como ele se comporta com subclasses e superclasses. Finalmente, você aprenderá como lidar com objetos nulos ao usar instanceof para evitar possíveis erros.
Usar o Operador instanceof
Nesta etapa, você aprenderá sobre o operador instanceof em Java. O operador instanceof é usado para testar se um objeto é uma instância de uma classe específica ou implementa uma interface específica. É uma ferramenta útil para verificar o tipo de um objeto em tempo de execução.
Vamos criar um programa Java simples para demonstrar como o operador instanceof funciona.
Abra o arquivo
HelloJava.javano editor WebIDE, caso ainda não esteja aberto.Substitua todo o conteúdo do arquivo pelo seguinte código:
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"); } } }Neste código:
- Definimos uma classe base
Animale duas subclassesDogeCat. - No método
main, criamos uma variávelAnimalchamadamyAnimale atribuímos um objetoDoga ela. - Em seguida, usamos o operador
instanceofpara verificar semyAnimalé uma instância deDog,CateAnimal.
- Definimos uma classe base
Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa usando o comando
javacno Terminal:javac HelloJava.javaExecute o programa compilado usando o comando
java:java HelloJavaVocê deve ver a saída indicando quais verificações
instanceofretornaramtrue.myAnimal is an instance of Dog myAnimal is an instance of AnimalComo você pode ver,
myAnimalé uma instância deDog(porque criamos um objetoDog) e também uma instância deAnimal(porqueDogé uma subclasse deAnimal). Ele não é uma instância deCat.
Testar com Diferentes Classes
Na etapa anterior, você viu como instanceof funciona com uma subclasse e sua superclasse. Agora, vamos explorar como ele se comporta ao testar com classes diferentes e não relacionadas.
Vamos modificar nosso arquivo HelloJava.java existente para incluir outra classe e testar o operador instanceof com objetos de diferentes tipos.
Abra o arquivo
HelloJava.javano editor WebIDE.Adicione uma nova classe chamada
Carao arquivo. Você pode adicionar esta definição de classe antes ou depois das classesAnimal,DogeCat, mas fora da classeHelloJava.class Car { public void drive() { System.out.println("Driving a car"); } }Agora, vamos modificar o método
maindentro da classeHelloJavapara criar um objetoCare testar o operadorinstanceof. Atualize o métodomainpara que se pareça com isto: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"); } } }Adicionamos um novo objeto
CarchamadomyCare incluímos verificaçõesinstanceofpara ele em relação aCareAnimal.Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa modificado:
javac HelloJava.javaExecute o programa:
java HelloJavaObserve a saída. Você deve ver os resultados da etapa anterior, seguidos pelos resultados das novas verificações para o objeto
Car.myAnimal is an instance of Dog myAnimal is an instance of Animal --- Testing Car object --- myCar is an instance of CarEsta saída confirma que
myCaré uma instância deCar, mas não é uma instância deAnimalporqueCarnão herda deAnimal. O operadorinstanceofidentifica corretamente a relação de tipo (ou a falta dela) entre objetos e classes.
Lidar com Objetos Nulos
Nesta etapa final, exploraremos como o operador instanceof se comporta ao lidar com objetos null. Entender isso é importante para evitar erros inesperados em seus programas.
Uma referência null em Java significa que uma variável não se refere a nenhum objeto. Quando você usa o operador instanceof com uma referência null, ele sempre retornará false. Este é um recurso de segurança integrado do operador.
Vamos modificar nosso arquivo HelloJava.java pela última vez para incluir um objeto null e testar o operador instanceof.
Abra o arquivo
HelloJava.javano editor WebIDE.Modifique o método
maindentro da classeHelloJavapara incluir uma referênciaAnimalnulle testá-la. Atualize o métodomainpara que se pareça com isto: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"); } } }Adicionamos uma nova variável
AnimalchamadanullAnimale a inicializamos comnull. Em seguida, realizamos verificaçõesinstanceofem relação a ela.Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa:
javac HelloJava.javaExecute o programa:
java HelloJavaObserve a saída. Você deve ver os resultados das etapas anteriores, seguidos pelos resultados das verificações para
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 ---Observe que as linhas dentro dos blocos
ifparanullAnimalnão são impressas. Isso ocorre porquenullAnimal instanceof AnimalenullAnimal instanceof Dogavaliam parafalse. Isso demonstra que o operadorinstanceoflida corretamente com referênciasnullretornandofalse.
Entender como instanceof funciona com null é crucial para escrever código Java robusto que evita erros NullPointerException.
Resumo
Neste laboratório, você aprendeu como verificar se um objeto é de um tipo específico em Java usando o operador instanceof. Você praticou o uso de instanceof com diferentes classes, incluindo uma classe base e suas subclasses, para determinar o tipo de tempo de execução (runtime type) de um objeto. Você também explorou como instanceof se comporta ao verificar em relação à classe real do objeto, sua superclasse e classes não relacionadas.



