Como Verificar se um Objeto é uma Instância de uma Classe em Java

JavaBeginner
Pratique Agora

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.

  1. Abra o WebIDE e certifique-se de que está no diretório ~/project. Você pode confirmar isso olhando para o prompt do terminal ou digitando pwd e pressionando Enter.

  2. Crie um novo arquivo Java chamado TypeCheck.java no diretório ~/project. Você pode fazer isso clicando com o botão direito no File Explorer à esquerda e selecionando "New File", em seguida, digitando TypeCheck.java.

  3. Abra o arquivo TypeCheck.java no 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 Animal e duas subclasses Dog e Cat.
    • No método main, criamos uma variável Animal chamada myAnimal e atribuímos um objeto Dog a ela. Isso é possível porque um Dog é um tipo de Animal.
    • Em seguida, usamos a palavra-chave instanceof para verificar se myAnimal é uma instância de Dog, Cat e Animal.
  4. Salve o arquivo TypeCheck.java (Ctrl+S ou Cmd+S).

  5. Compile o programa Java abrindo o terminal na parte inferior do WebIDE e executando o seguinte comando:

    javac TypeCheck.java

    Se não houver erros, este comando criará um arquivo TypeCheck.class, Animal.class, Dog.class e Cat.class no diretório ~/project.

  6. Execute o programa compilado usando o seguinte comando:

    java TypeCheck

    Você 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

    Esta saída confirma que myAnimal, que contém um objeto Dog, é de fato uma instância de Dog e também uma instância de sua superclasse Animal, mas não uma instância de Cat.

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.

  1. Abra o arquivo TypeCheck.java no editor WebIDE.

  2. Localize o método main e adicione as seguintes linhas de código após as verificações existentes para myAnimal:

            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.java completo 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");
            }
        }
    }
  3. Salve o arquivo TypeCheck.java modificado.

  4. Compile o programa novamente no terminal:

    javac TypeCheck.java
  5. Execute o programa compilado:

    java TypeCheck

    Você 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

    Esta saída mostra que anotherAnimal, que contém um objeto Cat, é uma instância de Cat e Animal, mas não de Dog. Isso reforça o conceito de que instanceof verifica 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.

  1. Abra o arquivo TypeCheck.java no editor WebIDE.

  2. 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.java completo 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");
            }
        }
    }
  3. Salve o arquivo TypeCheck.java modificado.

  4. Compile o programa no terminal:

    javac TypeCheck.java
  5. Execute o programa compilado:

    java TypeCheck

    Você 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 Animal

    Como você pode ver na saída, quando o objeto que está sendo testado com instanceof é null, o resultado é sempre false. Este é um ponto crucial para lembrar ao usar instanceof para evitar comportamento inesperado ou NullPointerExceptions.

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.