Herencia, Interfaces y Polimorfismo
La herencia permite que una clase "hija" reutilice el código de una clase "padre" y lo extienda o modifique. En Java la herencia es simple: una clase solo puede tener un padre directo (extends). Esto evita el "problema del diamante" de C++. Sin embargo, una clase puede implementar múltiples interfaces, que son contratos de comportamiento sin implementación.
El polimorfismo es el resultado: un objeto Circulo puede tratarse como Figura porque hereda de ella, y Java llama al método correcto en tiempo de ejecución.
Las clases abstractas y las interfaces resuelven problemas similares pero diferentes. Una clase abstracta puede tener atributos y métodos con implementación además de métodos abstractos sin implementar; define una familia de objetos con comportamiento compartido. Una interfaz define solo contratos (qué métodos debe tener), sin estado.
La regla práctica: usa clase abstracta cuando las subclases comparten código real, usa interfaz cuando defines capacidades que pueden tener clases de familias totalmente distintas (como Serializable o Comparable).
// Clase abstracta
public abstract class Figura {
protected String color;
public Figura(String color) {
this.color = color;
}
public abstract double area(); // Sin implementación
public abstract double perimetro();
public void describir() { // Con implementación
System.out.printf("%s de color %s: área=%.2f%n",
getClass().getSimpleName(), color, area());
}
}
// Interfaz
public interface Dibujable {
void dibujar(); // Abstracto por defecto
default String getDescripcion() { // Java 8+
return "Figura dibujable";
}
}
// Herencia + interfaz
public class Circulo extends Figura implements Dibujable {
private double radio;
public Circulo(double radio, String color) {
super(color); // Llama al constructor de Figura
this.radio = radio;
}
@Override
public double area() {
return Math.PI * radio * radio;
}
@Override
public double perimetro() {
return 2 * Math.PI * radio;
}
@Override
public void dibujar() {
System.out.println("Dibujando círculo de radio " + radio);
}
}
// Polimorfismo
Figura[] figuras = { new Circulo(5, "rojo"), new Rectangulo(4, 6, "azul") };
for (Figura f : figuras) {
f.describir(); // Llama al método de cada subclase
}
Practica esta lección
Resuelve los ejercicios del curso de Java en la app, gratis y con corrección automática.
Empezar a practicar