Saltar la navegación

3.- Herencia.

Caso práctico

Programador trabajando delante de su ordenador.
Ministerio de Educación y FP (CC BY-NC)

María ha estado desarrollando junto con Juan algunas clases para el proyecto de la Clínica Veterinaria. Hasta el momento todo ha ido bien. Han tenido que crear clases que contenían en su interior instancias de otras clases (atributos que eran objetos). Han tenido cuidado con los constructores y las referencias a los atributos internos y parece que, por ahora, todo funciona perfectamente. Pero ahora necesitan aprovechar algunas de las características que tienen algunas de las clases que ya han escrito, y no quieren tener que volver a escribir todos esos métodos en las nuevas clases. María sabe que es una ocasión perfecta para utilizar el concepto de herencia:

– “Si la clase A tiene características en común (atributos y métodos) con la clase B aportando algunas características nuevas, puede decirse que la clase A es una especialización de la clase B, ¿no es así?”. – Le pregunta María a Juan.
– “Así es. Es un caso claro de herencia. La clase A hereda de la clase B”. – Contesta Juan.
– “De acuerdo. Pues vamos manos a la obra. ¿Cómo indicábamos que una clase heredaba de otra? Creo recordar que se usaba la palabra reservada extends. ¿Había que hacer algo más?” – Dice María con entusiasmo.
– “Parece que ha llegado el momento de repasar la sintaxis de la herencia en Java”.

Como ya has estudiado, la herencia es el mecanismo que permite definir una nueva clase a partir de otra, pudiendo añadir nuevas características, sin tener que volver a escribir todo el código de la clase base.

Esquema que muestra una estructura jerárquica de herencia con una superclase y dos subclases que heredan de ella.
Ministerio de Educación y FP (CC BY-NC)

La clase de la que se hereda suele ser llamada clase base, clase padre o superclase. A la clase que hereda se le suele llamar clase hija, clase derivada o subclase.

Una clase derivada puede ser a su vez clase padre de otra que herede de ella y así sucesivamente dando lugar a una jerarquía de clases, excepto aquellas que estén en la parte de arriba de la jerarquía (sólo serán clases padre) o en la parte de abajo (sólo serán clases hijas).

Una clase hija no tiene acceso a los miembros privados de su clase padre, tan solo a los públicos (como cualquier parte del código tendría) y los protegidos (a los que sólo tienen acceso las clases derivadas y las del mismo paquete). Aquellos miembros que sean privados en la clase base también habrán sido heredados, pero el acceso a ellos estará restringido al propio funcionamiento de la superclase y sólo se podrá acceder a ellos si la superclase ha dejado algún medio indirecto para hacerlo (por ejemplo a través de algún método).

Todos los miembros de la superclase, tanto atributos como métodos, son heredados por la subclase. Algunos de estos miembros heredados podrán ser redefinidos o sobrescritos (overriden) y también podrán añadirse nuevos miembros. De alguna manera podría decirse que estás “ampliando” la clase base con características adicionales o modificando algunas de ellas (proceso de especialización).

Una clase derivada extiende la funcionalidad de la clase base sin tener que volver a escribir su código, es decir, de forma automática la case derivada hereda sus propiedades y sus métodos.

Clase de la que hereda otra clase. Se heredarán todas aquellas características que la clase padre permita.

Clase que hereda de otra clase. Se heredan todas aquellas características que la clase padre permita.

Autoevaluación

Pregunta 1

Una clase derivada hereda todos los miembros de su clase base, pudiendo acceder a cualquiera de ellos en cualquier momento. ¿Verdadero o Falso?