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
- Comprender qué es la herencia.
- Aprender cómo implementar herencia en Java.
- Ver ejemplos prácticos para facilitar la comprensión.
- Ejercicios para poner a prueba lo aprendido.
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:
- Superclase (o clase base): La clase de la que se heredan los atributos y métodos.
- Subclase (o clase derivada): La clase que hereda de la superclase.
extends
: Palabra clave en Java que se usa para declarar que una clase hereda de otra.
Ventajas de la herencia:
- Reutilización del código: No necesitas escribir el mismo código repetidamente.
- Facilidad para extender funcionalidades: Puedes agregar nuevas funcionalidades sin modificar la clase base.
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:
- La clase
Perro
es una subclase de la claseAnimal
. - La subclase
Perro
hereda el atributonombre
y el métodohacerSonido()
de la superclaseAnimal
. - La subclase
Perro
también tiene un método propio:correr()
.
3. Características de la Herencia
3.1. Herencia de Atributos y Métodos
- Atributos: La subclase hereda los atributos de la superclase. Estos pueden ser accedidos directamente si son públicos o mediante métodos getter y setter si son privados.
- Métodos: La subclase puede usar, modificar (sobrescribir) o añadir nuevos 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
- Clase abstracta: Es una clase que no se puede instanciar y puede tener métodos abstractos (sin implementación) que deben ser implementados por las subclases.
- Palabra clave
super
: Se usa para llamar a métodos y constructores de la superclase.
8. Ejercicios
- Ejercicio 1: Crea una clase
Vehiculo
con un métodomover()
. Luego, crea una subclaseCoche
que sobrescriba este método para mostrar un mensaje diferente. - Ejercicio 2: Crea una jerarquía de clases para representar diferentes tipos de animales (por ejemplo,
Perro
,Gato
yPájaro
) donde cada clase tiene un métodohacerSonido()
que imprime un sonido específico de ese animal. - Ejercicio 3: Crea una clase
Empleado
con un métodotrabajar()
. Luego, crea una subclaseGerente
que también tenga el métodotrabajar()
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!