Abstracción
Qué es una clase abstracta
Una clase abstracta es una clase que sirve como base incompleta para otras clases. Puede definir datos y comportamiento compartido, pero impedir que se cree un objeto directo de esa clase base.
El ejemplo típico no es Animal por costumbre, sino cualquier familia donde varias clases comparten parte del estado y parte del algoritmo. Si cada clase solo debe cumplir un contrato, una interfaz puede ser más flexible.
Decide entre clase abstracta e interfaz
Ejemplo mínimo
abstract class Documento {
private final String titulo;
Documento(String titulo) {
this.titulo = titulo;
}
String titulo() {
return titulo;
}
abstract String exportar();
}
class DocumentoPdf extends Documento {
DocumentoPdf(String titulo) {
super(titulo);
}
@Override
String exportar() {
return "PDF: " + titulo();
}
}
Documento comparte el título y deja exportar sin implementar. DocumentoPdf completa el método. No puedes hacer new Documento("informe"), porque la clase está marcada como abstracta.
Clase abstracta vs interfaz
| Pregunta | Clase abstracta | Interfaz |
|---|---|---|
| ¿Hay estado común? | Sí, puede tener campos y constructor | No es su uso principal |
| ¿Hay código compartido? | Encaja bien si pertenece a una misma familia | Puede tener default methods, pero no debe sustituir una jerarquía real |
| ¿Necesitas varias capacidades? | Java solo permite extender una clase | Una clase puede implementar varias interfaces |
| ¿La relación es 'es un tipo de'? | Suele ser buena señal | También puede servir si solo describes comportamiento |
Cuándo usar abstract sin complicar el diseño
- Escribe primero dos subclases reales, no una abstracción imaginaria.
- Mueve a la clase abstracta solo los campos y métodos que ambas comparten de verdad.
- Deja como abstracto lo que cada subclase debe resolver de forma distinta.
- Usa protected con cuidado; demasiados detalles internos acoplan la jerarquía.
- Si una clase no implementa todo, declárala también abstracta.
Señales de mal uso
- La clase abstracta no tiene estado ni código compartido y solo declara métodos.
- Todas las subclases ignoran o sobrescriben casi todo lo heredado.
- La jerarquía existe solo para ahorrar una línea de código.
- Necesitas que una clase pertenezca a varias jerarquías a la vez.
- El nombre de la clase base no representa una familia real.
Preguntas frecuentes
¿Una clase abstracta puede tener constructor?
Sí. Sus subclases lo llaman con super para inicializar el estado compartido.
¿Puede no tener métodos abstractos?
Sí. Puede declararse abstract para impedir instancias directas aunque todos sus métodos tengan implementación.
¿Qué pasa si una subclase no implementa un método abstracto?
Esa subclase también debe declararse abstracta o el compilador marcará error.
¿Abstract class e interface son lo mismo?
No. Se parecen porque no se instancian directamente, pero una clase abstracta puede compartir estado y una interfaz define principalmente un contrato.
Fuentes consultadas
Fuentes y referencias
Consulta referencias útiles para ampliar o contrastar esta guía.
Siguiente lectura
Guias relacionadas para continuar
Si quieres seguir con el mismo tema, aqui tienes paginas cercanas que amplian la tecnica, comparan variantes o te llevan a la siguiente rutina.