1
00:00:10,040 --> 00:00:14,690
Hola te saluda ōba lacosta bienvenida y bienvenido nuevamente.

2
00:00:14,690 --> 00:00:17,960
Espero que estén listos para comenzar con esta elección.

3
00:00:17,990 --> 00:00:21,790
A continuación vamos a estudiar el tema de polimorfismo en Yahoo.

4
00:00:21,950 --> 00:00:22,910
Están listos.

5
00:00:22,910 --> 00:00:23,360
Vamos

6
00:00:26,060 --> 00:00:32,690
polimorfismo en Java el polimorfismo es la habilidad de ejecutar métodos sintácticamente iguales en

7
00:00:32,690 --> 00:00:34,520
tipos distintos.

8
00:00:34,520 --> 00:00:41,380
Vamos a revisar este concepto de la programación orientada a objetos con el siguiente ejemplo un objeto

9
00:00:41,380 --> 00:00:48,250
creado en la memoria Agip sólo puede tener una forma y un tipo y esto nunca cambia durante toda la vida

10
00:00:48,250 --> 00:00:49,750
del objeto creado.

11
00:00:49,750 --> 00:00:56,620
Sin embargo una variable de un tipo puede referenciar a objetos de diferentes tipos siempre y cuando

12
00:00:56,770 --> 00:00:58,990
haya una relación entre estos tipos.

13
00:00:59,110 --> 00:01:07,480
Cómo puede ser una relación de herencia clase padre y clase e hija una variable de tipo de una clase

14
00:01:07,480 --> 00:01:13,960
padre puede almacenar referencias de clases hijas o del mismo tipo de la clase padre y mandar a llamar

15
00:01:13,960 --> 00:01:21,070
los métodos que tienen en común utilizando polimorfismo es decir que ejecuta los métodos de la clase

16
00:01:21,070 --> 00:01:24,380
e hija con la variable de tipo de la clase padre.

17
00:01:24,430 --> 00:01:31,240
Esto es precisamente el concepto de polimorfismo la importancia del polimorfismo es que podemos generalizar

18
00:01:31,300 --> 00:01:38,230
un método que reciba distintos tipos en la jerarquía de clases definida clases padre e hijas.

19
00:01:38,230 --> 00:01:43,870
Por ejemplo un método que imprima los detalles de cada clase sin importar si el objeto recibido es de

20
00:01:43,870 --> 00:01:45,910
tipo padre o de tipo hijo.

21
00:01:45,910 --> 00:01:49,180
Y todo esto con una sola variable de tipo padre.

22
00:01:49,180 --> 00:01:54,700
En el ejemplo mostrado observamos que en el código se crea una variable de tipo empleado es decir de

23
00:01:54,700 --> 00:02:02,740
tipo padre llamada en esta variable se almacena en la memoria Stack ya que es una variable local y la

24
00:02:02,740 --> 00:02:10,250
variable m se le asigna una referencia de un objeto de tipo padre es decir de tipo empleado así que

25
00:02:10,250 --> 00:02:16,790
en este momento estamos creando un objeto de tipo empleado se crea el objeto en la memoria Agip y se

26
00:02:16,790 --> 00:02:24,560
le asigna una referencia a la variable Empa con el atributo de nombre igual a Juan y cuando se manda

27
00:02:24,560 --> 00:02:27,960
llamar el método obtener detalles con la variable.

28
00:02:28,250 --> 00:02:34,860
El método que se ejecuta es el de la clase empleado así que en este momento el método que se está ejecutando

29
00:02:35,100 --> 00:02:43,070
es el de la clase padre ya que el tipo definido en la memoria IP es de tipo empleado hasta aquí no hay

30
00:02:43,070 --> 00:02:47,850
nada nuevo ya que estamos llamando un método del mismo tipo de la clase padre.

31
00:02:47,990 --> 00:02:54,560
Sin embargo posteriormente con la misma variable de tipo padre en este caso la variable m le asignamos

32
00:02:54,590 --> 00:03:00,770
una referencia de tipo hijo así que observamos que creamos un nuevo objeto de tipo hijo y le asignamos

33
00:03:00,830 --> 00:03:08,570
esa referencia a un tipo padre ya que recordemos que la variable m es de tipo empleado y el objeto lo

34
00:03:08,570 --> 00:03:10,390
creamos con los valores de Carla.

35
00:03:10,430 --> 00:03:17,600
El sueldo de 2000 y el Departamento de Finanzas y posteriormente mandamos a llamar el método obtener

36
00:03:17,600 --> 00:03:25,190
detalles aquí es donde puede surgir la duda cuál es el método que se manda llamar el de la clase empleado

37
00:03:25,370 --> 00:03:31,490
debido a que la variable es de tipo empleado o el método de la clase gerente ya que la referencia a

38
00:03:31,490 --> 00:03:38,810
la que apunta la variable es de un tipo gerente la respuesta a esta pregunta tiene que ver precisamente

39
00:03:38,810 --> 00:03:45,740
con el concepto de polimorfismo el cual dice que el método que se ejecute será del objeto cuya referencia

