11.6. Estructura de clases y objetos en Java: herencia
La herencia es uno de los conceptos fundamentales de la programación orientada a objetos (POO) y, en Java, es una parte crucial que permite una estructura de clases y objetos eficiente y poderosa. La herencia permite que una clase herede campos y métodos de otra clase, promoviendo la reutilización de código y la creación de una jerarquía de clases relacionadas.
¿Qué es la herencia?
La herencia es un mecanismo mediante el cual una nueva clase, llamada subclase, puede adquirir las propiedades de una clase existente, llamada superclase. La herencia facilita la modularidad y la organización del código, lo que permite a los desarrolladores crear clases más especializadas a partir de clases más generales.
Cómo funciona la herencia en Java
En Java, la herencia se realiza con la palabra clave extends
. Cuando una clase se deriva de otra clase usando extends
, hereda todos los miembros públicos y protegidos (campos, métodos) de la superclase. Los miembros privados de la superclase no se heredan directamente, pero se puede acceder a ellos a través de métodos públicos o protegidos.
clase animal { Nombre de cadena; public void emitSound() { System.out.println("El animal emite un sonido."); } } clase Perro extiende Animal { public void emitSound() { System.out.println("El perro ladra: ¡Au Au!"); } }
En el ejemplo anterior, la clase Dog
hereda de la clase Animal
. Esto significa que un objeto Dog
tendrá acceso al campo name
y podrá llamar al método emitSound()
.
Anulación de método
En herencia, la subclase tiene la capacidad de anular los métodos de la superclase. Esto se hace para definir un comportamiento específico en la subclase. En el ejemplo anterior, el método Sound()
se anula en la clase Dog
para reflejar el sonido específico que hace un perro.
Usando super
La palabra clave super
se utiliza para hacer referencia directamente al objeto de superclase. Puede usarse para llamar al constructor de la superclase, así como para acceder a métodos que han sido anulados por la subclase.
clase Gato extiende Animal { Gato público() { super.nombre = "Gato"; } public void emitSound() { super.emitSound(); // Llama al método de superclase System.out.println("El gato maúlla: ¡Miau!"); } }
En el ejemplo anterior, el constructor de la clase Cat
asigna un valor al campo name
de la superclase Animal
. Y el método emitarSound()
primero llama al método de la superclase antes de agregar su propio comportamiento.
Herencia y Constructores
En Java, los constructores no se heredan. Sin embargo, la subclase puede llamar a los constructores de la superclase usando la palabra clave super
. Esto normalmente se hace en la primera línea del constructor de la subclase.
clase Pájaro extiende Animal { pájaro público() { súper(); // Llama al constructor de la superclase // Otras inicializaciones } }
Es importante tener en cuenta que si la superclase no tiene un constructor sin argumentos (un constructor predeterminado), la subclase debe llamar explícitamente a uno de los constructores disponibles de la superclase.
Modificadores de acceso y herencia
Los modificadores de acceso en Java definen cómo se puede acceder a los miembros de una clase. En herencia, estos modificadores determinan lo que hereda la subclase:
- Público: los miembros públicos son heredados por la subclase y son accesibles desde cualquier otra clase.
- Protegido: los miembros protegidos son heredados por la subclase y son accesibles dentro del mismo paquete o por subclases en diferentes paquetes.
- Privado: La subclase no hereda los miembros privados, pero se puede acceder a ellos indirectamente a través de métodos públicos o protegidos de la superclase.
Herencia y polimorfismo
El polimorfismo es otro concepto clave de programación orientada a objetos que permite que objetos de diferentes subclases sean tratados como objetos de la superclase. Esto es posible gracias a la herencia y permite utilizar un mismo método en diferentes contextos, dependiendo del tipo de objeto que lo invoca.
Animal miAnimal = nuevo Perro(); miAnimal.emitSound(); // Salida: El perro ladra: ¡Au Au!
En el ejemplo anterior, incluso si myAnimal
es del tipo Animal
, el método emitSound()
que se llama es el de la clase Perro
, gracias al polimorfismo.
Consideraciones finales sobre la herencia
La herencia es una herramienta poderosa, pero debe usarse con cuidado. la tuUna herencia excesiva puede dar lugar a jerarquías de clases complejas y difíciles de mantener. Es importante diseñar sistemas con herencia sólo cuando tenga sentido conceptualmente, y no sólo para reutilizar código. La composición, donde una clase contiene otra clase, a menudo puede ser una alternativa más flexible a la herencia.
En resumen, la herencia en Java permite crear una estructura eficiente de clases y objetos, promoviendo la reutilización del código y la organización lógica. Al comprender y aplicar correctamente los conceptos de herencia, anulación de métodos, uso de super
, modificadores de acceso y polimorfismo, los desarrolladores pueden crear sistemas robustos y escalables.