Herencia en Java

Publicado: Sábado, 13 \13\UTC junio \13\UTC 2009 en 10. Programación orientada a objetos (y II)

Ahora que ya parece que estamos entendiendo la manera de trabajar con objetos, vamos a complicarnos un poco más (la verdad es que muy poco más).

¿Qué es la herencia?

Es un mecanismo que nos permite manejar clases que son muy parecidas a otras clases que ya existen, aunque difieren de estas en algunas características.

IMPORTANTEUn concepto extremadamente parecido lo habéis estudiado en el módulo de SGBD, en lo que allí se denomina especialización y generalización.

Se trata de un mecanismo que funciona como una estructura jerárquica, donde cada clase puede tener una única superclase (que se encuentra por encima de ella en la jerarquía) y una o varias subclases (que se encuentran por debajo en la jerarquía). Las clases que se encuentran por debajo se dice que heredan de las clases que se encuentran por encima.

Aquí tenéis un diagrama que muestra un ejemplo de jerarquía:

Ejemplo de herencia

En este diagrama:

  • La clase Empleado es la superclase de Director, Comercial e Informático.
  • Las clases Director, Comercial e Informático son subclases de la clase Empleado.
  • La clase Director es la superclase de Ejecutivo.
  • La clase Ejecutivo es la subclase de Director.

Las subclases heredan todos los métodos y atributos de sus superclases. Por tanto, al definir una subclase, esta tiene automáticamente el mismo comportamiento que la superclase que hereda. Y tened en cuenta que esta herencia sube en la jerarquía hasta llegar a la cumbre.

Existe una raíz en esta jerarquía, que es la clase Object. Todas las clases creadas heredan las características y el comportamiento de Object.

Ejemplo de herencia con Object

Si necesitamos añadir características y/o funcionalidades de una clase en otra clase, debemos crear una subclase. Como ya hemos comentado, esta subclase heredará todo el comportamiento de su superclase y nosotros simplemente deberemos añadir aquellos atributos y métodos específicos en la subclase que la diferencian de su superclase.

¿Cómo se define la herencia en Java?

Para indicar que una clase herada de otra, se utiliza la palabra reservada extends. Siguiendo el ejemplo de más arriba, deberíamos definir las clases de la siguiente manera:

class Empleado {}

class Director extends Empleado {}

class Comercial extends Empleado {}

class Informatico extends Empleado {}

class Ejecutivo extends Director {}

Como podéis observar, se define de manera totalmente natural a como se expresa en nuestro propio lenguaje.

Método constructor

Cuando se crea un objeto de una clase heredada, primero se llamará al constructor de su superclase y a continuación al constructor propio.

Continuando con el ejemplo de los empleados, si creamos un objeto Comercial:

Comercial unObjetoComercial = new Comercial();

En primer lugar se llamará al constructor de la clase Empleado y a continuación al constructor de la clase Comercial.

Podéis hacer una sencilla prueba de este comportamiento, creando un nuevo proyecto, llamado por ejemplo Herencia y dentro de este proyecto:

– Creáis una clase Empleado con el siguiente código:

public class Empleado {

public Empleado () {

System.out.println(“Empleado”);

}

}

– Creáis una clase Comercial con el siguiente código:

public class Comercial extends Empleado{

public Comercial () {

System.out.println(“Comercial”);

}

}

– Creáis una clase TestHerencia con el siguiente código:

public class TestHerencia {

public static void main(String[] args) {

Comercial unObjetoComercial = new Comercial();

}

}

Al ejecutar el código se puede comprobar cómo aparece primero el mensaje Empleado (se ha llamado al constructor Empleado()) y, a continuación, el mensaje Comercial (se ha llamado al constructor Comercial()).

Redefinición de funciones

En ocasiones, conviene tener métodos en las clases heredadas con la misma signatura (nombre de método y parámetros que admite). Por ejemplo, podría ser interesante tener un método llamado sueldo en cada una de las clases que tuviese código específico para controlar las bonificaciones específicas según el cargo del empleado en la empresa. Así, tendríamos algo parecido a esto:

_________________________________________________________

public class Empleado {

public Empleado () {

System.out.println(“Empleado”);

}

public void sueldo() {

System.out.println(“Sueldo base de un empleado”);

}

}

__________________________________________________________

Código de Empleado.java

__________________________________________________________

public class Comercial extends Empleado{

public Comercial () {

System.out.println(“Comercial”);

}

public void sueldo() {

System.out.println(“Sueldo base de un empleado+sueldo específico del cargo de comercial”);

}

}

__________________________________________________________

Código de Comercial.java

__________________________________________________________

public class TestHerencia {

public static void main(String[] args) {

Comercial unObjetoComercial = new Comercial();

unObjetoComercial.sueldo();

}

}

__________________________________________________________

Código de TestHerencia.java

Como es de esperar, al ejecutar el método sueldo() aparece el código de la clase Comercial. Lo que debemos tener en cuenta en este caso es que estamos ocultando el método de la superclase en la clase heredada.

Polimorfismo

Esta es la última herramienta que nos proporciona la herencia. Se trata de la capacidad que tiene un objeto de una superclase de convertirse en un objeto de cualquiera de sus subclases. Es decir, Java permite realizar intrucciones de este tipo:

Empleado unObjetoComercial = new Comercial();

unObjetoComercial está definida como un objeto de la clase Empleado, pero se le reserva espacio de memoria como un objeto de tipo Comercial. Esto es correcto (y ni en la compilación ni en la ejecución habrá errores) ya que la clase Comercial hereda de la clase Empleado.


Creative Commons License
Herencia en Java by Cristian Jorge Garcia Marcos is licensed under a Creative Commons Reconocimiento-Compartir bajo la misma licencia 3.0 España License.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s