40
00:03:45,800 --> 00:03:48,910
esté apuntando en tiempo de ejecución.

41
00:03:49,130 --> 00:03:55,700
Por lo tanto podemos concluir que en este último caso el método que se ejecuta es el método obtener

42
00:03:55,700 --> 00:03:57,990
detalles de la clase gerente.

43
00:03:59,630 --> 00:04:07,640
Ya que según hemos comentado la variable es de tipo empleado pero está apuntando a un objeto de tipo

44
00:04:07,640 --> 00:04:14,390
gerente y por lo tanto el método obtener detalles que se ejecuta es del tipo que tenga almacenado en

45
00:04:14,390 --> 00:04:15,830
tiempo de ejecución.

46
00:04:15,830 --> 00:04:21,500
En este caso el tipo es gerente y por lo tanto el método de obtener detalles que se ejecuta es de la

47
00:04:21,500 --> 00:04:27,590
clase gerente así que este concepto de polimorfismo tiene que ver mucho con el concepto de sobre escritura

48
00:04:27,770 --> 00:04:33,740
que vimos en la lección anterior y por lo tanto en este caso el método que se manda llamar del objeto

49
00:04:33,740 --> 00:04:41,120
gerente es el método obtener detalles sobre escrito en esta clase de tipo gerente así que sin importar

50
00:04:41,120 --> 00:04:48,770
que la variable sea de tipo empleado el método que finalmente se ejecutará será el tipo al cual haga

51
00:04:48,770 --> 00:04:56,070
referencia y en este caso está haciendo referencia a un tipo gerente la variable ENV puede almacenar

52
00:04:56,100 --> 00:04:57,950
una referencia de tipo gerente.

53
00:04:58,080 --> 00:05:04,680
Debido a que la clase gerente extiende la clase empleado de otra forma no sería posible almacenar esta

54
00:05:04,680 --> 00:05:06,940
referencia por esta variable.

55
00:05:07,620 --> 00:05:13,350
Por ejemplo la variable ENV no puede almacenar una referencia de un tipo string ya que la clase string

56
00:05:13,590 --> 00:05:18,810
no hace extent de la clase empleado y por lo tanto no tienen nada en común.

57
00:05:18,810 --> 00:05:24,990
Por ello hablar de polimorfismo está también estrechamente relacionado con el tema de herencia y debe

58
00:05:24,990 --> 00:05:32,220
existir algún tipo de relación entre las clases que ejecutarán el concepto de polimorfismo así como

59
00:05:32,220 --> 00:05:38,670
conclusión podemos decir que se ejecutará el método del tipo al cual apunta en tiempo de ejecución

60
00:05:41,780 --> 00:05:48,050
llegaba de donã y polimorfismo en Java podemos resumir el concepto de polimorfismo con el siguiente

61
00:05:48,050 --> 00:05:49,460
diagrama de donã.

62
00:05:49,460 --> 00:05:56,160
Vamos a observar dos casos un objeto de tipo empleado y otro objeto de tipo gerente así que por un lado

63
00:05:56,160 --> 00:06:02,130
definimos el objeto de tipo empleado el cual si recordamos hemos definido un método público llamado

64
00:06:02,190 --> 00:06:09,180
obtener detalles y tenemos dos atributos de tipo protegido nombre y sueldo por otro lado tenemos una

65
00:06:09,180 --> 00:06:16,110
clase e hija la cual estamos definiendo un objeto de tipo gerente y este objeto hereda algunas características

66
00:06:16,290 --> 00:06:23,010
de la clase padre y podemos observar por el color lo que se hereda de la clase padre y también podemos

67
00:06:23,010 --> 00:06:29,130
observar cómo es que se va agregando más características a la clase e hija según la clase e hija vaya

68
00:06:29,130 --> 00:06:37,310
definiendo estos detalles así que observamos por el color los métodos heredados de la clase empleado

69
00:06:38,580 --> 00:06:46,260
y posteriormente los métodos agregados por la clase gerente y debido a que la clase gerente ha escrito

70
00:06:46,500 --> 00:06:53,160
el método obtener detalles podemos observar que el método obtener detalles de la clase padre se oculta

71
00:06:53,700 --> 00:07:00,630
así que conforme vamos avanzando de más externo más interno en la definición de los métodos se van ocultando

72
00:07:00,690 --> 00:07:08,470
estos métodos por ello el método heredado de la clase empleado está oculto pero se puede acceder por

73
00:07:08,470 --> 00:07:15,700
medio de la palabra super y el método que ha descrito la clase gerente es el que se ejecuta directamente.

74
00:07:15,700 --> 00:07:22,540
Este método no está oculto sino que ha escrito al método obtener detalles por lo tanto este método queda

75
00:07:22,540 --> 00:07:28,800
oculto y no es accesible directamente sino que únicamente a través de la llamada a Súper.

76
00:07:28,810 --> 00:07:35,050
Todo esto dentro de la clase gerente fuera de esta clase gerente la llamada Súper no tiene uso debido

