1
00:00:01,280 --> 00:00:02,950
Hola bienvenidos a esta elección.

2
00:00:02,970 --> 00:00:06,090
A continuación van a estudiar el tema de clases abstractas en Java.

3
00:00:06,240 --> 00:00:07,230
Están listos.

4
00:00:07,290 --> 00:00:15,610
Vamos en este ejercicio vamos a poner en práctica el siguiente diagrama de clases por un lado vamos

5
00:00:15,610 --> 00:00:20,590
a crear el paquete abstracto punto Domaine y dentro de este paquete vamos a deposité a las siguientes

6
00:00:20,590 --> 00:00:21,360
clases.

7
00:00:21,610 --> 00:00:27,400
Vamos a crear una primera clase de tipo abstracta llamada figura geométrica y por otro lado vamos a

8
00:00:27,400 --> 00:00:29,010
crear algunas clases hijas.

9
00:00:29,230 --> 00:00:36,050
La clase de triángulo que es una subclase de la clase abstracta posteriormente la clase rectángulo y

10
00:00:36,050 --> 00:00:37,880
finalmente la clase de círculo

11
00:00:41,110 --> 00:00:43,380
y por otro lado vamos a crear otro paquete.

12
00:00:43,460 --> 00:00:48,530
Ejemplo clases abstractas con la clase llamada ejemplo clases abstractas en la cual vamos a poner a

13
00:00:48,530 --> 00:00:53,140
prueba a cada una de estas clases que hemos agregado en el paquete abstracto Domain.

14
00:00:53,150 --> 00:00:58,820
Así que vamos a poner en práctica este diagrama de clases bien como primer paso vamos a abrir nuestro

15
00:00:58,820 --> 00:01:05,830
IDE cerramos cualquier proyecto que tengamos abierto en su derecho Kloss damos siguen Feil ni un proyecto

16
00:01:06,160 --> 00:01:11,530
para crear nuestro nuevo proyecto seleccionamos llevá with Maybe y posteriormente Java Application.

17
00:01:11,650 --> 00:01:14,860
Damos clic en Next y el nombre del proyecto se va a llamar

18
00:01:18,530 --> 00:01:24,810
ejemplo creeís abstractas y lo depositamos en la ruta desde dos puntos.

19
00:01:24,810 --> 00:01:33,200
Diagonal inversa cursos diagonal inversa Java el grupo Iribas RMX con G.M. globalmente en la versión

20
00:01:33,200 --> 00:01:41,590
1.0 y dejamos el nombre del paquete vacío y damos fuguen finalizar bien ahora como siguiente paso vamos

21
00:01:41,590 --> 00:01:47,860
a comenzar con nuestra clase abstracta sobre nuestro proyecto damos clic derecho neo Java class el nombre

22
00:01:47,860 --> 00:01:55,540
de la clase va a ser figura geométrica y el nombre del paquete va a ser abstracto.

23
00:01:58,410 --> 00:02:08,360
Punto Domaine y damos clic en Finalizar quitamos estos comentarios para poder definir esta clase como

24
00:02:08,430 --> 00:02:09,630
abstracta.

25
00:02:09,630 --> 00:02:17,420
Vamos a agregar este modificador de acceso Public abstract y posteriormente la palabra reservada Class

26
00:02:17,810 --> 00:02:23,500
y el nombre de nuestra clase así que simplemente es un modificador de acceso más pero esto es lo que

27
00:02:23,500 --> 00:02:28,360
implica es que no vamos a poder crear objetos de esta clase.

28
00:02:28,360 --> 00:02:34,870
Esto significa el concepto de abstracto no podemos crear instancias de esta clase de figuras geométricas.

29
00:02:34,870 --> 00:02:40,180
Para ello es que vamos a definir clases hijas de esta clase figura geométrica bien de momento vamos

30
00:02:40,180 --> 00:02:46,290
a dejar hasta aquí este código y vamos a continuar agregando las demás clases posteriormente dentro

31
00:02:46,290 --> 00:02:54,320
de este mismo paquete vamos a agregar otra clase damos de Derecho Neon Java class la clase se llama

32
00:02:54,320 --> 00:03:00,790
círculo y la depositamos en el mismo paquete de abstracto a punto Domain quitamos estos comentarios

33
00:03:02,700 --> 00:03:08,320
y esta clase de círculo va a extender la clase padre figura geométrica extensión

