Hola te saluda ōba lacosta bienvenida y bienvenido nuevamente.
Espero que estén listos para comenzar con esta elección.
A continuación vamos a estudiar el tema de polimorfismo en Yahoo.
Están listos.
Vamos
polimorfismo en Java el polimorfismo es la habilidad de ejecutar métodos sintácticamente iguales en
tipos distintos.
Vamos a revisar este concepto de la programación orientada a objetos con el siguiente ejemplo un objeto
creado en la memoria Agip sólo puede tener una forma y un tipo y esto nunca cambia durante toda la vida
del objeto creado.
Sin embargo una variable de un tipo puede referenciar a objetos de diferentes tipos siempre y cuando
haya una relación entre estos tipos.
Cómo puede ser una relación de herencia clase padre y clase e hija una variable de tipo de una clase
padre puede almacenar referencias de clases hijas o del mismo tipo de la clase padre y mandar a llamar
los métodos que tienen en común utilizando polimorfismo es decir que ejecuta los métodos de la clase
e hija con la variable de tipo de la clase padre.
Esto es precisamente el concepto de polimorfismo la importancia del polimorfismo es que podemos generalizar
un método que reciba distintos tipos en la jerarquía de clases definida clases padre e hijas.
Por ejemplo un método que imprima los detalles de cada clase sin importar si el objeto recibido es de
tipo padre o de tipo hijo.
Y todo esto con una sola variable de tipo padre.
En el ejemplo mostrado observamos que en el código se crea una variable de tipo empleado es decir de
tipo padre llamada en esta variable se almacena en la memoria Stack ya que es una variable local y la
variable m se le asigna una referencia de un objeto de tipo padre es decir de tipo empleado así que
en este momento estamos creando un objeto de tipo empleado se crea el objeto en la memoria Agip y se
le asigna una referencia a la variable Empa con el atributo de nombre igual a Juan y cuando se manda
llamar el método obtener detalles con la variable.
El método que se ejecuta es el de la clase empleado así que en este momento el método que se está ejecutando
es el de la clase padre ya que el tipo definido en la memoria IP es de tipo empleado hasta aquí no hay
nada nuevo ya que estamos llamando un método del mismo tipo de la clase padre.
Sin embargo posteriormente con la misma variable de tipo padre en este caso la variable m le asignamos
una referencia de tipo hijo así que observamos que creamos un nuevo objeto de tipo hijo y le asignamos
esa referencia a un tipo padre ya que recordemos que la variable m es de tipo empleado y el objeto lo
creamos con los valores de Carla.
El sueldo de 2000 y el Departamento de Finanzas y posteriormente mandamos a llamar el método obtener
detalles aquí es donde puede surgir la duda cuál es el método que se manda llamar el de la clase empleado
debido a que la variable es de tipo empleado o el método de la clase gerente ya que la referencia a
la que apunta la variable es de un tipo gerente la respuesta a esta pregunta tiene que ver precisamente
con el concepto de polimorfismo el cual dice que el método que se ejecute será del objeto cuya referencia
esté apuntando en tiempo de ejecución.
Por lo tanto podemos concluir que en este último caso el método que se ejecuta es el método obtener
detalles de la clase gerente.
Ya que según hemos comentado la variable es de tipo empleado pero está apuntando a un objeto de tipo
gerente y por lo tanto el método obtener detalles que se ejecuta es del tipo que tenga almacenado en
tiempo de ejecución.
En este caso el tipo es gerente y por lo tanto el método de obtener detalles que se ejecuta es de la
clase gerente así que este concepto de polimorfismo tiene que ver mucho con el concepto de sobre escritura
que vimos en la lección anterior y por lo tanto en este caso el método que se manda llamar del objeto
gerente es el método obtener detalles sobre escrito en esta clase de tipo gerente así que sin importar
que la variable sea de tipo empleado el método que finalmente se ejecutará será el tipo al cual haga
referencia y en este caso está haciendo referencia a un tipo gerente la variable ENV puede almacenar
una referencia de tipo gerente.
Debido a que la clase gerente extiende la clase empleado de otra forma no sería posible almacenar esta
referencia por esta variable.
Por ejemplo la variable ENV no puede almacenar una referencia de un tipo string ya que la clase string
no hace extent de la clase empleado y por lo tanto no tienen nada en común.
Por ello hablar de polimorfismo está también estrechamente relacionado con el tema de herencia y debe
existir algún tipo de relación entre las clases que ejecutarán el concepto de polimorfismo así como
conclusión podemos decir que se ejecutará el método del tipo al cual apunta en tiempo de ejecución
llegaba de donã y polimorfismo en Java podemos resumir el concepto de polimorfismo con el siguiente
diagrama de donã.
Vamos a observar dos casos un objeto de tipo empleado y otro objeto de tipo gerente así que por un lado
definimos el objeto de tipo empleado el cual si recordamos hemos definido un método público llamado
obtener detalles y tenemos dos atributos de tipo protegido nombre y sueldo por otro lado tenemos una
clase e hija la cual estamos definiendo un objeto de tipo gerente y este objeto hereda algunas características
de la clase padre y podemos observar por el color lo que se hereda de la clase padre y también podemos
observar cómo es que se va agregando más características a la clase e hija según la clase e hija vaya
definiendo estos detalles así que observamos por el color los métodos heredados de la clase empleado
y posteriormente los métodos agregados por la clase gerente y debido a que la clase gerente ha escrito
el método obtener detalles podemos observar que el método obtener detalles de la clase padre se oculta
así que conforme vamos avanzando de más externo más interno en la definición de los métodos se van ocultando
estos métodos por ello el método heredado de la clase empleado está oculto pero se puede acceder por
medio de la palabra super y el método que ha descrito la clase gerente es el que se ejecuta directamente.
Este método no está oculto sino que ha escrito al método obtener detalles por lo tanto este método queda
oculto y no es accesible directamente sino que únicamente a través de la llamada a Súper.
Todo esto dentro de la clase gerente fuera de esta clase gerente la llamada Súper no tiene uso debido
a que debe de ser dentro de una clase e hija por ello la palabra súper hace referencia a los métodos
o atributos de la clase padre así que por medio de este diagrama podemos observar cómo es que un método
que describe a un método de la clase padre puede ocultarlo y también podemos observar cómo es que se
va formando realmente un objeto.
Internamente vamos a tener los atributos y métodos de la clase padre y conforme vayamos avanzando hacia
la parte externa del objeto vamos a ir agregando las nuevas características definidas por la clase e
hija sobre todo en este caso respecto al concepto de sobre escritura de métodos y también aplicando
el concepto de polimorfismo así que básicamente este concepto de polimorfismo tiene que ver con múltiples
formas que se ejecutan al momento de utilizar nuestros objetos y respecto a la duda de que si se ejecuta
el método de la clase hija o el método heredado de la clase padre podemos observar que el método más
externo es el que se va a ejecutar.
Por lo tanto aquí no hay duda respecto a qué método se va a ejecutar podemos observar gráficamente que
el método más externo en este caso el definido por la clase gerente es el que se va a ejecutar y por
lo tanto el concepto de polimorfismo se define claramente si trabajamos con este tipo de diagramas.
Así con este diagrama queda más claro el concepto de polimorfismo sobre escritura y cuál es el método
que se manda llamar.
Una vez que estamos utilizando varios tipos de datos súper e invocación de método sobre escritos una
subclase puede invocar a un método de la clase padre por medio de la palabra super la palabra super
es como el operador dis pero hace referencia a la clase padre.
La palabra super puede referenciar atributos o métodos de la clase padre así que el método que se invoca
por medio de la palabra super no necesariamente debe estar declarado en la clase padre sino podría estar
declarado en una clase más arriba en la jerarquía de clases es decir una clase padre de la clase padre
o incluso una jerarquía más elevada.
Como podemos observar en la figura una de las ventajas del uso de super es la reutilización de código
así que en lugar de duplicar el Código de la clase empleado podemos aprovechar lo que ya realiza este
método y solo agregar al método descrito por la clase gerente lo que necesitamos para completar este
método en este caso.
Agregar el atributo de departamento de esta manera podemos reutilizar el código de la clase padre si
es que aplica así que podemos observar que el método definido por la clase padre llamado obtener detalles
ya tiene la impresión de los atributos nombre puesto y nivel pero ahora en la clase gerente si queremos
sobreescribir el comportamiento de la clase padre estamos repitiendo el código que ya hemos definido
en la clase padre y para evitar esta parte del código lo que podemos hacer es mandar a llamar al método
super de la clase padre y únicamente concatenar el nuevo atributo agregado por la clase gerente.
De esta manera estamos utilizando tanto el nuevo método sobre escrito obtener detalles pero también
estamos utilizando el código definido por la clase padre así que aunque esté oculto la llamada a este
método por medio de la palabra súper podemos hacer uso todavía de este código y mandar a llamar directamente.
El método de la clase padre utilizando super junto obtener detalles así que vamos a crear a continuación
un ejercicio para aplicar todos estos conceptos.