0 votos

Buenas que tal primero felicitar al dueño o dueños de este foro ya que el contenido que he encontrado ha sido muy util.

Bueno pasando a mi pregunta es con respecto al modulo llamado " Polimorfismo en Java (Parte I) " . En este modulo el metodo main es el sgte:

public static ArrayList<SeleccionFutbol> integrantes = new ArrayList<SeleccionFutbol>();

public static void main(String[] args) {
SeleccionFutbol delBosque = new Entrenador(1, "Vicente", "Del Bosque", 60, 28489);
SeleccionFutbol iniesta = new Futbolista(2, "Andres", "Iniesta", 29, 6, "Interior Derecho");
SeleccionFutbol raulMartinez = new Masajista(3, "Raúl", "Martinez", 41, "Licenciado en Fisioterapia", 18);

		integrantes.add(delBosque);
		integrantes.add(iniesta);
		integrantes.add(raulMartinez);

// ENTRENAMIENTO
System.out.println("nEntrenamiento: Todos los integrantes tienen su función en un entrenamiento (Especialización)");
for (SeleccionFutbol integrante : integrantes) {
	System.out.print(integrante.getNombre() + " " + integrante.getApellidos() + " -> ");
	integrante.entrenamiento();
}

// PARTIDO DE FUTBOL
System.out.println("nPartido de Fútbol: Todos los integrantes tienen su función en un partido (Especialización)");
for (SeleccionFutbol integrante : integrantes) {
	System.out.print(integrante.getNombre() + " " + integrante.getApellidos() + " -> ");
	integrante.partidoFutbol();
}

 

 

 

-Ahora yo estaba haciendo guiandome un poco y me di cuenta de algo como se puede observar a la hora de instanciar las Clases yo lo hize de otra forma no  hago SeleccionFutbol delBosque = new Entrenador(...)  sino Entrenador vicente=new Entrenador(...), y cuando veo  el resultado de consola es el mismo respetando el polimorfismo . Mi pregunta es ¿porque? yo deduzco que es porque el ArrayList es de tipo SeleccionFutbol pero no me queda del todo claro de porque funciona asi:

       public static ArrayList<SeleccionFutbol> Lista=new ArrayList<>();
   public static void main(String[]args){

    Futbolista iniesta = new Futbolista(2, "Andres", "Iniesta", 29, 6, "Interior Derecho");
    Masajista cielo = new Masajista(3, "Cielo", "Love", 41, "Licenciado en Fisioterapia", 18);
     Entrenador vicente = new Entrenador(5, "Vicente", "Del Bosque", 60, 28489);
     
   Lista.add(iniesta);
   Lista.add(cielo);
   Lista.add(vicente);
   System.out.println("nEntrenamiento: Todos los integrantes tienen su función en un entrenamiento (Especialización)");
   for(SeleccionFutbol integrante :Lista){
       System.out.print(integrante.getNombre() + " " + integrante.getApellidos() + " -> ");
    integrante.entrenamiento();
        
   }
   // PARTIDO DE FUTBOL
System.out.println("nPartido de Fútbol: Todos los integrantes tienen su función en un partido (Especialización)");
   for(SeleccionFutbol integrante :Lista){
       System.out.print(integrante.getNombre() + " " + integrante.getApellidos() + " -> ");
    integrante.partidoFutbol();
   }
   
   }

 

----------------------ACA DEJO TODO EL CODIGO COMPLETO LO HICE EN UNA CLASE ---------------------

link : https://docs.google.com/document/d/1uY4nnXWNsGjPkx3y88NOC9pE3lch3F04WKZM0VakV9I/edit?usp=sharing

por en Java
editado por

1 Respuesta

0 votos

Ante todo nos alegra que te guste nuestro foro y que sea útil.

Respondiendo a tu pregunta, cuando haces instanciación directa con el hijo ya no estás aprovechando las ventajas del polimorfismo. Es decir:

 Futbolista iniesta = new Futbolista(2, "Andres", "Iniesta", 29, 6, "Interior Derecho");

En vez de aprovechar la ventaja:

SeleccionFutbol iniesta = new Futbolista(2, "Andres", "Iniesta", 29, 6, "Interior Derecho");

Esto tiene su sentido cuando "iniesta" no sabes si te va a llegar un objeto de tipo Futbolista, Masajista o Entrenador. Es decir, que en la variable "iniesta" si es tipo SeleccionFutbol, admitirás los tres tipos (Futbolista, Masajista o Entrenador), pero si "iniesta" es de tipo Futbolista pues será exclusivo de ese tipo (por eso también te funciona el código que has modificado, pero encorsetas mucho su uso).

Para que quede más claro, otro ejemplo del polimorfismo en Java se usa mucho en los listados:

List<String> MiLista = new ArrayList<String>();

Donde MiLista admite ArrayList pero también otros tipos que hereden de List (como AbstractList, ArrayList, LinkedList, RoleList, Vector y otros tantos más que podemos consultar en https://docs.oracle.com/javase/7/docs/api/java/util/List.html). Al utilizar polimorfismo creamos código de mantenimiento más sencillo, ya que si mañana por lo que sea en vez de querer utilizar un ArrayList queremos utilizar un LinkedList, nos va a funcionar igual:

List<String> MiLista = new LinkedList<String>();

Espero que quede más claro.

por