34
00:03:11,290 --> 00:03:17,560
figura geométrica bien ahora creamos nuestra siguiente clase de la clase de triángulo damos clic derecho

35
00:03:17,560 --> 00:03:18,580
Nioh Java class

36
00:03:21,670 --> 00:03:26,030
triángulo y damos clic en Finalizar de igual manera.

37
00:03:26,030 --> 00:03:33,170
Esta clase se va a extender de la clase padre abstracta figura geométrica.

38
00:03:35,780 --> 00:03:48,230
Figura geométrica y finalmente agregamos la clase de rectángulo un Class rectángulo en finalizar quitamos

39
00:03:48,230 --> 00:03:52,620
estos comentarios y hacemos extensos

40
00:03:56,070 --> 00:04:03,670
de la clase figura geométrica bien vamos a comenzar con el código de nuestras clases.

41
00:04:03,920 --> 00:04:06,720
En este ejemplo que estamos realizando la clase figura geométrica.

42
00:04:06,830 --> 00:04:12,410
Realmente no sabemos de qué tipo es por lo tanto necesitamos de clases hijas como la clase de círculo

43
00:04:12,590 --> 00:04:18,500
triángulo rectángulo para saber qué tipo de figura geométrica es por lo tanto la clase figura geométrica

44
00:04:18,530 --> 00:04:24,530
la vamos a definir como abstracta es decir que no la podemos utilizar directamente pero las clases fijas

45
00:04:24,650 --> 00:04:30,500
son las que van a definir qué tipo de figura geométrica es la que se va a utilizar así que vamos a agregar

46
00:04:30,500 --> 00:04:37,130
un atributo que se va a heredar a las clásicas por lo tanto lo vamos a definir como un protegido de

47
00:04:37,130 --> 00:04:44,180
tipo string llamado tipo figura ya que solamente las clases hijas pueden saber de qué tipo de figura

48
00:04:44,180 --> 00:04:49,660
son posteriormente definimos también un constructor protegido

49
00:04:55,540 --> 00:04:58,270
el cual va inicializar el atributo de figura geométrica

50
00:05:05,640 --> 00:05:06,930
y utilizamos el argumento

51
00:05:10,740 --> 00:05:18,730
para inicializar el atributo de figura geométrica aquí podemos utilizar el mismo nombre tipo figura

52
00:05:25,840 --> 00:05:32,290
tipo figura bien conocida tenemos el constructor de nuestra clase el cual también se va a heredar a

53
00:05:32,290 --> 00:05:39,100
las clases hijas y vamos a agregar ahora un método que también va a ser abstracto públic para definir

54
00:05:39,100 --> 00:05:45,990
un método abstracto utilizamos la palabra reservada abstract posteriormente indicamos el tipo de regreso

55
00:05:45,990 --> 00:05:47,850
en este caso no va a regresar nada.

56
00:05:47,850 --> 00:05:52,980
El método se va a llamar dibujar pero debido a que es un método abstracto no contiene el cuerpo del

57
00:05:52,980 --> 00:05:58,200
método así que los métodos abstractos no incluyen ningún código.

58
00:05:58,200 --> 00:06:03,660
Por lo tanto terminan simplemente con punto y coma y las clases fijas son las que se van a encargar

59
00:06:03,750 --> 00:06:08,040
de sobreescribir el comportamiento del método abstracto definido en la clase padre

60
00:06:10,970 --> 00:06:20,040
así que agregamos el comentario la clase padre no define el comportamiento sino que las clases hijas

61
00:06:20,190 --> 00:06:26,880
se van a encargar de definir este comportamiento posiblemente agregamos los métodos jet set para el

62
00:06:26,880 --> 00:06:33,960
atributo de tipo figura damos un derecho Alcott generamos los métodos jet set para el atributo tipo

63
00:06:33,960 --> 00:06:43,600
figura y finalmente agregamos el método string insert Coupet string y damos clic en generar

64
00:06:46,780 --> 00:06:51,750
y con esto ya estamos definiendo todo el código de nuestra clase figura geométrica de la cual no vamos

65
00:06:51,750 --> 00:06:58,080
a poder crear objetos y el método dibujar lo hemos definido como abstracto así que las clases fijas

66
00:06:58,170 --> 00:07:03,960
son las que se van a encargar de agregar el comportamiento de este método dibujar bien ahora vamos a

67
00:07:03,960 --> 00:07:09,420
comenzar con nuestra clase de Círculo de entrada ya nos está marcando un error debido a que la clase

