Como Verificar se um Objeto é de um Tipo Específico em Java

JavaBeginner
Pratique Agora

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.

  1. Abra o arquivo HelloJava.java no editor WebIDE, caso ainda não esteja aberto.

  2. 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 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.
    • Em seguida, usamos o operador instanceof para verificar se myAnimal é uma instância de Dog, Cat e Animal.
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. Compile o programa usando o comando javac no Terminal:

    javac HelloJava.java
  5. Execute o programa compilado usando o comando java:

    java HelloJava

    Você deve ver a saída indicando quais verificações instanceof retornaram true.

    myAnimal is an instance of Dog
    myAnimal is an instance of Animal

    Como você pode ver, myAnimal é uma instância de Dog (porque criamos um objeto Dog) e também uma instância de Animal (porque Dog é uma subclasse de Animal). Ele não é uma instância de Cat.

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.

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

  2. Adicione uma nova classe chamada Car ao arquivo. Você pode adicionar esta definição de classe antes ou depois das classes Animal, Dog e Cat, mas fora da classe HelloJava.

    class Car {
        public void drive() {
            System.out.println("Driving a car");
        }
    }
  3. Agora, vamos modificar o método main dentro da classe HelloJava para criar um objeto Car e testar o operador instanceof. Atualize o método main para 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 Car chamado myCar e incluímos verificações instanceof para ele em relação a Car e Animal.

  4. Salve o arquivo (Ctrl+S ou Cmd+S).

  5. Compile o programa modificado:

    javac HelloJava.java
  6. Execute o programa:

    java HelloJava

    Observe 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 Car

    Esta saída confirma que myCar é uma instância de Car, mas não é uma instância de Animal porque Car não herda de Animal. O operador instanceof identifica 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.

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

  2. Modifique o método main dentro da classe HelloJava para incluir uma referência Animal null e testá-la. Atualize o método main para 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 Animal chamada nullAnimal e a inicializamos com null. Em seguida, realizamos verificações instanceof em relação a ela.

  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. Compile o programa:

    javac HelloJava.java
  5. Execute o programa:

    java HelloJava

    Observe 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 if para nullAnimal não são impressas. Isso ocorre porque nullAnimal instanceof Animal e nullAnimal instanceof Dog avaliam para false. Isso demonstra que o operador instanceof lida corretamente com referências null retornando false.

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.