Inicio > Cursos > Java > Herencia, Interfaces y Polimorfismo
JavaProgramación Orientada a ObjetosLección 5 de 15

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
}
Consejo📐 Diferencia clave: clase abstracta puede tener estado (atributos) y métodos implementados. Las interfaces solo tienen contratos (aunque Java 8+ permite métodos default).
← Clases y ObjetosColecciones y Generics →

Practica esta lección

Resuelve los ejercicios del curso de Java en la app, gratis y con corrección automática.

Empezar a practicar