68
00:07:09,420 --> 00:07:15,540
círculo como extiende la clase figura geométrica debe de implementar el comportamiento del método dibujar

69
00:07:16,440 --> 00:07:22,290
así que a diferencia de la sobre escritura en la cual es opcional sobrescribir métodos de la clase padre

70
00:07:22,590 --> 00:07:29,220
en este caso estamos obligados a agregar el comportamiento de los métodos abstractos de la clase padre

71
00:07:30,400 --> 00:07:35,580
si no agregamos el comportamiento del método abstracto entonces esta misma clase para que no marque

72
00:07:35,640 --> 00:07:38,760
ese error también tendríamos que marcarla como abstracta

73
00:07:43,000 --> 00:07:48,160
pero ahora nos marca el detalle de que debemos utilizar el constructor con un argumento de la clase

74
00:07:48,160 --> 00:07:54,280
padre ya que como hemos definido el constructor con un argumento entonces el constructor vació ya no

75
00:07:54,280 --> 00:07:59,710
lo agrega de manera automática el compilador así que en este caso tendríamos que utilizar el constructor

76
00:07:59,800 --> 00:08:05,530
de un argumento de la clase padre bien así que con esa explicación esta clase no la vamos a definir

77
00:08:05,530 --> 00:08:11,070
como abstracta sino que va a implementar el método abstracto de la clase padre bien así que vamos a

78
00:08:11,070 --> 00:08:12,940
agregar el siguiente código.

79
00:08:13,020 --> 00:08:22,210
Definimos un constructor recibimos un argumento el argumento de tipo figura y con ese argumento vamos

80
00:08:22,210 --> 00:08:28,060
a inicializar el constructor de la clase padre así que mandamos a llamar súper y le pasamos el valor

81
00:08:28,240 --> 00:08:32,260
de tipo figura para poder inicializar correctamente.

82
00:08:32,650 --> 00:08:40,020
El constructor de la clase padre y posteriormente vamos a definir el comportamiento abstracto del método

83
00:08:40,020 --> 00:08:45,720
dibujar en esta clase ya no va a ser método abstracto sino que ya debemos agregar el comportamiento

84
00:08:45,990 --> 00:08:47,460
que deseamos en esta clase

85
00:08:53,300 --> 00:09:00,390
así que agregamos el comportamiento del método abstracto y agregamos el siguiente comentario

86
00:09:03,350 --> 00:09:12,110
aquí debería dibujar y concatenados el nombre de la clase la misma clase nos dice qué tipo de figura

87
00:09:12,110 --> 00:09:16,770
geométrica se debería de dibujar así que vamos a obtener el nombre de la clase.

88
00:09:16,820 --> 00:09:19,250
Para ello vamos a utilizar el siguiente código.

89
00:09:19,490 --> 00:09:21,440
Utilizamos el operador dis.

90
00:09:21,440 --> 00:09:29,620
Posteriormente solicitamos el nombre de la clase y finalmente solicitamos el nombre simple de la clase

91
00:09:30,280 --> 00:09:36,340
para que se imprima el nombre de círculo así que con este código podemos obtener el nombre de la clase

92
00:09:38,250 --> 00:09:40,830
y ese es todo el código que va a tener esta clase de círculo.

93
00:09:40,830 --> 00:09:45,480
Con esto podemos observar que el compilador ya no marca ningún problema ya que ya estamos agregando

94
00:09:45,480 --> 00:09:48,460
la implementación del método dibujar de la clase padre.

95
00:09:48,660 --> 00:09:54,150
En este caso este concepto no se conoce como sobre escritura aunque podría parecer que sobra escritura.

96
00:09:54,330 --> 00:09:59,850
Recordemos que la sobre escritura realmente modifica el comportamiento definido en la clase padre y

97
00:09:59,850 --> 00:10:03,680
en este caso como la clase padre no ha agregado ningún comportamiento.

98
00:10:03,840 --> 00:10:09,900
Entonces la clase e hija no está escribiendo el comportamiento no está modificando el comportamiento

99
00:10:09,900 --> 00:10:13,740
de la clase padre sino que lo está definiendo por primera vez.

100
00:10:13,770 --> 00:10:18,390
Sin embargo para el compilador de manera opcional se puede agregar la notación de overnight

101
00:10:22,640 --> 00:10:28,640
sin embargo por ello ya hemos explicado que esto no es una escritura y podemos observar incluso que

