Herencia Java
Herencia Java
Herencia Java
De cada uno de ellos vamos a necesitar algunos datos que reflejaremos en los
atributos y una serie de acciones que reflejaremos en sus mtodos. Estos
atributos y mtodos los mostramos en el siguiente diagrama de clases:
Como se puede observar, vemos que en las tres clases tenemos atributos y
mtodos que son iguales ya que los tres tienen los atributos id, Nombre,
Apellidos y Edad; y los tres tienen los mtodos de Viajar y Concentrarse:
A nivel de cdigo tenemos lo siguiente tras ver el diagrama de clases:
Lo que podemos ver en este punto es que estamos escribiendo mucho cdigo
repetido ya que las tres clases tienen mtodos y atributos comunes
Es muy importante decir que las clases hijas no van a heredar nunca los
atributos y mtodos privados de la clase padre, as que mucho cuidado con
esto.
La ventaja de la herencia, tenemos ahora una clase padre con 'n' lineas de
cdigo y tres clases hijas con 'a', 'b' y 'c' lineas de cdigos respectivamente, por
tanto, se reduce el cdigo en '2n' lneas menos ya que antes tena
'(n+a)+(n+b)+(n+c)' lneas de cdigo y ahora tras aplicar herencia saldra
'n+a+b+c' lneas, aunque tambin es cierto que hay una clase ms, que es la
clase padre.
Clases Hijas:
En los cdigos se observa que hay palabras reservadas "nuevas" como son
"extends", "protected" y "super":
Hasta aqu todo correcto, pero ahora vamos a ver como se trabaja con estas
clases. Para ver este funcionamiento de forma clara y sencilla vamos a trabajar
con un objeto de cada clase y vamos a ver como se crean y de qu forma
ejecutan su mtodo. Para ello empecemos mostrando el siguiente fragmento de
cdigo:
package Seleccion;
import java.util.ArrayList;
public class Main {
// ArrayList de objetos SeleccionFutbol. Idenpendientemente
de la clase hija a la que pertenezca el objeto
public static ArrayList<SeleccionFutbol> integrantes = new
ArrayList<>();
integrantes.add(Gareca);
integrantes.add(Pizarro);
integrantes.add(Carmona);
// CONCENTRACION
System.out.println("Todos los integrantes comienzan
una concentracion. (Todos ejecutan el mismo mtodo)");
integrantes.stream().map((integrante) -> {
System.out.print(integrante.getNombre()+"
"+integrante.getApellidos()+" -> ");
return integrante;
}).forEach((integrante) -> {
integrante.Concentrarse();
});
// VIAJE
System.out.println("\nTodos los integrantes viajan
para jugar un partido. (Todos ejecutan el mismo mtodo)");
integrantes.stream().map((integrante) -> {
System.out.print(integrante.getNombre()+"
"+integrante.getApellidos()+" -> ");
return integrante;
}).forEach((integrante) -> {
integrante.Viajar();
}
Lo primero que vemos es que nos creamos un objeto de cada clase, pasndole
los atributos al constructor como parmetro y despus "sorprendentemente" los
metemos en un "ArrayList" de objetos de la clase "SeleccionFutbol" que es
la clase padre. Esto evidentemente te lo permite hacer ya que todos los objetos
son hijos de la misma clase padre. Luego como veis, recorremos el ArrayList y
ejecutamos sus mtodos "comunes" como son el 'Concentrarse' y el 'Viajar'. Este
cdigo da como salida lo siguiente:
run:
Todos los integrantes comienzan una concentracion. (Todos
ejecutan el mismo mtodo)
Ricardo Gareca -> Concentrarse
Claudio Pizaro -> Concentrarse
Alfreso Carmona -> Concentrarse
// ENTRENAMIENTO
System.out.println("\nEntrenamiento: Solamente el
entrenador y el futbolista tiene metodos para entrenar:");
System.out.print(Gareca.getNombre()+"
"+Gareca.getApellidos()+" -> ");
Gareca.dirigirEntrenamiento();
System.out.print(Pizarro.getNombre()+"
"+Pizarro.getApellidos()+" -> ");
Pizarro.entrenar();
// MASAJE
System.out.println("\nMasaje: Solo el masajista tiene
el mtodo para dar un masaje:");
System.out.print(Carmona.getNombre()+"
"+Carmona.getApellidos()+" -> ");
Carmona.darMasaje();
// PARTIDO DE FUTBOL
System.out.println("\nPartido de Ftbol: Solamente el
entrenador y el futbolista tiene metodos para el partido de
ftbol:");
System.out.print(Gareca.getNombre()+"
"+Gareca.getApellidos()+" -> ");
Gareca.dirigirPartido();
System.out.print(Pizarro.getNombre()+"
"+Pizarro.getApellidos()+" -> ");
Pizarro.jugarPartido();
Como vemos aunque el entrenador y los futbolistas asistan a un entrenamiento,
los dos hacen una funcin diferente en el mismo, por tanto hay que hacer
mtodos diferente para cada una de las clases. Ya veremos cuando hablemos
del polimorfismo que podremos ejecutar el mismo mtodo para clases diferentes
y que esos mtodos hagan cosas distintas. Como resultado al cdigo mostrado
tenemos lo siguiente:
Entrenamiento: Solamente el entrenador y el futbolista tiene metodos para
entrenar:
Ricardo Gareca -> Dirige un entrenamiento
Claudio Pizaro -> Entrena