0Pricing
Java Academy · Lección

Conversión ascendente/descendente e instanceof

Comprenda la conversión ascendente a un tipo padre, la conversión descendente segura con instanceof y los errores habituales que causan ClassCastException.

Conversión ascendente/descendente e instanceof es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 3 de 3. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 3 lecciones en total.

Upcasting y downcasting

Upcasting almacena un objeto hijo en una referencia de tipo padre y siempre es seguro. El downcasting hace lo contrario y requiere cuidado. Usamos instanceof para comprobar el tipo real en tiempo de ejecución.

Código: demostración de upcasting

El upcasting es implícito y seguro: un Dog puede tratarse como un Animal. Puede llamar a los métodos declarados en Animal; la versión de Dog se ejecuta en tiempo de ejecución.

public class Main {
  static class Animal {
    void speak() { System.out.println("Animal sound"); }
  }
  static class Dog extends Animal {
    void speak() { System.out.println("Woof"); }
    void fetch() { System.out.println("Fetch!"); }
  }

  public static void main(String[] args) {
    // Upcasting: Dog stored in an Animal reference (safe, automatic)
    Animal a = new Dog();
    a.speak();  // calls Dog's speak() due to dynamic binding

    // a.fetch(); // Not allowed: reference is Animal, which does not declare fetch
    System.out.println("Upcasting hides Dog-only methods from the reference type.");
  }
}

¿Por qué hacer downcasting?

Hace downcasting cuando necesita un método exclusivo de la clase hija, como fetch(). Esto debería ser poco frecuente y estar bien comprobado. Siempre que sea posible, prefiera escribir código contra el tipo padre o una interfaz.

Código: downcasting seguro

Use instanceof antes de hacer la conversión. Si la comprobación falla, omita la conversión y elija otra ruta; así evita ClassCastException.

public class Main {
  static class Animal { void speak() { System.out.println("Animal sound"); } }
  static class Dog extends Animal { void speak() { System.out.println("Woof"); } void fetch() { System.out.println("Fetch!"); } }
  static class Cat extends Animal { void speak() { System.out.println("Meow"); } }

  public static void main(String[] args) {
    Animal a1 = new Dog();
    Animal a2 = new Cat();

    // Safe downcast using instanceof
    if (a1 instanceof Dog) {
      Dog d = (Dog) a1;
      d.fetch(); // OK
    }

    if (a2 instanceof Dog) {
      Dog d2 = (Dog) a2; // will not run
      d2.fetch();
    } else {
      System.out.println("a2 is not a Dog, skip casting.");
    }
  }
}

Errores comunes

Error común: hacer una conversión sin comprobar el tipo puede lanzar ClassCastException. Otro error es abusar del downcasting en lugar de diseñar con interfaces. Mantenga las conversiones cerca del lugar donde las necesita y prefiera el polimorfismo.

Código: conversión incorrecta frente a conversión segura

No haga conversiones a ciegas. Si no está seguro del tipo en tiempo de ejecución, proteja la conversión con instanceof y elija una alternativa segura si no coincide.

public class Main {
  static class Animal { void speak() { System.out.println("Animal"); } }
  static class Dog extends Animal { void fetch() { System.out.println("Fetch!"); } }
  static class Cat extends Animal { }

  public static void main(String[] args) {
    Animal a = new Cat();

    // Bad: direct cast (would throw at runtime)
    // Dog dBad = (Dog) a; // ClassCastException if uncommented

    // Good: check first
    if (a instanceof Dog) {
      Dog d = (Dog) a;
      d.fetch();
    } else {
      System.out.println("Not a Dog; skipping cast.");
    }
  }
}

Comprobación del downcasting

Comprobación rápida: ¿Cómo se hace downcasting de forma segura de una referencia Animal a Dog?

Repaso

Repaso: El upcasting es seguro y habitual. El downcasting requiere instanceof para evitar errores; prefiera diseñar con tipos padre o interfaces para reducir las conversiones.

Preguntas frecuentes

¿La lección «Conversión ascendente/descendente e instanceof» es gratis?

Sí — el texto completo de «Conversión ascendente/descendente e instanceof» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 3 lecciones en total.

¿Qué aprenderé en «Conversión ascendente/descendente e instanceof»?

Comprenda la conversión ascendente a un tipo padre, la conversión descendente segura con instanceof y los errores habituales que causan ClassCastException. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 3.

¿Cuánto tiempo toma la lección «Conversión ascendente/descendente e instanceof»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Clases abstractas
  2. Interfaces (introducción y diferencias)
  3. Conversión ascendente/descendente e instanceof
← Volver a Java Academy