← CC2008

Herencia

Semestre 02, 2026

Usos de la herencia

Reutilización de código: evita duplicación.
Modela jerarquías: Animal → Perro → Pastor Alemán.
Extensibilidad: nuevas clases a partir de otras.
Permite polimorfismo (muchas formas).

Concepto (extends)

Una subclase hereda atributos y métodos de una superclase con extends.


class Persona {
    String nombre;
    public void saludar() {
        System.out.println("Hola, soy " + nombre);
    }
}

class Estudiante extends Persona {
    String carnet;
}

Jerarquía de clases

Toda clase hereda de Object. Ejemplo: Object → Persona → Estudiante.

toString(): representación en texto
equals(): comparación de igualdad
getClass(): tipo en ejecución
Facilita el polimorfismo

Acceso a miembros heredados

Se heredan public y protected; private no se hereda (se accede vía getters/setters).


class Hijo extends Padre {
    public void mostrar() {
        // secreto;          // private: no accesible
        System.out.println(protegido); // accesible
        System.out.println(publico);   // accesible
    }
}

Override

Una subclase redefine un método heredado con la misma firma. Se resuelve en tiempo de ejecución.


class Estudiante extends Persona {
    @Override
    public void saludar() {
        System.out.println("Hola, soy estudiante");
    }
}

Super

Refiere a la superclase: invoca su constructor o sus métodos sobrescritos.


class Estudiante extends Persona {
    @Override
    public void saludar() {
        super.saludar(); // método de la superclase
        System.out.println("... y también estudiante");
    }
}

Polimorfismo

Una referencia de la superclase puede apuntar a un objeto de cualquier subclase.


Persona p1 = new Estudiante();
Persona p2 = new Profesor();

p1.saludar(); // Hola, soy estudiante
p2.saludar(); // Buenos días, soy profesor

Upcasting y downcasting


Persona p = new Estudiante();     // upcasting implícito
Estudiante e = (Estudiante) p;    // downcasting explícito
Upcasting: seguro, siempre válido.
Downcasting: puede lanzar ClassCastException.

Arreglos y polimorfismo


ArrayList<Persona> personas = new ArrayList<>();
personas.add(new Estudiante());
personas.add(new Profesor());

for (Persona p : personas) {
    p.saludar(); // cada objeto ejecuta su versión
}

Clases abstractas

No se instancian; pueden tener métodos abstractos que las subclases deben implementar (un contrato).


abstract class Animal {
    public abstract void hacerSonido();
}

class Perro extends Animal {
    @Override
    public void hacerSonido() {
        System.out.println("Guau");
    }
}

Final

final class: no puede extenderse.
final en método: no puede sobrescribirse.

Buenas prácticas y límites

Usa herencia solo si existe relación is-a.
Prefiere composición para "tiene-un".
Evita jerarquías profundas y complejas.
Java no tiene herencia múltiple de clases.