77
00:07:35,080 --> 00:07:41,110
a que debe de ser dentro de una clase e hija por ello la palabra súper hace referencia a los métodos

78
00:07:41,200 --> 00:07:47,770
o atributos de la clase padre así que por medio de este diagrama podemos observar cómo es que un método

79
00:07:47,770 --> 00:07:54,430
que describe a un método de la clase padre puede ocultarlo y también podemos observar cómo es que se

80
00:07:54,430 --> 00:07:56,550
va formando realmente un objeto.

81
00:07:56,710 --> 00:08:03,610
Internamente vamos a tener los atributos y métodos de la clase padre y conforme vayamos avanzando hacia

82
00:08:03,610 --> 00:08:09,340
la parte externa del objeto vamos a ir agregando las nuevas características definidas por la clase e

83
00:08:09,340 --> 00:08:15,130
hija sobre todo en este caso respecto al concepto de sobre escritura de métodos y también aplicando

84
00:08:15,160 --> 00:08:22,160
el concepto de polimorfismo así que básicamente este concepto de polimorfismo tiene que ver con múltiples

85
00:08:22,160 --> 00:08:29,390
formas que se ejecutan al momento de utilizar nuestros objetos y respecto a la duda de que si se ejecuta

86
00:08:29,540 --> 00:08:35,300
el método de la clase hija o el método heredado de la clase padre podemos observar que el método más

87
00:08:35,300 --> 00:08:37,890
externo es el que se va a ejecutar.

88
00:08:38,240 --> 00:08:43,940
Por lo tanto aquí no hay duda respecto a qué método se va a ejecutar podemos observar gráficamente que

89
00:08:43,940 --> 00:08:49,730
el método más externo en este caso el definido por la clase gerente es el que se va a ejecutar y por

90
00:08:49,730 --> 00:08:55,500
lo tanto el concepto de polimorfismo se define claramente si trabajamos con este tipo de diagramas.

91
00:08:55,670 --> 00:09:01,700
Así con este diagrama queda más claro el concepto de polimorfismo sobre escritura y cuál es el método

92
00:09:01,700 --> 00:09:02,810
que se manda llamar.

93
00:09:02,840 --> 00:09:12,710
Una vez que estamos utilizando varios tipos de datos súper e invocación de método sobre escritos una

94
00:09:12,710 --> 00:09:20,010
subclase puede invocar a un método de la clase padre por medio de la palabra super la palabra super

95
00:09:20,070 --> 00:09:24,220
es como el operador dis pero hace referencia a la clase padre.

96
00:09:24,390 --> 00:09:31,320
La palabra super puede referenciar atributos o métodos de la clase padre así que el método que se invoca

97
00:09:31,320 --> 00:09:37,650
por medio de la palabra super no necesariamente debe estar declarado en la clase padre sino podría estar

98
00:09:37,650 --> 00:09:44,580
declarado en una clase más arriba en la jerarquía de clases es decir una clase padre de la clase padre

99
00:09:45,030 --> 00:09:48,060
o incluso una jerarquía más elevada.

100
00:09:48,240 --> 00:09:53,880
Como podemos observar en la figura una de las ventajas del uso de super es la reutilización de código

101
00:09:54,390 --> 00:10:00,780
así que en lugar de duplicar el Código de la clase empleado podemos aprovechar lo que ya realiza este

102
00:10:00,780 --> 00:10:08,040
método y solo agregar al método descrito por la clase gerente lo que necesitamos para completar este

103
00:10:08,040 --> 00:10:09,930
método en este caso.

104
00:10:09,930 --> 00:10:16,580
Agregar el atributo de departamento de esta manera podemos reutilizar el código de la clase padre si

105
00:10:16,580 --> 00:10:22,970
es que aplica así que podemos observar que el método definido por la clase padre llamado obtener detalles

106
00:10:23,240 --> 00:10:30,940
ya tiene la impresión de los atributos nombre puesto y nivel pero ahora en la clase gerente si queremos

107
00:10:30,940 --> 00:10:37,000
sobreescribir el comportamiento de la clase padre estamos repitiendo el código que ya hemos definido

108
00:10:37,060 --> 00:10:43,570
en la clase padre y para evitar esta parte del código lo que podemos hacer es mandar a llamar al método

109
00:10:43,570 --> 00:10:49,740
super de la clase padre y únicamente concatenar el nuevo atributo agregado por la clase gerente.

110
00:10:49,750 --> 00:10:56,020
De esta manera estamos utilizando tanto el nuevo método sobre escrito obtener detalles pero también

111
00:10:56,080 --> 00:11:02,320
estamos utilizando el código definido por la clase padre así que aunque esté oculto la llamada a este

112
00:11:02,320 --> 00:11:09,790
método por medio de la palabra súper podemos hacer uso todavía de este código y mandar a llamar directamente.

113
00:11:09,790 --> 00:11:16,930
El método de la clase padre utilizando super junto obtener detalles así que vamos a crear a continuación

114
00:11:16,990 --> 00:11:20,170
un ejercicio para aplicar todos estos conceptos.
