Foros del Web » Programación para mayores de 30 ;) » Java »

polimorfismo java

Estas en el tema de polimorfismo java en el foro de Java en Foros del Web. Buenas tardes a todos los miembros del foro, actualmente estoy haciendo lo posible por aprender polimorfismo en java, lo estoy estudiando de un libro y ...
  #1 (permalink)  
Antiguo 13/07/2012, 12:18
Avatar de oscard41  
Fecha de Ingreso: mayo-2012
Ubicación: Caracas
Mensajes: 288
Antigüedad: 11 años, 10 meses
Puntos: 8
polimorfismo java

Buenas tardes a todos los miembros del foro, actualmente estoy haciendo lo posible por aprender polimorfismo en java, lo estoy estudiando de un libro y en uno de los ejercicios me encontré con esto:

1) //proce en forma generica a cada elemento del arreglo empleados

for(Empleado empleadoActual : empleados) <----- "Empleados" es la superclase de varias subclases y "empleados" es un arreglo que tiene todas las subclases de de "Empleados" ahora pues no entiendo ese for empleadoActual es una variable que viene apareciendo apenas en ese for no esta declarada....

2) //conversion descendente de la referencia de "Empleados" a una referencia de //EmpleadosBaseMasComision

EmpleadoBaseMasComision empleado= (EmpleadoBaseMasComision) empleadoActual;<---------------- "EmpleadoBaseMasComision" es una de las subclases de "Empleado" y como les dije empleadoActual aparecio en el for


realmente por mas que leo la explicacion del libro no logro entender esa instruccion del for por lo general el for que conozco es el que se hace en c/c++..... y tampoco logro entender lo que le dicen conversion de ferecencias....


A las personas que me puedan ayudar de ante mano muchas gracias
  #2 (permalink)  
Antiguo 13/07/2012, 14:01
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: polimorfismo java

Hola:

Imagina una lista o array de algo y un bucle normal

Código java:
Ver original
  1. for (int i=0; i<array.size(); i++) {
  2.       .... array[i] ....
  3. }

Desde java 5 existe una forma más cómoda de recorrer los arrays y listas (colecciones en general), que es la sintaxis que ves ahí. Si el array/lista es de Empleado, el for se puede poner así

Código java:
Ver original
  1. for (Empleado empleadoActual : array ) {
  2.     ... empleadoActual ...
  3. }

es decir, recorre el array y en cada iteración mete en empleadoActual de tipo Empleado el elemento del array/lista que toca en cada iteración.

En cuanto a la conversión, si array es de tipo Empleado, puedes meter en él clases hijas de Empleado sin problemas, como EmpleadoBaseMasComision. El problema es cuando los recuperas. Como el array es de Empleado, te devuelve Empleado y no puedes usar métodos o cosas propias de EmpleadoBaseMasComision. La forma de volver a convertir ese elemento a su clase hija es con el paréntesis

EmpleadoBaseMasComision empleado= (EmpleadoBaseMasComision) empleadoActual;

Esto sólo funciona si lo que hay en ese elemento del array es realmente un EmpleadoBaseMasComision, si no lo es (es otro tipo de clase hija de Empleado), te dará error cuando ejecutes el programa.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 13/07/2012, 14:43
Avatar de oscard41  
Fecha de Ingreso: mayo-2012
Ubicación: Caracas
Mensajes: 288
Antigüedad: 11 años, 10 meses
Puntos: 8
Respuesta: polimorfismo java

MUHAAAASS GRAAACIASS disculpa las mayúsculas........ gracias por tu ayuda eres un genio
  #4 (permalink)  
Antiguo 13/07/2012, 15:22
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: polimorfismo java

Buenas,

La conversión de una referencia de una clase base a una subclase no es polimorfismo.

Explicado de una manera simplista, el polimorfismo es usar una referencia de la clase base que apunte a un objeto de una subclase y al usar un método declarado en la clase base y sobrescrito en la clase derivada, se llamase al método sobrescrito (el de la clase derivada) y no el de la clase base.

Saludos.
  #5 (permalink)  
Antiguo 13/07/2012, 15:51
Avatar de oscard41  
Fecha de Ingreso: mayo-2012
Ubicación: Caracas
Mensajes: 288
Antigüedad: 11 años, 10 meses
Puntos: 8
Respuesta: polimorfismo java

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

Imagina una lista o array de algo y un bucle normal

Código java:
Ver original
  1. for (int i=0; i<array.size(); i++) {
  2.       .... array[i] ....
  3. }

Desde java 5 existe una forma más cómoda de recorrer los arrays y listas (colecciones en general), que es la sintaxis que ves ahí. Si el array/lista es de Empleado, el for se puede poner así

Código java:
Ver original
  1. for (Empleado empleadoActual : array ) {
  2.     ... empleadoActual ...
  3. }

es decir, recorre el array y en cada iteración mete en empleadoActual de tipo Empleado el elemento del array/lista que toca en cada iteración.

En cuanto a la conversión, si array es de tipo Empleado, puedes meter en él clases hijas de Empleado sin problemas, como EmpleadoBaseMasComision. El problema es cuando los recuperas. Como el array es de Empleado, te devuelve Empleado y no puedes usar métodos o cosas propias de EmpleadoBaseMasComision. La forma de volver a convertir ese elemento a su clase hija es con el paréntesis

EmpleadoBaseMasComision empleado= (EmpleadoBaseMasComision) empleadoActual;

Esto sólo funciona si lo que hay en ese elemento del array es realmente un EmpleadoBaseMasComision, si no lo es (es otro tipo de clase hija de Empleado), te dará error cuando ejecutes el programa.

Se bueno.

Una ultima pregunta que es mas recomendable ¿hacer el polimorfismo igual que lo que me acabas de explicar o crear variables de las clases para acceder a los metodos.... osea por lo menos la clase EmpleadoBaseMasComision crear el objeto "empleado" y una vez con "empleado" acceder a las variables de instancias por medio de los metodos?
  #6 (permalink)  
Antiguo 13/07/2012, 22:22
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: polimorfismo java

Hola:

Si Empleado tiene un metodo() y su clase hija tiene el mismo metodo(), y tienes un EmpleadoBaseMasComision metido en el array de Empleado, puedes hacer perfectamente

Código java:
Ver original
  1. for (Empleado empleadoActual : empleados){
  2.    empleadoActual.metodo();
  3. }

Como Empleado tiene metodo(), puedes llamarlo sin hacer la conversión. Como el objeto realmente es un EmpleadoBaseMasComision, en realidad se está llamando a metodo() de EmpleadoBaseMasComision. Esto es en realidad el polimorfismo, tener una clase hija dentro de una variable del tipo de la clase padre, llamar "aparentemente" al metodo() de padre y en realidad se ejecuta el metodo() de la clase hija.

La conversion es necesaria cuando quieres llamar a un otroMetodo() que tiene la clase hija, pero no existe en la clase padre, entonces

empleadoActual.otroMetodo()

da error, puesto que Empleado no tiene ese metodo, es necesario hacer

((EmpleadoBaseMasComision)empleadoActual).otroMeto do();

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: clase, polimorfismo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:44.