Guía Detallada sobre la Herencia en Java

Introducción

La herencia es uno de los principios fundamentales de la Programación Orientada a Objetos (OOP) en Java. Permite crear una nueva clase (subclase) a partir de una clase existente (superclase), de modo que la subclase hereda los atributos y métodos de la superclase. Esto fomenta la reutilización del código, facilita la extensión de funcionalidades y mejora la organización del programa.

Objetivos de esta guía


1. ¿Qué es la Herencia?

La herencia permite que una clase (subclase o clase hija) herede características (atributos y métodos) de otra clase (superclase o clase madre). De esta manera, la subclase puede reutilizar el código de la superclase y, además, puede agregar o modificar sus propios métodos y atributos.

Terminología clave:

Ventajas de la herencia:


2. Sintaxis Básica de la Herencia

En Java, para implementar la herencia, se utiliza la palabra clave extends. Veamos cómo se declara una subclase que hereda de una superclase:

Ejemplo básico:

// Superclase
class Animal {
    String nombre;

    // Método de la superclase
    void hacerSonido() {
        System.out.println("El animal hace un sonido");
    }
}

// Subclase
class Perro extends Animal {
    // Método específico de la subclase
    void correr() {
        System.out.println("El perro está corriendo");
    }
}

En el ejemplo anterior:


3. Características de la Herencia

3.1. Herencia de Atributos y Métodos

3.2. Sobrescritura de Métodos

Si deseas cambiar el comportamiento de un método heredado en la subclase, puedes sobrescribirlo. Para sobrescribir un método en Java, debes usar la anotación @Override.

Ejemplo de sobrescritura de un método:

class Animal {
    void hacerSonido() {
        System.out.println("El animal hace un sonido");
    }
}

class Perro extends Animal {
    @Override
    void hacerSonido() {
        System.out.println("El perro ladra");
    }
}

Aquí, el método hacerSonido() de la subclase Perro sobrescribe el método hacerSonido() de la superclase Animal, cambiando su comportamiento.


4. Llamada al Constructor de la Superclase

Cuando creas una instancia de la subclase, se ejecuta el constructor de la superclase. Si no se especifica un constructor en la subclase, el constructor por defecto de la superclase se llama automáticamente.

Uso de super()

La palabra clave super se utiliza para invocar el constructor de la superclase o acceder a los métodos y atributos de la superclase.

Ejemplo:

class Animal {
    Animal() {
        System.out.println("Constructor de Animal");
    }
}

class Perro extends Animal {
    Perro() {
        super();  // Llama al constructor de la superclase
        System.out.println("Constructor de Perro");
    }
}

Cuando creamos un objeto Perro, se invoca el constructor de la clase Animal antes de ejecutar el constructor de la clase Perro.


5. La Herencia Múltiple en Java

A diferencia de otros lenguajes como C++, Java no permite la herencia múltiple. Esto significa que una subclase no puede heredar de más de una clase al mismo tiempo. Sin embargo, Java permite la herencia múltiple mediante interfaces (un tema aparte, que no trataremos en esta guía).


6. Ejemplos Adicionales de Herencia

Ejemplo 1: Jerarquía de animales

// Superclase
class Animal {
    void comer() {
        System.out.println("El animal está comiendo");
    }
}

// Subclase
class Gato extends Animal {
    void maullar() {
        System.out.println("El gato está maullando");
    }
}

class Perro extends Animal {
    void ladrar() {
        System.out.println("El perro está ladrando");
    }
}

public class Main {
    public static void main(String[] args) {
        Gato gato = new Gato();
        Perro perro = new Perro();

        gato.comer(); // Heredado
        gato.maullar(); // Específico de Gato

        perro.comer(); // Heredado
        perro.ladrar(); // Específico de Perro
    }
}

Ejemplo 2: Sobrescritura de Métodos

class Vehiculo {
    void mover() {
        System.out.println("El vehículo está en movimiento");
    }
}

class Coche extends Vehiculo {
    @Override
    void mover() {
        System.out.println("El coche está en movimiento");
    }
}

class Bicicleta extends Vehiculo {
    @Override
    void mover() {
        System.out.println("La bicicleta está en movimiento");
    }
}

public class Main {
    public static void main(String[] args) {
        Vehiculo miCoche = new Coche();
        Vehiculo miBicicleta = new Bicicleta();

        miCoche.mover(); // Imprime "El coche está en movimiento"
        miBicicleta.mover(); // Imprime "La bicicleta está en movimiento"
    }
}

7. Conceptos Relacionados


8. Ejercicios

  1. Ejercicio 1: Crea una clase Vehiculo con un método mover(). Luego, crea una subclase Coche que sobrescriba este método para mostrar un mensaje diferente.
  2. Ejercicio 2: Crea una jerarquía de clases para representar diferentes tipos de animales (por ejemplo, Perro, Gato y Pájaro) donde cada clase tiene un método hacerSonido() que imprime un sonido específico de ese animal.
  3. Ejercicio 3: Crea una clase Empleado con un método trabajar(). Luego, crea una subclase Gerente que también tenga el método trabajar() pero con un comportamiento distinto.

Conclusión

La herencia es una herramienta poderosa en Java que permite la creación de clases que aprovechan las funcionalidades de otras clases, promoviendo la reutilización y la extensibilidad del código. A través de la palabra clave extends, podemos crear jerarquías de clases que comparten atributos y métodos, y sobrescribir comportamientos cuando es necesario.

Te animamos a practicar estos conceptos mediante ejercicios y a explorar más sobre las clases abstractas, las interfaces y otras características avanzadas de la herencia en Java. ¡Sigue aprendiendo y explorando nuevas posibilidades en la programación orientada a objetos!