Menu
Coddy logo textTech

El operador instanceof

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 31 de 87.

La lección anterior mostró que la conversión descendente puede fallar con una ClassCastException si el objeto no es realmente del tipo al que estás haciendo la conversión. El operador instanceof resuelve esto al permitirte comprobar el tipo de un objeto antes de hacer la conversión.

La sintaxis es sencilla: object instanceof ClassName devuelve true si el objeto es una instancia de esa clase (o de cualquiera de sus subclases):

Animal animal = new Dog();

if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.bark();  // Es seguro llamar a métodos específicos de Dog
}

Esta comprobación evita errores en tiempo de ejecución al garantizar que la conversión tendrá éxito. El operador también devuelve true para los tipos principales de la jerarquía:

Dog dog = new Dog();
System.out.println(dog instanceof Dog);     // true
System.out.println(dog instanceof Animal);  // true
System.out.println(dog instanceof Object);  // true

Desde Java 16, puedes combinar la comprobación y la conversión de tipo en un solo paso usando la coincidencia de patrones:

if (animal instanceof Dog dog) {
    dog.bark();  // 'dog' ya está casteado y listo para usar
}

Esta sintaxis más limpia elimina la línea de conversión separada. Ten en cuenta que instanceof devuelve false al comprobarlo con null, por lo que no necesitas una comprobación de nulidad separada.

challenge icon

Desafío

Fácil

Construyamos un sistema de inspección de vehículos que use el operador instanceof para identificar y manejar de forma segura distintos tipos de vehículos. Crearás una jerarquía de vehículos y escribirás código que compruebe el tipo real de cada vehículo antes de acceder a sus funciones especializadas.

Organizarás tu código en cuatro archivos:

  • Vehicle.java: Crea la clase base que todos los vehículos comparten. Cada vehículo tiene un campo model (String). Incluye un constructor para inicializarlo, un método getter getModel() y un método inspect() que imprime: Inspecting vehicle: [model]
  • Car.java: Crea una clase que extienda Vehicle. Los automóviles tienen un campo adicional numDoors (int). Usa super para la inicialización de la clase principal. Añade un método checkDoors() que imprima: [model] has [numDoors] doors
  • Motorcycle.java: Crea otra clase que extienda Vehicle. Las motocicletas tienen un campo hasSidecar (boolean). Añade un método checkSidecar() que imprima [model] has a sidecar o [model] has no sidecar según el valor booleano.
  • Main.java: ¡Aquí es donde instanceof se vuelve esencial! Recibirás cuatro entradas: el modelo de un automóvil, el número de puertas, el modelo de una motocicleta y si tiene un sidecar (true/false).

    Crea un arreglo de referencias Vehicle que contenga un Car y una Motorcycle. Después, recorre el arreglo y, para cada vehículo:

    • Llama al método base inspect()
    • Usa instanceof para comprobar si es un Car; si lo es, conviértelo de forma segura y llama a checkDoors()
    • Usa instanceof para comprobar si es una Motorcycle; si lo es, conviértelo de forma segura y llama a checkSidecar()

Recibirás cuatro entradas: el modelo del automóvil (String), el número de puertas (int), el modelo de la motocicleta (String) y has sidecar (boolean).

Tu salida debe mostrar cuatro líneas: para cada vehículo, verás su mensaje de inspección seguido de su comprobación específica del tipo. El operador instanceof garantiza que solo llames a métodos de Car en objetos que realmente sean Cars y a métodos de Motorcycle en objetos que realmente sean Motorcycles, ¡evitando cualquier ClassCastException!

Pruébalo tú mismo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Leer entradas
        String carModel = scanner.nextLine();
        int numDoors = Integer.parseInt(scanner.nextLine());
        String motorcycleModel = scanner.nextLine();
        boolean hasSidecar = Boolean.parseBoolean(scanner.nextLine());
        
        // TODO: Crea un objeto Car con carModel y numDoors
        
        // TODO: Crea un objeto Motorcycle con motorcycleModel y hasSidecar
        
        // TODO: Crea un array de referencias Vehicle que contenga el Car y el Motorcycle
        
        // TODO: Recorre el array y para cada vehículo:
        // 1. Llama al método inspect()
        // 2. Usa instanceof para comprobar si es un Car, luego haz downcast y llama a checkDoors()
        // 3. Usa instanceof para comprobar si es un Motorcycle, luego haz downcast y llama a checkSidecar()
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Java online