Contrato
Qué obliga un método abstracto
Un método abstracto declara una operación que las subclases deben completar. La clase base sabe que esa operación existe, pero no conoce el detalle concreto de cada implementación.
Sirve cuando varias clases comparten una estructura común y solo cambia una parte. Si todo cambia y no hay estado compartido, revisa si una interfaz expresa mejor la idea.
Ejemplo con cálculo distinto por subclase
abstract class Envio {
abstract double coste(double kilos);
String resumen(double kilos) {
return "Coste: " + coste(kilos);
}
}
class EnvioLocal extends Envio {
@Override
double coste(double kilos) {
return 4.95 + kilos * 0.80;
}
}
class EnvioUrgente extends Envio {
@Override
double coste(double kilos) {
return 9.95 + kilos * 1.50;
}
}
Envio define resumen una sola vez y obliga a cada subclase a calcular coste. Si EnvioUrgente no implementa coste, no puede ser una clase concreta.
Errores de compilación frecuentes
| Error | Causa | Solución |
|---|---|---|
| Missing method body | El método debía ser abstract o tener bloque | Añade abstract y punto y coma, o implementa el cuerpo |
| Class must be declared abstract | La clase contiene un método abstracto | Marca la clase con abstract o completa el método |
| Method does not override | Firma distinta en la subclase | Revisa nombre, parámetros, retorno y visibilidad |
| Cannot instantiate | Intentas crear la clase abstracta | Instancia una subclase concreta |
Cómo probar que el diseño tiene sentido
- Escribe una subclase simple y otra con lógica diferente.
- Comprueba que ambas usan la misma firma de método.
- Añade @Override en todas las implementaciones.
- Mueve a la clase base solo la lógica que realmente se repite.
- Si el método abstracto no aporta contrato claro, elimina la abstracción.
Relación con polimorfismo
El valor práctico aparece cuando el código puede trabajar con el tipo base. Una lista de Envio puede contener EnvioLocal y EnvioUrgente; al llamar coste, Java ejecuta la implementación concreta.
Eso reduce condicionales como if tipo == urgente. En lugar de preguntar qué clase es cada objeto, se llama al método común y cada subclase responde. El diseño mejora si los nombres son claros y las subclases representan casos reales.
Preguntas frecuentes
¿Un método abstracto puede ser private?
No tendría sentido: una subclase no podría implementarlo. Usa una visibilidad que permita override.
¿Puede una clase abstracta tener métodos normales?
Sí. De hecho, una clase abstracta suele mezclar métodos concretos compartidos con métodos abstractos que varían.
¿Debo usar @Override?
Sí. Ayuda al compilador a avisarte si la firma no coincide con el método abstracto.
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.