Tutorial 13 Java: Herencia

Tutorial 13 Java: Herencia
tutorialjava13

¡Hola a todos y bienvenidos a un nuevo tutorial de Java en Geeky Theory! Hoy voy a explicar un concepto importante en el mundo de la programación Java: la herencia.

¿Qué es la herencia? ¿Qué sentido tiene crear una clase a partir de otra? La herencia es el mecanismo que sirve de soporte para registrar y utilizar las relaciones conceptuales existentes entre las clases y, posibilita la definición de una clase a partir de otra. La herencia organiza las clases en una estructura jerárquica formando jerarquías de clases. Por lo tanto, podemos decir que no es simplemente un mecanismo para compartir código.

EJEMPLO: Una clase B hereda de otra clase A, por lo que B adquiere la estructura y el comportamiento de la clase A, es decir, los atributos y los métodos.

Por otra parte, B puede añadir nuevos atributos, nuevos métodos y, también puede redefinir métodos. Las adaptaciones que se puedan hacer dependen del lenguaje.

Si B hereda de A, A es la superclase y B la subclase. Si C hereda de B y A, B y C son subclases de A. Por lo tanto, B es un descendiente directo de A y C es un descendiente indirecto de A.

Se pueden dar herencias simples (una clase puede heredar de una única clase) y herencias múltiples (una clase puede heredar de varias clases).

En Java, no se heredan los constructores. La primera sentencia del constructor de la clase hija es siempre una llamada al constructor de la clase padre. La llamada al constructor del padre puede ser:

  • Implícita

- Si se omite, se llamará implícitamente al constructor por defecto.

- Equivalente a poner como primera sentencia super().

- Si no existe el constructor por defecto en la clase padre dará un error en tiempo de compilación.

  • Explícita

- super();,  super(a, b);

- Dependiendo de si el constructor al que invocamos tiene o no argumentos.

¿Acceso protegido? Una subclase hereda todos los atributos definidos en la superclase, pero no puede acceder a los campos privados. Para permitir que en un método de la subclase se pueda acceder a una característica (atributo o método) de la superclase, éste tiene que declararse como protegido (protected). Si está protegido, sus características son visibles a las subclases y al resto de clases del paquete.

Podemos clasificar los modificadores de acceso de más a menos restrictivos:

  • Private: visible sólo en la clase donde se define.
  • Sin modificador: visible en las clases del paquete.
  • Protected: visible por las subclases y por el resto de clases del paquete.
  • Public: visible por todas las clases.

En java, se puede le aplicar el modificador final a un método para indicar que no puede ser redefinido. También es aplicable a una clase, con el fin de indicar que no se puede heredar de ella.

En este diagrama, director, mantenimiento e informático son subclases de la clase empleado, que es la superclase. Por otra parte, director es la superclase de ejecutivo y de comercial, las cuales son subclases de directivo.

Esto podríamos definirlo así:

class Empleado{} class Director extends Empleado{} class Ejecutivo extends Director{} class Comercial extends Director{} class Mantenimiento extends Empleado{} class Informatico extends Empleado{}

El ejercicio que voy a explicar, constará de 3 clases, que se llamarán: Persona(), Empleado() y Ejecución(). La primera clase, Persona(),  la utilizaremos para introducir simplemente el nombre y la edad de la persona. Además, podremos mostrar sus datos por pantalla. A continuación, crearemos la clase Empleado(), que heredará de Persona():

public class Empleado extends Persona{}

Desde la clase Empleado, introduciremos el cargo en la empresa y el salario de la persona. Finalmente, en la clase Ejecutar tendremos el main, donde ejecutaremos todo el programa y crearemos los empleados que queramos.

Cuando se crea un objeto de una clase heredada, lo primero que se hará es llamar al constructor de su superclase y a continuación, al constructor propio. Esto lo podemos ver al crear en la clase Persona el constructor. Su función es la de crear un objeto Scanner para poder leer datos desde el teclado. También podemos verlo en la clase Empleado y en su constructor. Lo que hace simplemente es mostrar por pantalla un mensaje diciendo que hay un nuevo empleado al crear un objeto empleado:

//Dentro de la clase Persona en Persona.java está el constructor public Persona(){ reader=new Scanner(System.in); } //Dentro de la clase Empleado en Empleado.java está el constructor public Empleado(){ System.out.println("Nuevo empleado"); } A continuación, escribimos el código para introducir nombre y edad en Persona.java: public void introducir_datos_personales(){ System.out.print("Introduzca nombre: "); nombre=reader.next(); System.out.print("Introduzca edad: "); edad=reader.nextInt(); } public void mostrar_datos_personales(){ System.out.println("Nombre: "+nombre+".nEdad: "+edad+"."); } También escribimos el código de la clase Empleado para introducir su cargo y salario: public void introducir_cargo_y_sueldo(){ System.out.print("Introduzca su cargo en la empresa: "); cargo=reader.next(); System.out.print("Introduzca su sueldo mensual: "); sueldo=reader.nextInt(); } public void mostrar_datos_empleado(){ System.out.println("Cargo: "+cargo+".nSalario: "+sueldo+" Euros al mes."); } El código de la clase Ejecutar, en el archivo Ejecutar.java será, por ejemplo, el siguiente: package herencia; public class Ejecutar{ public static void main(String[] args){ Empleado empleado1=new Empleado(); empleado1.introducir_datos_personales(); empleado1.introducir_cargo_y_sueldo(); empleado1.mostrar_datos_personales(); empleado1.mostrar_datos_empleado(); Empleado empleado2=new Empleado(); empleado2.introducir_cargo_y_sueldo(); } } Obteniendo al ejecutar el código:

El código completo de los tres archivos .java es el siguiente: package herencia; import java.util.Scanner; /** * Persona.java * * @author mario * TUtorial 13 Java: Herencia * * */ public class Persona { protected Scanner reader; protected String nombre; protected int edad; public Persona(){ reader=new Scanner(System.in); } public void introducir_datos_personales(){ System.out.print("Introduzca nombre: "); nombre=reader.next(); System.out.print("Introduzca edad: "); edad=reader.nextInt(); } public void mostrar_datos_personales(){ System.out.println("Nombre: "+nombre+".nEdad: "+edad+"."); } } package herencia; /** * Empleado.java * * @author mario * TUtorial 13 Java: Herencia * * */ public class Empleado extends Persona{ private String cargo; private int sueldo; public Empleado(){ System.out.println("Nuevo empleado"); } public void introducir_cargo_y_sueldo(){ System.out.print("Introduzca su cargo en la empresa: "); cargo=reader.next(); System.out.print("Introduzca su sueldo mensual: "); sueldo=reader.nextInt(); } public void mostrar_datos_empleado(){ System.out.println("Cargo: "+cargo+".nSalario: "+sueldo+" Euros al mes."); } } package herencia; /** * Ejecutar.java * * @author mario * TUtorial 13 Java: Herencia * * */ public class Ejecutar{ public static void main(String[] args){ Empleado empleado1=new Empleado(); empleado1.introducir_datos_personales(); empleado1.introducir_cargo_y_sueldo(); empleado1.mostrar_datos_personales(); empleado1.mostrar_datos_empleado(); Empleado empleado2=new Empleado(); empleado2.introducir_cargo_y_sueldo(); } }

Esto es todo por hoy. Espero que haya quedado claro el concepto de herencia en Java. Si tenéis alguna pregunta, dejad un comentario. ¡Nos vemos en el próximo tutorial!