¿Qué es una Clase Abstracta?

Es una clase que se declara con la palabra reservada abstract.

  • No se pueden instanciar: No puedes hacer new ClaseAbstracta().
  • Propósito: Su única razón de ser es que otras clases hereden de ella (extends).
  • Híbrida: A diferencia de una interfaz, una clase abstracta puede tener métodos con código (métodos normales) y métodos sin código (métodos abstractos).
Métodos Abstractos

Son métodos que se declaran pero no se implementan (no tienen cuerpo { }, solo terminan en punto y coma ;).

  • Obligan a las clases hijas a «escribir» el código de ese método.
  • Si una clase tiene al menos un método abstracto, toda la clase debe ser declarada como abstracta.
Ejemplo Práctico

Imagina que estamos desarrollando un programa de dibujo. Todas las figuras tienen un color, pero el área se calcula de forma distinta según la figura.

// Clase abstracta: es un concepto general, no una figura concreta
public abstract class Figura {
private String color;
public Figura(String color) {
    this.color = color;
}

// Método normal: todas las figuras muestran su color igual
public void mostrarColor() {
    System.out.println("Soy de color: " + color);
}

// Método abstracto: no sé cómo calcular el área si no sé qué figura es
public abstract double calcularArea();
}
// Clase hija concreta: hereda de Figura
public class Circulo extends Figura {
private double radio; {
    super(color); 
// Llama al constructor del padre
    this.radio = radio;
}

// OBLIGATORIO: Implementar el método abstracto
@Override
public double calcularArea() {
    return Math.PI * radio * radio;
  }
}
¿Por qué usarlas?
  • Polimorfismo: Puedes crear una lista de tipo Figura y guardar en ella Circulos, Cuadrados o Triangulos.
  • Seguridad: Evitas que alguien cree un objeto «Figura» genérico, que no tendría sentido porque no sabríamos qué forma tiene ni cómo calcular su área.
  • Reutilización: El código del color lo escribes una sola vez en la clase padre y todas las hijas lo aprovechan.