Introdução
Neste laboratório, você aprenderá como verificar se um objeto é uma instância de uma classe ou interface específica em Java usando a palavra-chave instanceof. Exploraremos seu uso básico, testaremos seu comportamento com subclasses e entenderemos como ele lida com objetos nulos.
Através de exemplos práticos, você obterá experiência prática no uso de instanceof para realizar a verificação de tipo em tempo de execução (runtime type checking), um conceito fundamental na programação orientada a objetos.
Usar instanceof para Verificação de Classe
Nesta etapa, exploraremos a palavra-chave instanceof em Java. A palavra-chave instanceof é usada 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 (runtime).
Vamos criar um programa Java simples para demonstrar como instanceof funciona.
Abra o WebIDE e certifique-se de que está no diretório
~/project. Você pode confirmar isso olhando para o prompt do terminal ou digitandopwde pressionando Enter.Crie um novo arquivo Java chamado
TypeCheck.javano diretório~/project. Você pode fazer isso clicando com o botão direito no File Explorer à esquerda e selecionando "New File", em seguida, digitandoTypeCheck.java.Abra o arquivo
TypeCheck.javano editor e cole o seguinte código:class Animal { // Classe base } class Dog extends Animal { // Subclasse de Animal } class Cat extends Animal { // Subclasse de Animal } public class TypeCheck { public static void main(String[] args) { Animal myAnimal = new Dog(); // Verifique se myAnimal é uma instância de Dog if (myAnimal instanceof Dog) { System.out.println("myAnimal é uma instância de Dog"); } else { System.out.println("myAnimal não é uma instância de Dog"); } // Verifique se myAnimal é uma instância de Cat if (myAnimal instanceof Cat) { System.out.println("myAnimal é uma instância de Cat"); } else { System.out.println("myAnimal não é uma instância de Cat"); } // Verifique se myAnimal é uma instância de Animal if (myAnimal instanceof Animal) { System.out.println("myAnimal é uma instância de Animal"); } else { System.out.println("myAnimal não é uma instância de Animal"); } } }Neste código:
- Definimos uma classe base
Animale duas subclassesDogeCat. - No método
main, criamos uma variávelAnimalchamadamyAnimale atribuímos um objetoDoga ela. Isso é possível porque umDogé um tipo deAnimal. - Em seguida, usamos a palavra-chave
instanceofpara verificar semyAnimalé uma instância deDog,CateAnimal.
- Definimos uma classe base
Salve o arquivo
TypeCheck.java(Ctrl+S ou Cmd+S).Compile o programa Java abrindo o terminal na parte inferior do WebIDE e executando o seguinte comando:
javac TypeCheck.javaSe não houver erros, este comando criará um arquivo
TypeCheck.class,Animal.class,Dog.classeCat.classno diretório~/project.Execute o programa compilado usando o seguinte comando:
java TypeCheckVocê deve ver uma saída semelhante a esta:
myAnimal é uma instância de Dog myAnimal não é uma instância de Cat myAnimal é uma instância de AnimalEsta saída confirma que
myAnimal, que contém um objetoDog, é de fato uma instância deDoge também uma instância de sua superclasseAnimal, mas não uma instância deCat.
Você usou com sucesso a palavra-chave instanceof para verificar o tipo de um objeto em Java. Na próxima etapa, exploraremos como instanceof se comporta com subclasses.
Testar com Subclasses
Na etapa anterior, vimos que um objeto é considerado uma instância de sua própria classe e também uma instância de sua superclasse. Vamos explorar mais a fundo como instanceof funciona com diferentes tipos de objetos e suas subclasses.
Modificaremos nosso arquivo TypeCheck.java existente para testar instanceof com um objeto Cat.
Abra o arquivo
TypeCheck.javano editor WebIDE.Localize o método
maine adicione as seguintes linhas de código após as verificações existentes paramyAnimal:System.out.println("\n--- Testando com um objeto Cat ---"); Animal anotherAnimal = new Cat(); // Verifique se anotherAnimal é uma instância de Dog if (anotherAnimal instanceof Dog) { System.out.println("anotherAnimal é uma instância de Dog"); } else { System.out.println("anotherAnimal não é uma instância de Dog"); } // Verifique se anotherAnimal é uma instância de Cat if (anotherAnimal instanceof Cat) { System.out.println("anotherAnimal é uma instância de Cat"); } else { System.out.println("anotherAnimal não é uma instância de Cat"); } // Verifique se anotherAnimal é uma instância de Animal if (anotherAnimal instanceof Animal) { System.out.println("anotherAnimal é uma instância de Animal"); } else { System.out.println("anotherAnimal não é uma instância de Animal"); }Seu arquivo
TypeCheck.javacompleto agora deve ser assim:class Animal { // Classe base } class Dog extends Animal { // Subclasse de Animal } class Cat extends Animal { // Subclasse de 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 é uma instância de Dog"); } else { System.out.println("myAnimal não é uma instância de Dog"); } // Check if myAnimal is an instance of Cat if (myAnimal instanceof Cat) { System.out.println("myAnimal é uma instância de Cat"); } else { System.out.println("myAnimal não é uma instância de Cat"); } // Check if myAnimal is an instance of Animal if (myAnimal instanceof Animal) { System.out.println("myAnimal é uma instância de Animal"); } else { System.out.println("myAnimal não é uma instância de Animal"); } System.out.println("\n--- Testando com um objeto Cat ---"); Animal anotherAnimal = new Cat(); // Check if anotherAnimal is an instance of Dog if (anotherAnimal instanceof Dog) { System.out.println("anotherAnimal é uma instância de Dog"); } else { System.out.println("anotherAnimal não é uma instância de Dog"); } // Check if anotherAnimal is an instance of Cat if (anotherAnimal instanceof Cat) { System.out.println("anotherAnimal é uma instância de Cat"); } else { System.out.println("anotherAnimal não é uma instância de Cat"); } // Check if anotherAnimal is an instance of Animal if (anotherAnimal instanceof Animal) { System.out.println("anotherAnimal é uma instância de Animal"); } else { System.out.println("anotherAnimal não é uma instância de Animal"); } } }Salve o arquivo
TypeCheck.javamodificado.Compile o programa novamente no terminal:
javac TypeCheck.javaExecute o programa compilado:
java TypeCheckVocê deve ver uma saída semelhante a esta:
myAnimal é uma instância de Dog myAnimal não é uma instância de Cat myAnimal é uma instância de Animal --- Testando com um objeto Cat --- anotherAnimal não é uma instância de Dog anotherAnimal é uma instância de Cat anotherAnimal é uma instância de AnimalEsta saída mostra que
anotherAnimal, que contém um objetoCat, é uma instância deCateAnimal, mas não deDog. Isso reforça o conceito de queinstanceofverifica o tipo real do objeto e sua hierarquia de herança.
Você testou com sucesso a palavra-chave instanceof com diferentes objetos de subclasses. Na próxima etapa, veremos como instanceof se comporta com objetos null.
Verificar com Objetos Nulos
Nesta etapa final, investigaremos como a palavra-chave instanceof se comporta quando o objeto que está sendo testado é null. Entender isso é importante para evitar possíveis erros em seus programas Java.
Modificaremos novamente nosso arquivo TypeCheck.java para incluir um teste com um objeto null.
Abra o arquivo
TypeCheck.javano editor WebIDE.Adicione as seguintes linhas de código no final do método
main, após os testes anteriores:System.out.println("\n--- Testando com um objeto nulo ---"); Animal nullAnimal = null; // Verifique se nullAnimal é uma instância de Dog if (nullAnimal instanceof Dog) { System.out.println("nullAnimal é uma instância de Dog"); } else { System.out.println("nullAnimal não é uma instância de Dog"); } // Verifique se nullAnimal é uma instância de Animal if (nullAnimal instanceof Animal) { System.out.println("nullAnimal é uma instância de Animal"); } else { System.out.println("nullAnimal não é uma instância de Animal"); }Seu arquivo
TypeCheck.javacompleto agora deve ser assim:class Animal { // Classe base } class Dog extends Animal { // Subclasse de Animal } class Cat extends Animal { // Subclasse de 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 é uma instância de Dog"); } else { System.out.println("myAnimal não é uma instância de Dog"); } // Check if myAnimal is an instance of Cat if (myAnimal instanceof Cat) { System.out.println("myAnimal não é uma instância de Cat"); } else { System.out.println("myAnimal não é uma instância de Cat"); } // Check if myAnimal is an instance of Animal if (myAnimal instanceof Animal) { System.out.println("myAnimal é uma instância de Animal"); } else { System.out.println("myAnimal não é uma instância de Animal"); } System.out.println("\n--- Testando com um objeto Cat ---"); Animal anotherAnimal = new Cat(); // Check if anotherAnimal is an instance of Dog if (anotherAnimal instanceof Dog) { System.out.println("anotherAnimal não é uma instância de Dog"); } else { System.out.println("anotherAnimal não é uma instância de Dog"); } // Check if anotherAnimal is an instance of Cat if (anotherAnimal instanceof Cat) { System.out.println("anotherAnimal é uma instância de Cat"); } else { System.out.println("anotherAnimal é uma instância de Cat"); } // Check if anotherAnimal is an instance of Animal if (anotherAnimal instanceof Animal) { System.out.println("anotherAnimal é uma instância de Animal"); } else { System.out.println("anotherAnimal é uma instância de Animal"); } System.out.println("\n--- Testando com um objeto nulo ---"); Animal nullAnimal = null; // Check if nullAnimal is an instance of Dog if (nullAnimal instanceof Dog) { System.out.println("nullAnimal é uma instância de Dog"); } else { System.out.println("nullAnimal não é uma instância de Dog"); } // Check if nullAnimal is an instance of Animal if (nullAnimal instanceof Animal) { System.out.println("nullAnimal é uma instância de Animal"); } else { System.out.println("nullAnimal não é uma instância de Animal"); } } }Salve o arquivo
TypeCheck.javamodificado.Compile o programa no terminal:
javac TypeCheck.javaExecute o programa compilado:
java TypeCheckVocê deve ver uma saída semelhante a esta:
myAnimal é uma instância de Dog myAnimal não é uma instância de Cat myAnimal é uma instância de Animal --- Testando com um objeto Cat --- anotherAnimal não é uma instância de Dog anotherAnimal é uma instância de Cat anotherAnimal é uma instância de Animal --- Testando com um objeto nulo --- nullAnimal não é uma instância de Dog nullAnimal não é uma instância de AnimalComo você pode ver na saída, quando o objeto que está sendo testado com
instanceofénull, o resultado é semprefalse. Este é um ponto crucial para lembrar ao usarinstanceofpara evitar comportamento inesperado ouNullPointerExceptions.
Você verificou com sucesso como a palavra-chave instanceof se comporta com objetos null. Isso conclui nossa exploração da palavra-chave instanceof.
Resumo
Neste laboratório, aprendemos como usar a palavra-chave instanceof em Java para verificar se um objeto é uma instância de uma classe específica ou implementa uma interface particular. Demonstramos seu uso criando um programa simples com uma classe base e subclasses, e então usando instanceof para verificar o tipo de um objeto em tempo de execução.
Exploramos ainda como instanceof se comporta com subclasses, confirmando que um objeto é considerado uma instância de sua própria classe, bem como de quaisquer superclasses. Finalmente, examinamos o comportamento de instanceof quando aplicado a objetos nulos, entendendo que ele sempre retorna false nesses casos.