102
00:10:28,640 --> 00:10:35,720
el comentario que nos muestra el IDE no es una o dos Berit sino es una ahí y eso significa que está

103
00:10:35,720 --> 00:10:40,140
implementando el método abstracto de la clase padre figura geométrica.

104
00:10:40,520 --> 00:10:45,020
Así que esas son las diferencias de la escritura en este caso no es sobre escritura debido a que no

105
00:10:45,020 --> 00:10:50,780
estamos modificando el comportamiento de la clase padre sino que estamos implementando el comportamiento

106
00:10:50,960 --> 00:10:53,300
del método abstracto dibujar de la clase padre

107
00:10:56,340 --> 00:10:58,690
y vamos a hacer lo mismo con las demás clases

108
00:11:01,650 --> 00:11:09,130
podemos apoyarnos de este código en la clase de triángulo vamos a hacer exactamente lo mismo pero definimos

109
00:11:10,780 --> 00:11:20,330
el constructor de triángulo el método dibujar con esto obtenemos de manera dinámica el nombre de nuestra

110
00:11:20,330 --> 00:11:20,890
clase.

111
00:11:20,960 --> 00:11:27,160
Por lo tanto debería de imprimir el valor de triángulo y hacemos lo mismo para la clase de rectángulo

112
00:11:33,120 --> 00:11:40,140
es exactamente el mismo código y el método dibujar ya se está implementando aquí debería dibujar y al

113
00:11:40,210 --> 00:11:45,820
obtener el nombre de la clase va a imprimir el nombre de rectángulo y en cada uno de los casos la clase

114
00:11:45,820 --> 00:11:52,200
triángulo está implementando el método dibujar de la clase padre y también en esta clase de rectángulo.

115
00:11:52,210 --> 00:11:58,120
Implementamos el método dibujar de la clase padre figura geométrica bien ahora por último vamos a crear

116
00:11:58,240 --> 00:11:59,320
nuestra clase de prueba

117
00:12:02,180 --> 00:12:12,230
sobre nuestro proyecto damos el derecho a la clase la clase se llama ejemplo clases abstractas y el

118
00:12:12,230 --> 00:12:19,710
nombre del paquete va a ser ejemplo clases abstractas y damos clic en Finalizar

119
00:12:24,540 --> 00:12:30,970
vamos a agregar un método main Public está tipo y Main y vamos a crear los objetos que vamos a poner

120
00:12:30,970 --> 00:12:38,550
a prueba en primer lugar si deseamos crear un objeto de la clase figura geométrica.

121
00:12:38,570 --> 00:12:40,610
Vamos a observar el siguiente resultado

122
00:12:47,470 --> 00:12:53,500
importamos esta clase y cómo vamos a utilizar varias clases de este paquete ponemos punto asterisco

123
00:12:57,830 --> 00:13:02,600
y podemos ver que el compilador nos manda un error nos indica figura geométrica.

124
00:13:02,600 --> 00:13:10,080
Es una clase abstracta por lo tanto no puede ser instancia dada así que una clase abstracta no podemos

125
00:13:10,080 --> 00:13:17,130
crear objetos de esta clase vamos a poner entre comentarios esta línea para que podamos continuar.

126
00:13:17,510 --> 00:13:20,540
Y ahora vamos a definir un objeto de tipo rectángulo.

127
00:13:20,540 --> 00:13:25,850
Pero lo interesante aquí es que esta referencia como hemos hecho en elecciones anteriores cuando vimos

128
00:13:25,850 --> 00:13:31,850
el tema de polimorfismo o la clase de sobre escritura podemos utilizar un tipo de la clase padre para

129
00:13:31,850 --> 00:13:34,480
almacenar referencias de clases hijas.

130
00:13:34,610 --> 00:13:42,620
Así que vamos a definir un tipo de la clase padre la variable se llama rectángulo pero va a apuntar

131
00:13:42,650 --> 00:13:50,780
a un objeto de la clase hija en este caso a un objeto de tipo rectángulo y proporcionamos el tipo de

132
00:13:50,780 --> 00:13:59,710
figura que se va a utilizar y con eso estamos creando un objeto de la clase hija y lo estamos asignando

133
00:13:59,710 --> 00:14:08,700
a una variable llamada rectángulo de tipo padre mandamos a imprimir este objeto guardamos cambios y

134
00:14:08,700 --> 00:14:09,450
ejecutamos

