Contenido del curso

Construcción de clases y modelado de objetos

Clases abstractas y métodos en Java

Resumen

Cuando piensas en el contenido de una plataforma de streaming, te imaginas una película, una serie o un evento en vivo. El contenido, en sí mismo, es una idea general que necesita especialización. Esa misma lógica aplica en programación orientada a objetos: las clases abstractas en Java te permiten definir estructuras comunes que las clases hijas deben especializar, evitando instanciar conceptos genéricos que no representan algo concreto.

¿Qué es una clase abstracta en Java y por qué usarla?

Una clase abstracta es aquella que no puede instanciarse directamente porque representa un concepto genérico que necesita ser especializado por sus subclases. En el ejemplo de la plataforma, Contenido es abstracto porque no existe un contenido genérico: existen películas, documentales, series.

Antes de declararla como abstracta, podías hacer new Contenido() pasándole título, duración y género. Eso era incorrecto, porque permitía crear algo que conceptualmente no debería existir como entidad concreta.

Para corregirlo, se agrega la palabra reservada abstract antes de class:

java public abstract class Contenido { // atributos y métodos comunes }

Con esto, Java bloquea la instanciación de Contenido y obliga a trabajar siempre con sus tipos específicos, como Pelicula o Documental [01:30].

¿Puedo instanciar una clase abstracta en Java? No. Una clase marcada con abstract no se puede crear con new. Solo puedes instanciar sus subclases concretas, que sí representan tipos específicos.

¿Cómo funciona un método abstracto y la sobreescritura?

Hasta ese punto, todas las subclases compartían el método reproducir heredado del padre, que mostraba el mismo mensaje genérico. Pero un documental no se reproduce igual que una película, y ahí entra el método abstracto.

Un método abstracto se declara sin cuerpo, solo con punto y coma al final, y obliga a las subclases a implementarlo:

java public abstract void reproducir();

Dos reglas clave aparecen aquí:

  • Si una clase tiene al menos un método abstracto, la clase entera debe declararse abstract.
  • Cada subclase concreta está obligada a implementar ese método o también volverse abstracta.

Cuando la subclase implementa el método del padre, se usa la anotación @Override, que indica explícitamente que estás sobreescribiendo un comportamiento heredado [03:30].

¿Cómo se sobreescribe un método en cada subclase?

En Pelicula, el método se implementa así:

java @Override public void reproducir() { System.out.println("Reproduciendo la película " + getTitulo()); }

En Documental, el mensaje cambia para incluir al narrador:

java @Override public void reproducir() { System.out.println("Reproduciendo el documental narrado por " + narrador); }

Al ejecutar la opción 6 del programa con el contenido Titanic, la salida es "Reproduciendo la película Titanic". Con Oasis, en cambio, aparece "Reproduciendo el documental Oasis, narrado por Alejandro Ramírez" [04:30]. Mismo mensaje, distinto comportamiento.

¿Qué relación tienen las clases abstractas con el polimorfismo?

En el main, la plataforma busca un contenido y lo trata como Contenido, sin importar si por debajo es película o documental. Cuando se invoca contenido.reproducir(), Java detecta que el método es abstracto en la clase padre y baja a buscar la implementación específica de cada subclase.

Esto es polimorfismo en acción: un mismo mensaje (reproducir) es interpretado de manera distinta según el tipo real del objeto. La plataforma habla en lenguaje genérico, pero cada subclase responde con su propia voz.

¿Cuál es la diferencia entre una clase abstracta y una clase normal? Una clase normal puede instanciarse con new y todos sus métodos tienen cuerpo. Una clase abstracta no se puede instanciar y puede tener métodos abstractos que las subclases deben implementar obligatoriamente.

Cuándo conviene usar una clase abstracta

Las clases abstractas son ideales cuando quieres compartir estructura y comportamiento común entre varias clases, pero también necesitas forzar que cada subclase implemente su propia versión de ciertos métodos. Te dan lo mejor de dos mundos:

  • Reutilización del código común en el padre.
  • Especialización obligatoria en cada hijo.
  • Un punto único para tratar objetos diferentes de manera uniforme.

Como reto, intenta sobreescribir el método obtenerFichaTecnica para mostrar datos adicionales según el tipo de contenido. ¿Qué incluirías para una película y qué cambiarías para un documental? Cuéntalo en los comentarios.