135
00:14:15,440 --> 00:14:20,520
y podemos observar que el método string lo que está haciendo es mandar a imprimir el valor de tipo de

136
00:14:20,520 --> 00:14:26,340
figura en este caso la figura geométrica que se está imprimiendo contiene el valor de rectángulo según

137
00:14:26,340 --> 00:14:31,620
el valor que hemos proporcionado al momento de crear este objeto y ahora vamos a mandar a llamar el

138
00:14:31,620 --> 00:14:35,430
método dibujar con ayuda de la variable rectángulo.

139
00:14:35,480 --> 00:14:44,190
Mandamos a llamar el método dibujar guardamos cambios y ejecutamos y podemos ver el resultado aquí debería

140
00:14:44,190 --> 00:14:47,160
dibujar y nos imprime el nombre del rectángulo

141
00:14:50,480 --> 00:14:55,830
un detalle también aquí en el método dibujar es que en otros casos hemos mandado llamar el método de

142
00:14:55,830 --> 00:15:01,830
la clase padre utilizando súper así que vamos a comprobar que esto es diferente si tratamos de utilizar

143
00:15:01,830 --> 00:15:08,060
súper y posteriormente mandar a llamar el método dibujar podemos observar que el compilador nos está

144
00:15:08,060 --> 00:15:14,030
indicando que el método dibujar de la clase padre es un método abstracto por lo tanto nos está indicando

145
00:15:14,240 --> 00:15:19,130
que no se puede acceder de manera directa así que con esto también estamos comprobando que no es una

146
00:15:19,370 --> 00:15:25,190
escritura ya que no se está ocultando ningún método sino que en este caso es la primera vez que estamos

147
00:15:25,190 --> 00:15:28,910
implementando este método así que esta línea de código no funciona.

148
00:15:28,910 --> 00:15:37,070
En este caso así que con eso estamos configurando ya correctamente una clase abstracta le hemos asignado

149
00:15:37,100 --> 00:15:43,490
una referencia de un objeto de la clase e hija y finalmente implementamos correctamente el método dibujar

150
00:15:43,730 --> 00:15:48,380
desde la clase e hija y vamos a comprobar las demás clases simplemente para ver que todo funciona sin

151
00:15:48,380 --> 00:15:53,060
ningún problema pero es exactamente el mismo código y la misma estructura que hemos manejado hasta el

152
00:15:53,060 --> 00:16:00,330
momento así que definimos una variable de tipo padre en este caso se llama triángulo

153
00:16:03,620 --> 00:16:04,820
creamos un objeto

154
00:16:08,340 --> 00:16:15,790
de tipo triángulo imprimimos el contenido de este objeto se manda a llamar el método autodestruyen

155
00:16:19,450 --> 00:16:25,180
y finalmente mandamos a llamar el método dibujar de la clase triángulo guardamos cambios y ejecutamos

156
00:16:30,260 --> 00:16:36,820
y podemos observar que en este segundo caso nos manda el mensaje de dibujar y en este caso deberá dibujar

157
00:16:36,850 --> 00:16:43,100
un triángulo así que todo funciona sin ningún problema se ha implementado correctamente este código

158
00:16:43,660 --> 00:16:48,380
y por último ponemos a prueba el círculo

159
00:16:57,790 --> 00:17:05,980
mandamos a imprimir el objeto de círculo y posteriormente mandamos a llamar el método dibujar del objeto

160
00:17:05,980 --> 00:17:06,810
de círculo.

161
00:17:06,820 --> 00:17:14,790
Guardamos cambios y ejecutamos y podemos ver también el mensaje figura geométrica es un círculo y aquí

162
00:17:14,790 --> 00:17:21,300
debería dibujar un círculo así que con esto hemos puesto en práctica el concepto de clases abstractas

163
00:17:21,630 --> 00:17:24,810
en la cual no podemos crear instancias de esta clase.

164
00:17:25,260 --> 00:17:30,740
Pero para ello es que le agregamos clases hijas en la cual podemos ya crear instancias de las clases

165
00:17:30,770 --> 00:17:36,240
hijas pero además estas clases clásicas se deben de encargar de implementar el comportamiento de los

166
00:17:36,240 --> 00:17:39,030
métodos abstractos definidos en las clases padre

167
00:17:41,780 --> 00:17:44,730
bien en esta lección y nos vemos en el siguiente video.

168
00:17:44,770 --> 00:17:45,390
Saludos.
