1 00:00:02,220 --> 00:00:08,580 estábamos comentando aquí fuera de la grabación de dedicar la clase de hoy a hacer las tareas 2 00:00:08,580 --> 00:00:14,380 lo repito un poco para que quede puesto en la grabación vale por si alguien lo ve luego fuera 3 00:00:14,380 --> 00:00:21,120 de la tutoría las dos tareas que tenemos pendientes de resolver y luego como tenemos este tema así que 4 00:00:21,120 --> 00:00:25,100 es un poquito más largo no sucede como el de excepciones que teníamos una única semana por 5 00:00:25,100 --> 00:00:29,640 la semana que viene pegar un repaso así un poco un poco más en profundidad la semana que viene y 6 00:00:29,640 --> 00:00:50,759 Y luego alguna otra semana que podamos dedicar un poco más en profundidad a lo que son los mecanismos estos para almacenar datos de forma dinámica, que viene a ser lo que habla de colecciones y mapas, y luego la división en conjuntos, bueno, pues diferentes cosillas por ahí. Esto lo tratamos, si os parece, la semana que viene. 7 00:00:50,759 --> 00:01:09,400 No sé si antes de arrancar a resolver las dos tareas, queréis, los que estéis conectados, hacerme alguna pregunta o algo antes de arrancar. Si tenéis alguna propuesta de pregunta, pues bueno, pues es un buen momento y si no, pues empezamos a resolver la primera de las tareas. 8 00:01:09,400 --> 00:01:14,780 nada, bueno, pues 9 00:01:14,780 --> 00:01:16,959 pues nada, pues vamos al ataque, si os surge 10 00:01:16,959 --> 00:01:18,760 luego alguna cosita, ya me vais diciendo 11 00:01:18,760 --> 00:01:22,829 a ver, pues vamos a ver 12 00:01:22,829 --> 00:01:24,650 el enunciado, venimos por aquí 13 00:01:24,650 --> 00:01:26,430 a nuestro curso, programación grupo B 14 00:01:26,430 --> 00:01:33,140 y bueno, las dos que nos quedan pendientes 15 00:01:33,140 --> 00:01:34,719 son las del tema 7 y tema 8 16 00:01:34,719 --> 00:01:38,819 tenéis una solución a la 17 00:01:38,819 --> 00:01:40,780 tarea abierta en las dos, como en todos 18 00:01:40,780 --> 00:01:41,959 los temas, una 19 00:01:41,959 --> 00:01:44,819 propuesta de solución al enunciado 20 00:01:44,819 --> 00:01:46,840 lo que vamos a hacer hoy 21 00:01:46,840 --> 00:01:49,019 va a ser prácticamente, pues una réplica 22 00:01:49,019 --> 00:01:52,939 más o menos parecida, no sé si según vayamos haciéndolo nos vendrá 23 00:01:52,939 --> 00:01:56,819 alguna variante, pero será algo muy parecido porque tanto esa solución 24 00:01:56,819 --> 00:01:59,159 como lo que vamos a hacer ahora pretende resolver el ejercicio. 25 00:02:00,000 --> 00:02:04,959 La del tema 7, que es este que teníamos como utilización avanzada 26 00:02:04,959 --> 00:02:09,139 de clases, en verdad, como al trabajar con un lenguaje 27 00:02:09,139 --> 00:02:12,979 orientado a objetos, desde el minuto 1, pues ya tienes 28 00:02:12,979 --> 00:02:16,599 que poner el nombre de una clase con la etiqueta class y 29 00:02:16,599 --> 00:02:29,919 Y bueno, por las referencias de si son públicos o no son públicos y todas estas cosas, pues empezamos a hablar de clases en un tema en particular, que es el TESOL 4, pero desde el minuto 1 realmente ya las estamos trabajando. 30 00:02:29,919 --> 00:02:44,659 Con lo cual, luego llegan momentos en los que al trabajar estos temas lo que hacemos es consolidar o formalizar cosas que hemos ido viendo ya con anterioridad, que es un poco lo que nos va a pasar ahora en este tema. 31 00:02:44,659 --> 00:03:05,719 Mirad, en este tema lo que habíamos estado hablando, entre algunas de las características que tienen las programaciones orientadas a objetos, pues está la de poder definir interfaces, la de poder definir métodos abstractos y la de la herencia. 32 00:03:05,719 --> 00:03:13,780 Y sobre estas características de la programación orientada a objetos es sobre lo que trabaja, sobre lo que versa sobre todo este ejercicio. 33 00:03:14,659 --> 00:03:28,280 Bueno, hace un par de años cuando esta tarea ya la teníamos el año pasado, hace un par de años, pues bueno, mis hijas estaban ahí súper enganchadísimas a los cromos de Pokémon y bueno, pues por hacerles un guiño se me ocurrió hacer este enunciado, ¿no? 34 00:03:28,280 --> 00:03:31,759 entonces viene a decir el enunciado que en el mundo Pokémon 35 00:03:31,759 --> 00:03:34,699 si hay alguien muy friki de aquí, lo mismo hay errores 36 00:03:34,699 --> 00:03:37,300 porque yo no estoy tan enganchado como mis hijas 37 00:03:37,300 --> 00:03:40,080 con lo cual igual al hacer el enunciado metía la pata en algo 38 00:03:40,080 --> 00:03:43,879 puse estas cosas en función de lo que podía ir escuchando 39 00:03:43,879 --> 00:03:45,740 en mi oreja por ahí cuando hablaban entre ellas 40 00:03:45,740 --> 00:03:50,080 entonces viene a decir que en el mundo Pokémon Pikachu es uno de los personajes 41 00:03:50,080 --> 00:03:52,240 más conocidos, bueno tiene mucho bla bla bla 42 00:03:52,240 --> 00:03:55,479 aunque luego nos dice aquí en detalle cómo se traslada 43 00:03:55,479 --> 00:03:57,360 al código la solución del ejercicio 44 00:03:57,360 --> 00:04:12,719 Entre sus características destacan los niveles de energía para luchar, energía y vida. Dos valores que decimos que sean valores numéricos enteros y que de alguna forma provoquemos que no puedan ser negativos. 45 00:04:12,719 --> 00:04:16,420 de aquí que es lo que conseguimos 46 00:04:16,420 --> 00:04:19,160 bueno pues que si esto la vida 47 00:04:19,160 --> 00:04:21,139 y la energía son características 48 00:04:21,139 --> 00:04:25,040 de algo que vamos a definir un actor en nuestro programa 49 00:04:25,040 --> 00:04:28,139 que va a ser Pikachu pues podremos definir una clase que sea Pikachu 50 00:04:28,139 --> 00:04:30,199 que tenga como atributos de clase 51 00:04:30,199 --> 00:04:33,779 acordaros los atributos son aquellas cosas que caracterizan a los objetos 52 00:04:33,779 --> 00:04:37,439 de una determinada clase pues la energía y la vida 53 00:04:37,439 --> 00:04:40,240 y decimos que tengan 54 00:04:40,240 --> 00:04:43,980 valores numéricos enteros, con lo cual los podemos definir de tipo int. 55 00:04:44,439 --> 00:04:48,000 Podríamos hacerlo long también, si quisiéramos valores muy grandes, bueno, pues con int 56 00:04:48,000 --> 00:04:52,160 nos damos por satisfechos. Y por aquí nos dice que no puedan ser negativos. 57 00:04:52,620 --> 00:04:55,800 Lógicamente, si definimos estos valores como int, ¿qué sucede? 58 00:04:55,899 --> 00:05:00,259 Que los datos tipo int nos permiten efectivamente valores negativos. 59 00:05:00,980 --> 00:05:04,079 Si queremos, desde nuestro código, bloquear 60 00:05:04,079 --> 00:05:08,040 que en todo momento esos datos puedan ser negativos, ¿qué es lo que tenemos 61 00:05:08,040 --> 00:05:11,879 que hacer? Pues recordad, vamos a definir los privados, así 62 00:05:11,879 --> 00:05:15,420 si se instancian objetos de esta clase desde otras clases del programa 63 00:05:15,420 --> 00:05:19,959 que queden fuera del alcance de nuestra programación, no van a poder 64 00:05:19,959 --> 00:05:23,839 hacer directamente esos atributos y podemos definir 65 00:05:23,839 --> 00:05:27,920 unos getter y unos setters que tengan 66 00:05:27,920 --> 00:05:31,860 la suficiente lógica para evitar que sean negativos. Entonces en el setter vamos 67 00:05:31,860 --> 00:05:35,879 a meter código para evitar este detalle. En el momento que 68 00:05:35,879 --> 00:05:41,100 intente dar un valor de vida o de energía menor que cero por lo que vamos a hacer va a ser obligar 69 00:05:41,100 --> 00:05:50,149 a que sea como mínimo un cero bueno pues pikachu que tendrá ser dos estos dos atributos los 70 00:05:50,149 --> 00:05:57,430 ponemos privados y obligaremos a que no sean negativos en el setter luego dice por aquí que 71 00:05:57,430 --> 00:06:06,470 raichu al oa y raichu canto son evoluciones de este si son evoluciones de este lo que nos está 72 00:06:06,470 --> 00:06:09,610 invitando es que estos dos, pues vamos a tener 73 00:06:09,610 --> 00:06:12,430 una clase de cada uno de estos dos y como son evoluciones 74 00:06:12,430 --> 00:06:15,490 van a tener estas características, con lo cual podemos hacer 75 00:06:15,490 --> 00:06:18,449 que tengan herencia de la clase Pikachu 76 00:06:18,449 --> 00:06:23,459 o de la clase Pokémon. Dice, por otra parte, existen 77 00:06:23,459 --> 00:06:26,439 entrenadores, bueno, y dice que 78 00:06:26,439 --> 00:06:29,540 Alola es capaz, tiene la característica 79 00:06:29,540 --> 00:06:32,480 de volar y Kanto no. Con lo cual, si ambos dos 80 00:06:32,480 --> 00:06:35,699 son hijos a través de la herencia 81 00:06:35,699 --> 00:06:38,319 de la clase Pokémon, los dos tendrán 82 00:06:38,319 --> 00:06:40,879 una energía y tendrán una vida 83 00:06:40,879 --> 00:06:45,040 y solamente, es decir, ambos dos 84 00:06:45,040 --> 00:06:48,240 tendrán este atributo heredado y en la clase de Alola 85 00:06:48,240 --> 00:06:51,100 pondremos un método que sea el método volar que no lo tendremos 86 00:06:51,100 --> 00:06:52,019 disponible en canto. 87 00:06:53,699 --> 00:06:56,560 Por otra parte, existen entrenadores cuya función es entrenar 88 00:06:56,560 --> 00:06:58,620 que estos mejoren su nivel de energía. 89 00:06:59,740 --> 00:07:02,980 Y aquí estoy forzando un poco el enunciado 90 00:07:02,980 --> 00:07:04,860 para lo que por aquí dice. 91 00:07:04,860 --> 00:07:22,500 Pues para poder definir también una interfaz, ya que era una de las cosas que teníamos trabajando en este ejercicio. La idea es que en el interfaz entrenador, recordad que los interfaces, lo que decíamos era que no identifican una serie de métodos, pero no los desarrollan. 92 00:07:22,500 --> 00:07:39,439 ¿Esto qué es lo que nos permite? Que todo aquel que digamos que implementa esa interfaz obligatoriamente tendrá que desarrollar esos métodos y cada uno podrá tener un desarrollo de ese método particular, cada uno hará unas determinadas cosas cuando entrene. 93 00:07:39,439 --> 00:07:43,879 pero que nos garantiza si decimos que implementa esa interfaz 94 00:07:43,879 --> 00:07:46,459 pues nos garantiza como que si firmase un contrato 95 00:07:46,459 --> 00:07:48,740 la clase que dice que desarrolla esta interfaz 96 00:07:48,740 --> 00:07:52,680 de que no va a quedar sin desarrollar ese método 97 00:07:52,680 --> 00:07:54,800 el de entrenar 98 00:07:54,800 --> 00:07:58,259 que es lo que sucede que en el contexto 99 00:07:58,259 --> 00:08:00,480 en el enunciado general del proyecto 100 00:08:00,480 --> 00:08:03,819 pues habrá sitios, en particular será desde aquí 101 00:08:03,819 --> 00:08:06,360 desde la clase ejecutar pokemon 102 00:08:06,360 --> 00:08:09,220 que tendrá que cubrir un requisito 103 00:08:09,220 --> 00:08:13,180 en el cual podamos decir a los diferentes Pokémon que entrenen. 104 00:08:14,879 --> 00:08:20,639 Si desde aquí tiene que existir un método que digamos a los diferentes Pokémon que entrenen 105 00:08:20,639 --> 00:08:25,040 y no se lo obligamos a través de una interfaz, ¿qué puede suceder? 106 00:08:25,120 --> 00:08:29,920 Pues que a lo mejor el Raichu Kanto este no implemente ese método 107 00:08:29,920 --> 00:08:34,240 y el programa ya no quede correcto, porque de hecho no nos compilaría 108 00:08:34,240 --> 00:08:37,340 si desde aquí intentamos llamar un método de entrenar que no existe aquí. 109 00:08:39,220 --> 00:08:48,000 En el diseño general habría una especificación que diría, todos los Pokémon tienen que poder entrenar. 110 00:08:48,000 --> 00:08:56,460 A un equipo de trabajo le encargo, por ejemplo, que haga el desarrollo de las clases Pokémon y de sus dos clases hijas. 111 00:08:57,419 --> 00:09:01,799 Bajo ese acuerdo tendrán que disponer del método de entrenar. ¿Cómo obligo a esto? 112 00:09:01,799 --> 00:09:10,639 pues en la clase Pokémon le digo que implemente esta interfaz, con lo cual ya nos garantizamos que todo hijo de Pokémon lo tendrá disponible. 113 00:09:10,899 --> 00:09:19,200 Y luego, probablemente a otro equipo de trabajo, si fuera un proyecto muy grandote, podríamos decirle que haga el desarrollo de la clase EjecutarPokémon, 114 00:09:19,740 --> 00:09:26,980 que como requisito general sabe que tiene la posibilidad, a través de la interfaz de las clases de los Pokémon y de sus hijos, 115 00:09:26,980 --> 00:09:31,399 tiene la posibilidad de llamar a un método que es el método entrenar vale pues éste sabe que va a 116 00:09:31,399 --> 00:09:37,019 estar disponible y en estos tiene que que va a estar disponible para ser llamado y en estos 117 00:09:37,019 --> 00:09:41,360 tiene que estar disponible porque lo hemos implementado y nos hemos obligado por el 118 00:09:41,360 --> 00:09:47,019 contrato que hemos firmado digamos de alguna manera al decir que implementa esta interfaz 119 00:09:47,019 --> 00:10:04,080 bueno pues vamos a ir si os parece haciendo un poco el proyecto vamos a crear un proyecto que 120 00:10:04,080 --> 00:10:21,659 se llame Pokémon, por ejemplo. Ahora después seguimos también leyendo el enunciado. 121 00:10:23,659 --> 00:10:26,500 Una primera cosa, si os parece, que podemos hacer es definir esta interfaz. 122 00:10:30,480 --> 00:10:34,279 Interfaz creo que nos decía que se llame entrenador. Vamos a verlo. 123 00:10:36,379 --> 00:10:51,690 Efectivamente, entrenador. Pues nada, ahí lo tenemos. 124 00:10:53,370 --> 00:10:56,370 El interfaz, normalmente en las clases, ya sabéis, ponemos aquí public class. 125 00:10:56,370 --> 00:11:03,730 En este caso es un interfaz, pues ponemos public interface y lo que hace es entrenar. 126 00:11:03,730 --> 00:11:18,690 Entonces podemos poner aquí un public que no devuelva nada, void, que se llame entrenar y recordad que en los interfaces no implementamos las cosas. 127 00:11:18,690 --> 00:11:33,269 Si intentásemos implementarlo como en una clase normal, pues fijaros que directamente como no es la lógica propia de los interfaces, pues ya directamente ni siquiera me compila. 128 00:11:33,269 --> 00:11:36,789 el IDE ya me dice, oye no, no me gusta esto 129 00:11:36,789 --> 00:11:43,870 ahí lo tenemos, el interfaz entrenar 130 00:11:43,870 --> 00:11:52,789 luego tiene, vamos a crear 131 00:11:52,789 --> 00:11:55,809 una clase, que sea la clase 132 00:11:55,809 --> 00:12:01,919 Pokémon o Pikachu 133 00:12:01,919 --> 00:12:04,259 no sé cómo dice que se llame la clase 134 00:12:04,259 --> 00:12:07,820 a ver, dice que la clase se llame 135 00:12:07,820 --> 00:12:11,860 Pikachu, pues la llamamos Pikachu 136 00:12:11,860 --> 00:12:24,350 pues ahí la tenemos, la clase 137 00:12:24,350 --> 00:12:34,389 todo todo lo que sea un pokemon es decir pikachu sus herencias tendrá que considerar el interfaz 138 00:12:34,389 --> 00:12:45,639 entrenador implement entonces el momento que digo que implemente esta interfaz lo que estoy 139 00:12:45,639 --> 00:12:52,000 es diciendo que pikachu tiene que cumplir con el contrato que está haciendo a la hora de 140 00:12:52,000 --> 00:12:59,019 implementar este interfaz que es desarrollar los métodos que tenga definidos el interfaz 141 00:12:59,379 --> 00:13:06,179 De hecho, si me pongo aquí en el IDER, fijaros que lo que me sugiere es que añada los métodos que están sin implementar. 142 00:13:07,580 --> 00:13:16,320 Entonces lo implemento aquí y de momento ya me compila. 143 00:13:16,840 --> 00:13:24,340 Otra posibilidad es no dejarlo implementado aquí, implementarlo en las clases hijas que tenga. 144 00:13:24,500 --> 00:13:28,240 Vamos a dejarlo así de momento aquí, sin meter ningún código. 145 00:13:28,240 --> 00:13:34,460 Lo que vamos a hacer es implementarlo aquí en la clase padre y no en las clases hijas, sobrescribirlo si fuese necesario. 146 00:13:35,139 --> 00:13:44,679 O implementar aquí en la clase padre un código que sea general para los dos y si le vale a los dos hijos lo que pase aquí, pues bien, vamos para adelante. 147 00:13:45,240 --> 00:13:52,399 Y si no, en alguno de los hijos o en ambos, sobrescribir, que es otra de las características de la programación orientada a objetos, este método. 148 00:13:52,799 --> 00:13:56,580 Eso ya es una cuestión de herencia y la posibilidad de sobrescritura de métodos. 149 00:13:56,580 --> 00:14:14,970 A ver, mirad, nos dice por aquí que la clase Pikachu es una clase abstracta. El hecho de definir una clase abstracta normalmente va a ir de la mano de que va a tener métodos que van a estar sin implementar. 150 00:14:17,629 --> 00:14:29,690 Solamente es posible tener clases abstractas si van a tener luego clases hijas. Una clase abstracta, si tenemos métodos que no están implementados, lógicamente de esa clase nunca vamos a poder instanciar objetos. 151 00:14:30,409 --> 00:14:33,710 ¿Cuál es la explicación de no poder instanciar objetos de una clase abstracta? 152 00:14:33,769 --> 00:14:38,590 Pues si hay métodos en los que no pone qué tiene que pasar cuando invoquemos esos métodos, 153 00:14:39,710 --> 00:14:44,409 lógicamente, si definiésemos un objeto de esa clase y el programa no lo permitiese, 154 00:14:44,409 --> 00:14:48,110 al llamar esos métodos, el programa se quedaría con las manos arriba diciendo 155 00:14:48,110 --> 00:14:50,269 ¿y ahora qué tengo que hacer si no me lo han indicado? 156 00:14:50,990 --> 00:14:54,230 Entonces, es cierto que es posible definir clases abstractas, 157 00:14:54,429 --> 00:14:57,769 pero luego tendremos que implementar clases hijas y estas clases hijas 158 00:14:57,769 --> 00:15:01,370 se verán obligadas a desarrollar aquellos métodos abstractos 159 00:15:01,370 --> 00:15:03,629 que tenga la clase padre, es decir, algo parecido 160 00:15:03,629 --> 00:15:06,629 a lo que nos acaba de suceder con el interfaz. 161 00:15:07,610 --> 00:15:10,370 Un interfaz se podría considerar como una clase abstracta 162 00:15:10,370 --> 00:15:13,730 donde todos sus métodos son abstractos, 163 00:15:13,809 --> 00:15:15,129 es decir, no están desarrollados. 164 00:15:18,070 --> 00:15:21,289 Bueno, pues aquí, aprovechando que está la clase padre, 165 00:15:21,389 --> 00:15:25,789 es donde vamos a definir los métodos de energía y de vida, 166 00:15:25,789 --> 00:15:28,610 de nivel de vida 167 00:15:28,610 --> 00:15:30,269 de nivel de energía y de nivel de vida 168 00:15:30,269 --> 00:15:32,409 que todo Pokémon va a tener 169 00:15:32,409 --> 00:15:34,269 todo Pikachu, tanto el Alola 170 00:15:34,269 --> 00:15:36,350 como el Kanto este 171 00:15:36,350 --> 00:15:37,970 van a tener energía y vida 172 00:15:37,970 --> 00:15:40,129 pues entonces en lugar de definirlo en cada uno de ellos 173 00:15:40,129 --> 00:15:42,490 lo podemos definir en la clase padre 174 00:15:42,490 --> 00:15:44,409 y que cada uno de ellos lo tengan de forma 175 00:15:44,409 --> 00:15:45,009 heredada 176 00:15:45,009 --> 00:15:47,870 entonces aquí podríamos decir 177 00:15:47,870 --> 00:15:49,730 int y vida 178 00:15:49,730 --> 00:15:52,769 int y energía 179 00:15:52,769 --> 00:15:57,309 hemos dicho que 180 00:15:57,309 --> 00:15:59,590 estos valores no nos interesa que tengan 181 00:15:59,590 --> 00:16:13,200 datos negativos, pero lógicamente 182 00:16:13,200 --> 00:16:17,500 un entero puede tener, no me acuerdo el rango exactamente, pero 183 00:16:17,500 --> 00:16:22,200 puede tener valores desde un valor negativo muy alto hasta un valor 184 00:16:22,200 --> 00:16:25,899 negativo muy bajo. Fijaros, si quisiéramos saber el rango 185 00:16:25,899 --> 00:16:29,539 de valores que tiene, pues podríamos, llamando a la clase 186 00:16:29,539 --> 00:16:35,940 en la clase integer, que es la clase grupper de 187 00:16:35,940 --> 00:16:44,519 de lind podríamos el más value y el íntegra punto me envalúe si no no si no nos acordamos 188 00:16:44,519 --> 00:16:59,940 de los datos no tenemos donde referenciar lo y solamente tenemos el envalúe porque no sale 189 00:16:59,940 --> 00:17:13,609 cuando me sale creo porque esto no está compilando a ver ahí está pues haciendo un sistema print ln 190 00:17:13,609 --> 00:17:18,849 de estos dos valores podríamos saber justo el rango con el que trabajamos que te permite un 191 00:17:18,849 --> 00:17:21,910 entero. Justo el máximo valor o el mínimo valor tiene la clase 192 00:17:21,910 --> 00:17:24,529 wrapper integer, la wrapper 193 00:17:24,529 --> 00:17:27,930 la que envuelve los tipos primitivos 194 00:17:27,930 --> 00:17:30,930 de datos int, pues podríamos conocer 195 00:17:30,930 --> 00:17:33,549 el máximo valor que acepta un entero y el mínimo valor que acepta 196 00:17:33,549 --> 00:17:36,869 el entero. En cualquier 197 00:17:36,869 --> 00:17:39,869 caso, según dice el enunciado, podremos trabajar desde cero 198 00:17:39,869 --> 00:17:42,589 hasta el más value bloqueando el minValue. 199 00:17:42,910 --> 00:17:46,029 Si esto lo dejamos ahora mismo sin ninguna 200 00:17:46,029 --> 00:17:49,009 una etiqueta de ámbito, pues tendría un ámbito 201 00:17:49,009 --> 00:17:51,269 package, es decir, de cualquier clase 202 00:17:51,269 --> 00:17:55,410 que esté en este mismo paquete, en este caso en el paquete 203 00:17:55,410 --> 00:17:58,069 de por defecto, que la clase Pikachu, tendríamos 204 00:17:58,069 --> 00:18:01,130 posibilidad de modificarlo. Y esas modificaciones 205 00:18:01,130 --> 00:18:04,009 desde otras partes de código, que probablemente no estaríamos programando 206 00:18:04,009 --> 00:18:07,109 nosotros, serían capaces de meter valores negativos, cosa 207 00:18:07,109 --> 00:18:10,190 que no nos interesa. Si queremos bloquearlo para que 208 00:18:10,190 --> 00:18:13,130 solamente se pueda modificar desde mi propia clase y así 209 00:18:13,130 --> 00:18:17,069 y tener garantías totales de que si eso coge un valor 210 00:18:17,069 --> 00:18:21,089 negativo es porque me he equivocado yo en este código que estoy desarrollando, pues lo 211 00:18:21,089 --> 00:18:25,069 podemos hacer, recordad, es poner la etiqueta private, si ponemos la etiqueta private 212 00:18:25,069 --> 00:18:29,089 ya el ámbito de 213 00:18:29,089 --> 00:18:33,109 alcance de estas variables van a ser siempre dentro de la 214 00:18:33,109 --> 00:18:44,660 clase Pikachu. Sí, lo podríamos poner protective 215 00:18:44,660 --> 00:18:48,539 y entonces tendrían también las hijas, si, bueno, es 216 00:18:48,539 --> 00:18:51,180 cerrar más la puerta, un poquito más o un poquito menos. 217 00:18:52,200 --> 00:18:54,740 Bueno, como queráis. De tal forma, en realidad 218 00:18:54,740 --> 00:18:57,339 si la ponemos private o protected 219 00:18:57,339 --> 00:19:00,680 nos da un poco igual si ahora definimos los getter y los setter 220 00:19:00,680 --> 00:19:03,539 y los hacemos públicos. Porque al hacer el getter y el setter 221 00:19:03,539 --> 00:19:06,480 público, pues ya directamente a través de esos dos 222 00:19:06,480 --> 00:19:09,559 métodos podemos acceder a este valor y me da igual que esto sea private 223 00:19:09,559 --> 00:19:12,599 o no. Si nosotros estamos haciendo 224 00:19:12,599 --> 00:19:15,140 el desarrollo de la clase de Pikachu y luego la 225 00:19:15,140 --> 00:19:21,599 canto y la otra verdad que son hijas y las hacemos nosotros y desde ningún otro sitio vamos a tener 226 00:19:21,599 --> 00:19:26,140 garantía de que se va a hacer de cara a ellas pues podríamos abrir un poquito más el abanico de acceso 227 00:19:26,140 --> 00:19:31,720 a estas variables directamente bueno pues con protective si la ponemos privado pues ya sabéis 228 00:19:31,720 --> 00:19:36,319 que es lo más cerrado solamente para esta clase pero ahora con los getter y los setter pues en 229 00:19:36,319 --> 00:19:41,059 realidad podemos modificar y lo que sí que vamos a hacer va a ser en el setter tener garantías de 230 00:19:41,059 --> 00:19:44,740 que el valor nunca sea negativo, que es lo que nos pide el ejercicio. 231 00:19:46,680 --> 00:19:49,059 Entonces, para no tener que andar escribiendo mucho, 232 00:19:49,059 --> 00:19:53,000 si nos venimos aquí, el Eclipse nos da, fijaros, 233 00:19:53,220 --> 00:19:56,900 las mil cosas que nos permite hacer Eclipse. Estamos utilizando 234 00:19:56,900 --> 00:20:01,140 siempre cuatro o cinco, en realidad, pero bueno, permite hacer un montonazo de cosas. 235 00:20:03,259 --> 00:20:05,039 Hay una característica 236 00:20:05,039 --> 00:20:09,000 que es la refactorización, que viene a ser modificar el código 237 00:20:09,000 --> 00:20:17,000 para que tenga un mejor funcionamiento, que esté más ordenado, porque haya que mover unas clases a otras, 238 00:20:17,180 --> 00:20:22,480 porque una variable que está colocada como variable clase la queremos sacar a otra clase. 239 00:20:22,680 --> 00:20:32,220 Todas estas cosas son la refactorización del código, cuyo objetivo es modificar el código manteniendo el funcionamiento, 240 00:20:32,220 --> 00:20:40,660 pero de alguna forma para conseguir una distribución de las variables que igual es más cómoda o está más organizada. 241 00:20:40,740 --> 00:20:46,380 Esto vendría a ser refactorizar. Esto lo trabajáis en la asignatura de entornos de desarrollo, si no recuerdo mal. 242 00:20:47,700 --> 00:20:56,660 Pues todo lo que tiene que ver con refactorización, pues cuelga en Eclipse de esta pestaña y hay algunas cosillas que cuelgan también de Source, 243 00:20:56,660 --> 00:21:00,619 que también tiene que ver con lo que normalmente se habla de la refactorización. 244 00:21:01,720 --> 00:21:04,140 En particular, para poner los getter y los setter, 245 00:21:04,559 --> 00:21:09,319 está aquí en source y nos permite generar los getter y los setter de forma automática. 246 00:21:10,319 --> 00:21:13,880 Y aquí nos dice sobre qué atributos quieres que genere getter y setter. 247 00:21:14,160 --> 00:21:17,380 Vamos a seleccionar los dos, los generamos 248 00:21:17,380 --> 00:21:22,519 y aquí tenemos los dos getter y los dos setter. 249 00:21:22,519 --> 00:21:27,450 como lógicamente 250 00:21:27,450 --> 00:21:28,750 Eclipse no sabe muy bien 251 00:21:28,750 --> 00:21:31,049 qué requisitos nos está pidiendo 252 00:21:31,049 --> 00:21:33,150 el programa, pues hace lo más básico. 253 00:21:33,309 --> 00:21:35,049 Un getter devuelve valor, un setter 254 00:21:35,049 --> 00:21:36,410 aplico al valor 255 00:21:36,410 --> 00:21:39,269 lo que reciba como parámetro. 256 00:21:40,589 --> 00:21:41,269 En nuestro caso 257 00:21:41,269 --> 00:21:43,369 sabemos que, y fijaros, 258 00:21:44,430 --> 00:21:45,069 este sí que tiene 259 00:21:45,069 --> 00:21:47,269 un ámbito, un alcance público. 260 00:21:47,730 --> 00:21:48,970 Desde cualquier sitio del proyecto 261 00:21:48,970 --> 00:21:50,410 podremos acceder a este setter 262 00:21:50,410 --> 00:21:52,809 y este setter nos permitirá 263 00:21:52,809 --> 00:21:57,069 modificar el valor, por mucho que sea privado. ¿Por qué? Porque son métodos propios 264 00:21:57,069 --> 00:22:01,230 de esta misma clase. Entonces el alcance privado nos permite el acceso de estos métodos. 265 00:22:03,460 --> 00:22:06,839 Los setter, como lo que queremos es bloquear que no pueda ser 266 00:22:06,839 --> 00:22:11,640 mayor que cero, pues aquí podríamos decir, sí, y vida 267 00:22:11,640 --> 00:22:19,799 es menor que cero, pero podríamos decir 268 00:22:19,799 --> 00:22:23,180 que y vida es igual a cero. 269 00:22:23,180 --> 00:22:26,740 Ya está. Ya me he garantizado que si aquí 270 00:22:26,740 --> 00:22:31,220 llega un valor negativo, pues lo voy a dejar 271 00:22:31,220 --> 00:22:36,759 al valor cero directamente. Y luego se lo aplico a la variable 272 00:22:36,759 --> 00:22:41,160 de clase. Y aquí pues para la energía podemos hacer la misma jugada. 273 00:22:47,640 --> 00:22:50,660 Dicimos que si la energía es menor de cero, 274 00:22:50,779 --> 00:22:54,859 que valga cero, ahí ya tengo garantías de que no se va a 275 00:22:54,859 --> 00:23:02,289 producir ese valor en negativos. Vamos a ver el enunciado. 276 00:23:08,109 --> 00:23:10,549 Nos dice también sobreescribe el método toString. 277 00:23:10,549 --> 00:23:35,549 Recordad, el método toString es un método disponible dentro de todas las clases y cuando utilizamos una variable de un determinado objeto, de una variable primitiva, en un System.of.println directamente lo que se hace es mostrar en el System.of.println lo que nos devuelva el método toString de esa clase. 278 00:23:35,549 --> 00:23:40,309 fijaros que en un sistema, es algo que hemos comentado más veces, pero en un 279 00:23:40,309 --> 00:23:44,430 System of Println se traga cualquier tipo de objeto, podemos poner 280 00:23:44,430 --> 00:23:48,230 cualquier objeto y siempre nos va a compilar, entonces se utiliza el método 281 00:23:48,230 --> 00:23:52,430 toString para convertir en algo que sea una cadena de caracteres, lo que tenga cualquier 282 00:23:52,430 --> 00:23:56,369 objeto, antes de que concatenando posibles diferentes 283 00:23:56,369 --> 00:24:00,450 informaciones se muestre por pantalla, eso nos está archivando 284 00:24:00,450 --> 00:24:04,349 que todo objeto tendrá el método toString, porque si no, no nos 285 00:24:04,349 --> 00:24:07,450 compilaría, lógicamente. ¿Por qué tenemos el 286 00:24:07,450 --> 00:24:09,970 método toString en todas las clases? Pues porque 287 00:24:09,970 --> 00:24:13,430 siempre hemos dicho que la herencia es única, 288 00:24:13,930 --> 00:24:16,470 cada clase puede tener una sola clase padre, 289 00:24:17,150 --> 00:24:19,009 pero todas ellas, de forma adicional, 290 00:24:19,630 --> 00:24:22,210 y ya se puede decir que quizás no sea tan única 291 00:24:22,210 --> 00:24:25,470 con esta excepción, todas ellas heredan de la clase 292 00:24:25,470 --> 00:24:28,730 object, que está en una jerarquía en árbol 293 00:24:28,730 --> 00:24:31,170 de clases en Java, arriba del todo. 294 00:24:31,710 --> 00:24:34,289 Y esa clase object tiene un método toString, 295 00:24:34,349 --> 00:24:42,349 Entonces, toda clase tendrá por herencia de aquella clase object un método toString disponible. 296 00:24:43,410 --> 00:24:46,230 ¿Qué información nos devuelve el toString de la clase object? 297 00:24:47,250 --> 00:24:54,230 Pues como es común ese código para todas las posibles clases, no solo de nuestros programas, sino de todos los programas habidos y por haber, 298 00:24:54,869 --> 00:25:00,049 nos devolverá algo súper genérico y algo que tengan todos los objetos. 299 00:25:00,049 --> 00:25:24,109 En este caso no nos podría devolver un valor de energía o de vida el toStringS porque como es código común no solamente para nuestra clase Pikachu sino para una clase de una pastelería y para otra que hagamos de un instituto y vete tú a saber que no tengan estos otros parámetros, pues no podría decir en aquel código de la clase Object devuelve la energía porque no va a ser común a todos los casos. 300 00:25:24,109 --> 00:25:30,450 entonces lo que devuelve es posición de memoria RAM y el tipo de clase que es 301 00:25:30,450 --> 00:25:35,269 que evidentemente todas las clases, todo objeto pertenecerá a una clase 302 00:25:35,269 --> 00:25:38,410 y todo objeto si se le ha hecho un new tendrá una zona de memoria 303 00:25:38,410 --> 00:25:44,289 como eso en realidad descendiendo a los programas no nos resulta muy útil 304 00:25:44,289 --> 00:25:50,829 es decir un System of Println de algo que sea de un objeto de la clase Pikachu 305 00:25:50,829 --> 00:25:55,009 no va a resultar muy útil en nuestro manejo del programa como usuarios 306 00:25:55,009 --> 00:25:57,910 que nos chive, que ha ocupado la posición de memoria 307 00:25:57,910 --> 00:26:02,849 FA371516, pues lo que podemos hacer es 308 00:26:02,849 --> 00:26:06,349 lo que nos sugiere el programa, sobrescribir el método toString 309 00:26:06,349 --> 00:26:10,750 entonces al sobrescribirlo, lo que van a utilizar los objetos 310 00:26:10,750 --> 00:26:14,950 de la clase Pikachu, en lugar de toString de aquella clase 311 00:26:14,950 --> 00:26:16,970 Object, va a ser la propia que tengamos. 312 00:26:16,970 --> 00:26:20,069 pues venga, pues vamos a ello 313 00:26:20,069 --> 00:26:23,710 nosotros podríamos poner aquí 314 00:26:23,710 --> 00:26:24,430 un public 315 00:26:24,430 --> 00:26:26,470 public to 316 00:26:26,470 --> 00:26:29,569 en lugar de toString vamos a poner toStrand 317 00:26:29,569 --> 00:26:31,089 porque me he equivocado al ponerlo, vale 318 00:26:31,089 --> 00:26:33,650 digo que devuelvo 319 00:26:33,650 --> 00:26:39,210 un string y luego ya 320 00:26:39,210 --> 00:26:40,130 pongo aquí un return 321 00:26:40,130 --> 00:26:43,230 y esto me compila, dice vale 322 00:26:43,230 --> 00:26:44,630 me parece estupendo y yo 323 00:26:44,630 --> 00:26:46,930 tan contento, digo pues ya tengo 324 00:26:46,930 --> 00:26:49,250 sobre escrito el toString cuando incluya 325 00:26:49,250 --> 00:26:50,690 un objeto de la clase Pikachu 326 00:26:50,690 --> 00:26:53,190 en un sistema println me va a poner 327 00:26:53,190 --> 00:26:54,390 lo que yo he puesto aquí 328 00:26:54,390 --> 00:26:57,190 pues hola, me va a decir hola 329 00:26:57,190 --> 00:26:58,950 pero eso no va a pasar, ¿por qué? 330 00:26:59,130 --> 00:27:01,029 pues porque no he sobrescrito el método toString 331 00:27:01,029 --> 00:27:02,769 he puesto toStrand, me he equivocado 332 00:27:02,769 --> 00:27:05,089 al ponerlo, entonces para evitar 333 00:27:05,089 --> 00:27:07,569 estas confusiones, cuando queramos sobrescribir 334 00:27:07,569 --> 00:27:09,150 lo que vamos a hacer va a ser 335 00:27:09,150 --> 00:27:10,809 poner esta 336 00:27:10,809 --> 00:27:12,349 etiqueta con la arroba 337 00:27:12,349 --> 00:27:15,130 que digamos es un metadato, no es 338 00:27:15,130 --> 00:27:17,130 código propio de Java, pero si lo 339 00:27:17,130 --> 00:27:19,309 ponemos, lo que está archivando es que 340 00:27:19,309 --> 00:27:23,410 esto pretende ser un método sobrescrito. Fijaros que en el momento que he incluido 341 00:27:23,410 --> 00:27:27,210 esto, dice, lo siguiente va a ser un método 342 00:27:27,210 --> 00:27:31,230 sobrescrito. Y ahora ya se me queja esto. ¿Por qué? Porque, bueno, como 343 00:27:31,230 --> 00:27:35,349 me he equivocado y he puesto toString aquí en lugar de toString, este método 344 00:27:35,349 --> 00:27:39,069 no existe por herencia desde ningún sitio, ni desde la clase 345 00:27:39,069 --> 00:27:43,150 object, ni desde una posible clase que tuviéramos puesta aquí con un stent. 346 00:27:43,630 --> 00:27:45,750 Como está pasando esto, se me queja el programa. 347 00:27:45,750 --> 00:27:50,349 si no pongo esto, me puede engañar 348 00:27:50,349 --> 00:27:53,349 porque compila, y yo con la idea 349 00:27:53,349 --> 00:27:56,170 de que he puesto aquí toString, feliz de la vida 350 00:27:56,170 --> 00:27:59,150 me puedo ir a otra zona de código, olvidarme de mirar esto 351 00:27:59,150 --> 00:28:01,990 y tener un error por ahí que me lleve un rato 352 00:28:01,990 --> 00:28:05,329 encontrarlo, si pongo el overwrite, ya que la idea 353 00:28:05,329 --> 00:28:08,369 es sobreescribir algo, ya tengo la garantía de que lo que pongo 354 00:28:08,369 --> 00:28:11,170 aquí va a existir en una clase padre, entonces ahora 355 00:28:11,170 --> 00:28:16,160 pongo toString, y ahora ya, fijaros, ya me combila 356 00:28:16,160 --> 00:28:46,220 Y efectivamente algo estaré sobre escribiendo cuando ya no se me queja después de haber puesto el metadato este arroba overwrite. Y el mensaje que queremos que nos devuelva es algo de este tipo. Soy un valor de tipo, pues por aquí, dice que definamos los parámetros tipo, energía y vida. 357 00:28:46,220 --> 00:28:54,019 el tipo no va a tener información del tipo de pikachu que sea si es canto o es el otro 358 00:28:54,019 --> 00:29:17,480 entonces nos falta por definir aquí otro atributo lo ponemos privado también vamos a añadir el 359 00:29:17,480 --> 00:29:27,500 getter y el setter también que lo generamos por aquí pues aquí los tenemos y en el método toString 360 00:29:27,500 --> 00:29:48,789 voy a hacer un copy pega de cómo tiene que ser a no me deja claro una cosa está en el ordenador 361 00:29:48,789 --> 00:29:52,450 de verdad y otra cosa está en la máquina virtual, pues venga, pues lo leemos 362 00:29:52,450 --> 00:29:56,829 soy un, mi nivel 363 00:29:56,829 --> 00:30:03,089 de energía es, la ponemos aquí, soy 364 00:30:03,089 --> 00:30:07,190 un más, un que, pues el tipo 365 00:30:07,190 --> 00:30:41,380 y mi nivel de vida es este otro 366 00:30:41,380 --> 00:30:47,670 bueno, a ver, falta aquí un más 367 00:30:47,670 --> 00:30:54,410 y aquí otro más, bueno, puede utilizar 368 00:30:54,410 --> 00:30:58,009 las variables y energía y vida directamente 369 00:30:58,009 --> 00:31:02,190 a pesar de que son privadas, porque el método toString está integrado 370 00:31:02,190 --> 00:31:06,549 dentro de la misma clase. Si quisiéramos, también podríamos coger y utilizar los métodos 371 00:31:06,549 --> 00:31:09,069 como prefiráis. 372 00:31:10,490 --> 00:31:13,069 En este caso, hay que tener energía. 373 00:31:25,880 --> 00:31:30,140 Bueno, pues otra de las cosas que podemos definir aquí 374 00:31:30,140 --> 00:31:34,390 lo que está claro es que todo 375 00:31:34,390 --> 00:31:53,369 Todo Pikachu, tanto si es Kanto como si es Alola, puede luchar y puede volar y solamente Alola, no perdón, todos pueden luchar y todos pueden entrenar, ¿verdad? Y solamente Alola puede volar, luchar y entrenar. 376 00:31:53,369 --> 00:32:39,200 Entonces lo que podemos hacer es entrenar, ya es obligatorio que lo tengan definido, ya que lo implementa a través del interfaz entrenador y lo que podemos hacer aquí es definir un método, ya que hemos dicho que la clase esta sea abstracta, pues podemos definir un método que sea public abstract, luchar, vale, me dice que quite el identificador de que es abstracto, este método luchar, 377 00:32:39,200 --> 00:32:43,519 ¿Por qué? Porque para que tenga métodos abstractos, la clase debe ser abstracta. 378 00:32:46,369 --> 00:32:50,710 En el momento que he definido la clase como abstracta, ya luchar me permite que sea abstracto. 379 00:32:51,130 --> 00:32:57,410 Fijaros, al definir el método este abstracto, no ponemos qué es lo que tiene que pasar al luchar. 380 00:32:58,269 --> 00:33:03,869 Y, en cambio, esto ya implica el hecho de haber definido esta clase abstracta, 381 00:33:03,950 --> 00:33:07,150 ya no podremos definir objetos de la clase Pikachu. 382 00:33:07,730 --> 00:33:13,309 ¿Por qué? Porque puede tener algún método, en este caso el de luchar, que no está definido. 383 00:33:13,730 --> 00:33:16,910 No sabría qué hacer un Pikachu para poder luchar. 384 00:33:19,559 --> 00:33:23,279 Y lo que hacemos aquí, esto es algo muy parecido a lo que nos obliga la interfaz. 385 00:33:23,279 --> 00:33:31,660 Cuando una clase sea hija de la clase Pikachu, se verá obligada a implementar el método luchar. 386 00:33:35,819 --> 00:33:39,839 ¿Ponemos aquí public AstraVoid volar? Pues no. ¿Por qué? 387 00:33:39,839 --> 00:33:58,420 Porque hacer eso implicaría que todo hijo de Pikachu tendría que desarrollar el método volar y en cambio decimos que solamente va a poder volar a Lola y Kanto, que es un hijo de Pikachu, no puede volar, con lo cual no vamos a poner el volar como un método abstracto en la clase Pikachu. 388 00:33:58,420 --> 00:34:09,320 y bueno y poco más, definición del método de astrazo luchar 389 00:34:09,320 --> 00:34:12,880 nos pide por aquí, pues en la Pikachu yo creo que ya la tenemos más o menos hecha 390 00:34:12,880 --> 00:34:17,539 vamos a hacer alguna de estas clases, la Alola este por ejemplo 391 00:34:17,539 --> 00:34:32,409 bien, la clase Alola hereda Stance 392 00:34:32,409 --> 00:34:42,030 es hija de la clase Pikachu, esto que implica 393 00:34:42,030 --> 00:34:45,690 pues todo objeto de la clase Alola tendrá 394 00:34:45,690 --> 00:34:48,829 estos tres parámetros y tendrá disponible todo esto 395 00:34:48,829 --> 00:34:55,550 tendrá además un método que será 396 00:34:55,550 --> 00:34:59,469 aquel método que estaba definido dentro del interfaz entrenador 397 00:34:59,469 --> 00:35:03,610 que era el método entrenar, y en principio no nos obligaría a desarrollarlo 398 00:35:03,610 --> 00:35:07,409 aquí, ¿por qué? Pues porque tiene un método ya desarrollado aquí, puede utilizar 399 00:35:07,409 --> 00:35:11,510 este, pero no nos compila, ¿por qué no nos compila? Pues 400 00:35:11,510 --> 00:35:15,110 porque en la clase padre hemos definido un método abstracto 401 00:35:15,110 --> 00:35:19,349 que es el método luchar, que no está desarrollado, al ser 402 00:35:19,349 --> 00:35:21,789 hija de Pikachu, obligatoriamente 403 00:35:21,789 --> 00:35:23,510 tengo que desarrollar este método. 404 00:35:42,019 --> 00:35:43,619 A ver, ¿por qué no le gusta esto? 405 00:35:45,659 --> 00:35:47,280 Digo que herede de este. 406 00:35:47,980 --> 00:35:48,300 Ah, vale. 407 00:35:49,139 --> 00:35:50,960 Sí, como he mantenido 408 00:35:50,960 --> 00:35:52,900 este abstracto, pues entonces me dice que la clase 409 00:35:52,900 --> 00:35:54,900 sea abstracta. En este caso ya no queremos 410 00:35:54,900 --> 00:35:56,599 que sea abstracto y ya nos compila. 411 00:35:59,199 --> 00:35:59,599 Podríamos, 412 00:36:00,739 --> 00:36:02,639 con este abstracto que tenemos aquí, 413 00:36:02,940 --> 00:36:04,760 en verdad esta clase podría seguir siendo 414 00:36:04,760 --> 00:36:11,360 abstracta y mantener 415 00:36:11,360 --> 00:36:13,179 sin definir todavía 416 00:36:13,179 --> 00:36:15,619 el luchar. ¿Veis? Ahí me compila. 417 00:36:15,920 --> 00:36:19,000 ¿Pero podríamos instanciar un objeto de la clase alola? No, porque no lo tiene 418 00:36:19,000 --> 00:36:20,800 definido. Tendríamos que definir 419 00:36:20,800 --> 00:36:25,380 instanciar de objetos de clases que sean hijas de la clase 420 00:36:25,380 --> 00:36:27,900 alola. Es decir, iríamos, digamos, 421 00:36:28,079 --> 00:36:30,860 en cascada derivando la característica 422 00:36:30,860 --> 00:36:33,880 de la clase y del método. Pero bueno, en nuestro programa 423 00:36:33,880 --> 00:36:37,000 ya, directamente aquí ya implementamos, pues 424 00:36:37,000 --> 00:36:42,860 ahí lo tenemos. Vale, de momento 425 00:36:42,860 --> 00:36:44,659 nos va compilando bien el programa. 426 00:36:44,659 --> 00:37:00,739 A ver qué es lo que tiene que hacer Alola cuando lucha. Dice, cuando lucha, decrementa su nivel de energía en dos unidades. Pues bien, vamos a poner ya lo que tiene que hacer. 427 00:37:00,739 --> 00:37:05,000 recordamos que tiene que alimentar el nivel de energía 428 00:37:05,000 --> 00:37:08,639 la energía la tiene definida aquí como un atributo entero 429 00:37:08,639 --> 00:37:13,400 pero aquí podemos poner ienergía 430 00:37:13,400 --> 00:37:17,639 igual a ienergía menos 2 431 00:37:17,639 --> 00:37:20,659 no, ¿por qué no nos deja hacer esto? 432 00:37:21,199 --> 00:37:24,360 porque lo hemos definido aquí como privado, la energía 433 00:37:24,360 --> 00:37:27,320 entonces tenemos que utilizar los getter y los setter 434 00:37:27,320 --> 00:37:29,019 entonces podríamos poner 435 00:37:29,019 --> 00:37:36,019 un set, set y energía 436 00:37:36,019 --> 00:37:39,019 vamos a hacerlo todo en una línea 437 00:37:39,019 --> 00:37:41,719 y aquí ponemos un get 438 00:37:41,719 --> 00:37:44,679 y energía 439 00:37:44,679 --> 00:37:47,639 menos dos. 440 00:37:49,059 --> 00:37:50,579 Este código que nos hace 441 00:37:50,579 --> 00:37:53,800 recuperar la energía que tiene, le resta 442 00:37:53,800 --> 00:37:56,860 dos y este valor, el que devuelve 443 00:37:56,860 --> 00:37:59,039 esta operación es el que se asigna 444 00:37:59,039 --> 00:38:01,519 al set. Fijaros que 445 00:38:01,519 --> 00:38:06,539 si tuviéramos un nivel de energía de 0, 0 menos 2 446 00:38:06,539 --> 00:38:10,440 pues resultaría ser menos 2 y le aplicaríamos un menos 2 447 00:38:10,440 --> 00:38:14,559 al setter, pero como aquí en el setter hemos dicho que si la energía 448 00:38:14,559 --> 00:38:18,659 es menor que 0, en verdad lo mantenga a 0, pues no nos metería 449 00:38:18,659 --> 00:38:25,800 un valor de energía negativo en ningún caso. Ahora ya me compila 450 00:38:25,800 --> 00:38:29,960 bien, pero el Alola este además 451 00:38:29,960 --> 00:38:33,420 tiene que ser capaz de entrenar. Si lanzamos 452 00:38:33,420 --> 00:38:37,659 el método de entrenar, ¿qué es lo que sucederá? Pues lo que sucederá 453 00:38:37,659 --> 00:38:41,360 será lo que tiene por herencia 454 00:38:41,360 --> 00:38:45,480 desde arriba, que no pone justo lo que queremos que haga 455 00:38:45,480 --> 00:38:48,159 porque no teníamos claro si diferentes 456 00:38:48,159 --> 00:38:52,420 hijos de Pikachu 457 00:38:52,420 --> 00:38:57,460 se comportarían de la misma forma al entrenar. Si no lo hacen 458 00:38:57,460 --> 00:39:00,599 pues lo que vamos a hacer es en cada uno de ellos sobreescribirlo. 459 00:39:00,599 --> 00:39:03,039 entonces ahora aquí cogemos y decimos 460 00:39:03,039 --> 00:39:05,519 sobre escríbeme el método de entrenar 461 00:39:05,519 --> 00:39:13,210 vamos a ver qué es lo que hace Alola para entrenar 462 00:39:13,210 --> 00:39:15,309 Alola por aquí, cuando entrena 463 00:39:15,309 --> 00:39:18,630 incrementa en una unidad su energía 464 00:39:18,630 --> 00:39:20,849 vamos a hacer esto 465 00:39:20,849 --> 00:39:27,099 en este caso lo que hace es incrementar en una unidad la energía 466 00:39:27,099 --> 00:39:28,079 ahí lo tenemos 467 00:39:28,079 --> 00:39:35,659 Alola es capaz de volar 468 00:39:35,659 --> 00:39:38,780 bueno aquí, vamos a hacer el vuela 469 00:39:38,780 --> 00:39:42,960 es capaz de volar y decrementa en una unidad la energía cuando vuela 470 00:39:42,960 --> 00:39:47,829 pues nada, volar es algo particular de Alola 471 00:39:47,829 --> 00:39:49,949 pues será un método que tendrá él y ya está 472 00:39:49,949 --> 00:39:55,809 y lo que hace es decrementar 473 00:39:55,809 --> 00:39:57,670 en una unidad la energía, creo que nos dice 474 00:39:57,670 --> 00:39:58,489 pues ahí lo tenemos 475 00:39:58,489 --> 00:40:01,449 en este caso no ponemos override, ¿por qué? 476 00:40:01,530 --> 00:40:03,550 porque no está sobrescribiendo ningún método 477 00:40:03,550 --> 00:40:06,030 anteriormente definido en clases padres 478 00:40:06,030 --> 00:40:08,010 si lo pusiéramos, ¿qué sucedería? 479 00:40:08,110 --> 00:40:09,630 pues nos diría, oye, volar 480 00:40:09,630 --> 00:40:11,750 mal vas, porque estás intentando sobrescribir 481 00:40:11,750 --> 00:40:13,929 un método volar, pero no existe 482 00:40:13,929 --> 00:40:15,769 por herencia de ningún sitio 483 00:40:15,769 --> 00:40:16,969 no está sobrescribiendo nada 484 00:40:16,969 --> 00:40:21,929 si me lo pones y no lo veráis si te dejo porque bueno pues es un método propio de la clase alola 485 00:40:21,929 --> 00:40:29,010 pues me parece bien en ese caso y luego nos dice por aquí que dispone de un constructor por defecto 486 00:40:29,010 --> 00:40:41,889 casina los valores 5 de energía y vida y reichu alola al tipo bueno esto lo podemos definir de 487 00:40:41,889 --> 00:40:49,530 diferentes formas ponerlo aquí directamente el constructor vamos a hacer diferentes alternativas 488 00:40:49,530 --> 00:40:51,949 ponemos public, acordaros, los constructores 489 00:40:51,949 --> 00:40:53,090 como la clase 490 00:40:53,090 --> 00:40:58,840 pero no devuelve nada 491 00:40:58,840 --> 00:41:00,699 pero no lo indicamos como en el void 492 00:41:00,699 --> 00:41:02,199 entonces lo que 493 00:41:02,199 --> 00:41:04,619 el objetivo es dar a estos 494 00:41:04,619 --> 00:41:08,340 para Lola en particular 495 00:41:08,340 --> 00:41:20,539 un 5 por aquí 496 00:41:20,539 --> 00:41:22,199 un 5 por aquí 497 00:41:22,199 --> 00:41:24,980 y aquí en el tipo 498 00:41:24,980 --> 00:41:31,179 el nombre es 499 00:41:31,179 --> 00:41:32,280 Rachel a Lola 500 00:41:32,280 --> 00:41:45,800 vale, no me está dejando, ¿por qué? 501 00:41:45,920 --> 00:41:46,559 pues porque 502 00:41:46,559 --> 00:41:49,719 porque los tenemos privados estos datos 503 00:41:49,719 --> 00:42:06,019 con lo cual tenemos que utilizar set y vida, 5, set y energía, los getter y los setter, 504 00:42:06,119 --> 00:42:09,639 acordaros que lo habíamos definido privados, si los hubiéramos puesto protective, 505 00:42:10,300 --> 00:42:26,469 pues sí que me dejaría hacer esto directamente, set ese tipo, bueno, pues ahí lo tenemos. 506 00:42:27,170 --> 00:42:30,889 Esta sería una opción, y otra opción que podríamos tener es la siguiente, 507 00:42:30,889 --> 00:43:00,039 Fijaros, podríamos definir aquí en Pikachu, le voy a comentar esta, y en Pikachu podríamos definir un constructor de Pikachu que recibiese un int y vida, un int y energía y un string ese tipo. 508 00:43:00,039 --> 00:43:22,500 Bueno, y aquí se los asignamos, dis y vida, que sea igual a y vida, dis y energía, que sea igual a y energía, una asignación directa, sin más cosa, esto, y dis ese tipo, que sea igual a ese tipo. 509 00:43:22,500 --> 00:44:38,079 Y aquí podríamos tener otro constructor diferente que fuese el siguiente, que recibiese también estos parámetros cuando lo vayamos a crear y ahora desde aquí llamar, me ha dejado de compilar, ahora miramos a ver por qué, bueno aquí podríamos hacer esto, a ver, bueno pues podríamos hacer esta otra jugada, cuando creemos el objeto alola le podríamos pasar al constructor los tres datos y llamar con el método super al constructor que tiene estos tres datos, 510 00:44:38,099 --> 00:44:41,960 tres mismos, esta misma característica, ¿verdad? Con tres datos, 511 00:44:42,119 --> 00:44:45,699 dos enteros y un string, super, pasando los datos. 512 00:44:46,039 --> 00:44:50,119 Entonces, esto lo que hace es ejecutar el constructor de la clase padre, y la clase 513 00:44:50,119 --> 00:44:53,960 padre, fijaros que lo que hemos hecho ha sido, para un constructor con esta misma estructura, 514 00:44:54,460 --> 00:44:58,179 asignarle los valores que recibe como parámetros. Entonces, en este caso 515 00:44:58,179 --> 00:45:01,880 tendría el mismo resultado utilizar este constructor 516 00:45:01,880 --> 00:45:05,840 que este, llamando al super, siempre y cuando, claro, este 517 00:45:05,840 --> 00:45:16,190 este, ¿por qué no me compila ahora? 518 00:45:29,760 --> 00:45:30,340 Bueno, no sé. 519 00:45:31,420 --> 00:45:32,440 No sé muy bien por qué no 520 00:45:32,440 --> 00:45:34,900 deja convivir los dos. 521 00:45:35,099 --> 00:45:36,820 Antes con él solo sí me lo permitía 522 00:45:36,820 --> 00:45:39,300 y ahora que he metido esto otro, ya no. 523 00:45:39,480 --> 00:45:41,219 Ah, bueno, claro. Ya sé por qué no me 524 00:45:41,219 --> 00:45:42,539 deja. No me deja, claro. 525 00:45:43,619 --> 00:45:45,400 Bien. Os explico 526 00:45:45,400 --> 00:45:47,159 el por qué creo que no me deja. Al hacer 527 00:45:47,159 --> 00:45:47,519 esto, 528 00:45:49,219 --> 00:45:51,340 necesita tener un constructor en la clase 529 00:45:51,340 --> 00:45:53,619 padre sin atributos. 530 00:45:53,619 --> 00:45:55,679 Como he creado este, el de por defecto ya no 531 00:45:55,679 --> 00:46:10,019 A ver si cogemos, si decimos un public Pikachu, que existe un constructor sin atributos aquí, ahora ya me compila este también. 532 00:46:10,239 --> 00:46:16,079 Es decir, si tenemos que el hijo tiene un constructor sin atributos, el padre tiene que tener un constructor sin atributos también. 533 00:46:16,820 --> 00:46:24,659 Cuando no existía este, este existía por defecto como siempre, el constructor sin atributos, pero al crear este, este ya deja de estar activo, el de por defecto. 534 00:46:24,659 --> 00:46:29,579 Y como aquí lo teníamos definido sin atributos, necesitaba que el padre también lo tuviera. 535 00:46:29,880 --> 00:46:31,960 Ese era el motivo por el que no me compilaba. 536 00:46:32,840 --> 00:46:34,579 Bueno, tenemos ya os digo dos alternativas. 537 00:46:34,860 --> 00:46:43,079 Una, esta y otra, esta y llamar al atributo al constructor del padre a través del método super. 538 00:46:44,400 --> 00:46:46,679 Vamos a dejar los dos códigos y luego probamos ambos. 539 00:46:46,679 --> 00:46:57,260 dos bueno pues con esto tenemos a pikachu lucha entrena perdona lola lucha vuela entrena y el 540 00:46:57,260 --> 00:47:04,719 constructor el constructor con las dos alternativas luchar entrenar y volar y vamos a hacer el otro el 541 00:47:04,719 --> 00:47:15,630 canto que va a ser prácticamente igual pero sin la capacidad de volar vamos a decirle también que 542 00:47:15,630 --> 00:47:29,699 herede se me queja me dice oye si hereda de pikachu tienes que implementar aquellos métodos 543 00:47:29,699 --> 00:47:35,960 abstractos que tengas definidos en pikachu me pongo aquí me dice añade los métodos no implementados 544 00:47:35,960 --> 00:47:43,039 pues ahí está ya luchar y para no repetir la misma película todo el rato pues vamos a hacer 545 00:47:43,039 --> 00:47:53,579 copia y pega aquí de estas cosas y las modificamos incluso ya que me he traído a luchar por aquí 546 00:47:53,579 --> 00:47:59,599 la clase es canto, pues ahí tengo canto 547 00:47:59,599 --> 00:48:04,199 ahora vemos que, bueno este constructor en sí 548 00:48:04,199 --> 00:48:08,019 no tiene mucho sentido porque canto no va a tener atributos 549 00:48:08,019 --> 00:48:14,239 fijos, pero bueno, ahora lo miramos, aquí este ya no se llama 550 00:48:14,239 --> 00:48:18,300 el constructor alola, pues ya está, por aquí, sí que puede luchar 551 00:48:18,300 --> 00:48:22,320 entrenar, canto no puede volar, vamos a 552 00:48:22,320 --> 00:48:27,760 borrarlo, que viene del copy-paste del otro sitio. Vamos a ver cómo se tiene 553 00:48:27,760 --> 00:48:33,769 que comportar Canto. Cuando lucha, decrementa su nivel 554 00:48:33,769 --> 00:48:41,380 de vida en dos unidades. No sé si antes lo he hecho bien. A ver. 555 00:48:41,619 --> 00:48:45,340 ¿Y Alola también decrementaba en dos unidades? Vale. 556 00:48:46,039 --> 00:48:49,260 Alola lo decrementaba en una unidad. Yo creo que había leído aquí antes. 557 00:48:49,559 --> 00:48:53,219 Entonces Alola en una unidad y Canto en dos. Canto 558 00:48:53,219 --> 00:48:57,679 está bien, pero Alola decrementa cuando lucha en una unidad. 559 00:48:57,679 --> 00:49:05,099 y cuando entrena, a ver que es lo que hace cuando entrena 560 00:49:05,099 --> 00:49:12,710 cuando entrena incrementa su energía en una unidad 561 00:49:12,710 --> 00:49:20,159 cuando entrena aumenta su energía en una unidad, entonces si tenemos 562 00:49:20,159 --> 00:49:24,219 solo dos hijos que cuando entrenan aumentan su energía en una unidad 563 00:49:24,219 --> 00:49:28,119 ambos dos, igual no tiene mucho sentido tenerlo en las clases hijas 564 00:49:28,119 --> 00:49:31,599 definidas de entrenar, pues vamos a aprovechar que está en Pikachu 565 00:49:31,599 --> 00:49:35,900 el método entrenar y vamos aquí 566 00:49:35,900 --> 00:49:38,059 a decir que cuando 567 00:49:38,059 --> 00:49:42,739 entrene, Pikachu 568 00:49:42,739 --> 00:49:44,619 aumente su energía en una unidad 569 00:49:44,619 --> 00:49:46,599 y como ya lo aumenta Pikachu 570 00:49:46,599 --> 00:49:48,619 no sobreescribimos el método 571 00:49:48,619 --> 00:49:50,360 en estos dos, vamos a utilizar 572 00:49:50,360 --> 00:49:52,780 el entrenar de la clase 573 00:49:52,780 --> 00:49:56,400 padre para los dos 574 00:49:56,400 --> 00:49:57,139 ya que es igual 575 00:49:57,139 --> 00:50:00,360 esto no lo podemos hacer con 576 00:50:00,360 --> 00:50:02,280 luchar porque cada uno decrementa 577 00:50:02,280 --> 00:50:04,139 en diferentes valores, no podemos 578 00:50:04,139 --> 00:50:05,480 utilizar directamente 579 00:50:05,480 --> 00:50:08,280 la información que tenemos en la clase 580 00:50:08,280 --> 00:50:09,940 padre para luchar, pero para entrenar 581 00:50:09,940 --> 00:50:13,760 a ser común, pues mira, vamos a utilizar esa característica de la programación orientada a objetos 582 00:50:13,760 --> 00:50:18,239 que los dos hereden el método de la clase Pikachu y ya que tiene el mismo comportamiento 583 00:50:18,239 --> 00:50:23,889 hagan lo mismo. Entonces, Kanto ya es capaz de luchar 584 00:50:23,889 --> 00:50:27,949 entrenar, va a ser capaz de entrenar a través de la clase padre 585 00:50:27,949 --> 00:50:31,469 y tenemos aquí el constructor que es capaz de 586 00:50:31,469 --> 00:50:36,150 otorgarle ciertos valores. En el caso de Kanto 587 00:50:36,150 --> 00:50:39,829 dispone de un constructor que recibe como parámetros iniciales 588 00:50:39,829 --> 00:50:46,670 es asignar los valores de energía vida que se recogerán por teclado y el tipo se asigna por 589 00:50:46,670 --> 00:50:56,750 defecto raichu canto entonces éste recibe la energía y la vida y tenemos aquí que le pasa 590 00:50:56,750 --> 00:51:06,219 el raichu canto es vale bueno pues en esta clase no tenemos mucho más que hacer porque ya recibirá 591 00:51:06,219 --> 00:51:13,360 en el constructor estos datos para poder aplicarlos pues vamos a la clase que tiene el 592 00:51:13,360 --> 00:51:49,440 ejecutar pokemon se trata el punto inicio del programa ejecutar pokemon poner el punto inicio 593 00:51:49,440 --> 00:51:59,170 del programa dice que define una referencia a pikachu todavía fijaros no sabemos si va a ser 594 00:51:59,170 --> 00:52:07,349 un del tipo canto o alola con lo cual definimos una referencia a un pikachu pues vamos a hacerlo 595 00:52:07,349 --> 00:52:29,300 podríamos hacer aquí un new pikachu pues no nos deja porque no nos deja crear una instancia un 596 00:52:29,300 --> 00:52:36,579 objeto de pikachu porque porque es una clase abstracta con pose una clase abstracta pues va 597 00:52:36,579 --> 00:52:41,980 a tener algún método al menos que sea abstracto y como no está definido no van a no va a saber qué 598 00:52:41,980 --> 00:52:49,179 hacer y pique que es un objeto de la clase pikachu se supone a la hora de llamar a esto entonces dice 599 00:52:49,179 --> 00:53:21,849 Mira, la referencia te dejo, el new no. El programa lo primero que nos va a pedir va a ser, pues va a decir si es una lola o un canto. Pues venga, vamos a hacer esto. Para pedir por teclado, como siempre, scanner, mi, scan, tendríamos la posibilidad de hacer un buffer reader siempre y cuando trabajemos sobre system in, este es el flujo de datos asociados al teclado. 600 00:53:21,849 --> 00:53:38,550 Y lo que hacemos es ponerle capas como si fuera una cebolla por encima para que nos resulte más fácil su manejo. El manejo más sencillo en realidad desde Java para poder manejar datos leídos desde teclado es con la clase Scanner, disponible en las librerías de Java, pero no es la única. 601 00:53:38,550 --> 00:53:57,530 Está la buffer reader que hablábamos la semana pasada en la tutoría y lo hemos dejado aparcado para el siguiente tema, que al hacer lecturas de ficheros trabajaremos más con esas clases que son las aconsejadas para leer ficheros, pero también nos sirve para leer flujos de datos como por ejemplo los de teclado con Systeming. 602 00:53:57,530 --> 00:53:59,809 de momento vamos a seguir trabajando con Scanner 603 00:53:59,809 --> 00:54:03,150 miScan, pues hacemos un newScanner 604 00:54:03,150 --> 00:54:06,929 y asociamos, fijaros aquí 605 00:54:06,929 --> 00:54:09,329 es donde le asociamos el flujo del datos 606 00:54:09,329 --> 00:54:13,130 es decir, el centro de esa cebolla a la cual le ponemos capas 607 00:54:13,130 --> 00:54:16,210 entonces el flujo de datos sobre el que vamos a trabajar 608 00:54:16,210 --> 00:54:18,530 ahora es el teclado, pues ponemos aquí SystemIn 609 00:54:18,530 --> 00:54:21,670 y le ponemos la capa 610 00:54:21,670 --> 00:54:24,690 de Scanner a través de un objeto miScan 611 00:54:24,690 --> 00:54:27,409 para hacer de forma más cómoda la lectura de los datos 612 00:54:27,409 --> 00:54:30,610 recibidos desde el teclado. Importamos la librería 613 00:54:30,610 --> 00:54:37,019 y ya la tenemos, que está en Java útil. Para hacer el manejo 614 00:54:37,019 --> 00:54:40,780 del programa, fijaros que para System In, como os decía, 615 00:54:41,860 --> 00:54:45,380 solemos meterla dentro de una clase que nos permite manejarlo 616 00:54:45,380 --> 00:54:49,400 más fácilmente, pero en cambio System Out, que es otro flujo de datos, 617 00:54:49,539 --> 00:54:53,320 en este caso comunica nuestro programa con el exterior, y ese exterior 618 00:54:53,320 --> 00:54:57,199 en este caso, la tubería está conectada a la pantalla, la hacemos directamente con 619 00:54:57,199 --> 00:55:36,219 System.out, pues dime el tipo de Pikachu y aquí ponemos a Lola o con un System.out.println, después de mostrar esto me va a llevar a otra línea, pues mira, voy a dejar un System.out.print, otro método disponible dentro del flujo de datos para que me lo deje en la misma línea y así después de la petición, pues puedo escribir con teclado. 620 00:55:36,219 --> 00:55:58,190 Y ahora, pues bueno, pues hago aquí un string sinf de teclado que sea igual a myscan.deskline. Vale, pues aquí cojo la información. 621 00:55:58,190 --> 00:56:02,469 puedo creerme que me va a venir bien o puedo manejar 622 00:56:02,469 --> 00:56:06,429 que la información sea correcta, podríamos poner una condición 623 00:56:06,429 --> 00:56:09,730 con un while por ejemplo, para seguir pidiendo 624 00:56:09,730 --> 00:56:14,510 el dato de si es Pikachu, si es Alola o Canto mientras no se meta 625 00:56:14,510 --> 00:56:18,289 la información que esperamos y podemos decir mientras 626 00:56:18,289 --> 00:56:21,289 ese inf test 627 00:56:21,289 --> 00:56:32,559 sea diferente a, vamos a poner aquí en minúsculas 628 00:56:32,559 --> 00:56:44,219 todo. Vamos a poner que mientras sea igual 629 00:56:44,219 --> 00:56:51,929 a esto o a canto 630 00:56:51,929 --> 00:56:59,530 y ahora cojo y niego todo. Entonces digo 631 00:56:59,530 --> 00:57:03,510 si es igual a este o igual a este 632 00:57:03,510 --> 00:57:09,409 ya me gusta. Si me gusta, uno de los dos será verdadero 633 00:57:09,409 --> 00:57:12,409 perdón, con string no puedo poner igual, tengo que 634 00:57:12,409 --> 00:57:17,269 utilizar métodos. Equals, que me devuelven 635 00:57:17,269 --> 00:57:17,989 true o false. 636 00:57:42,679 --> 00:57:43,239 Uy, qué lío. 637 00:57:44,239 --> 00:57:44,559 A ver. 638 00:57:46,440 --> 00:57:47,159 Ahí está, ¿no? 639 00:57:48,159 --> 00:57:57,969 No. Ahí está. 640 00:57:58,610 --> 00:58:00,590 Entonces aquí nos dice, si es 641 00:58:00,590 --> 00:58:02,369 igual a este, ya me va a valer. 642 00:58:03,110 --> 00:58:04,530 O si es igual a este, también 643 00:58:04,530 --> 00:58:06,429 me va a valer. Cualquiera de los dos. Bueno, ahora 644 00:58:06,429 --> 00:58:08,230 pongo canto ahí a la derecha, que se me ha quedado 645 00:58:08,230 --> 00:58:10,449 una palabra rara. Si es cualquiera 646 00:58:10,449 --> 00:58:12,809 de los dos, todo esto va a ser verdadero. 647 00:58:13,650 --> 00:58:14,809 Si todo esto 648 00:58:14,809 --> 00:58:16,650 es verdadero, con que 649 00:58:16,650 --> 00:58:18,329 cualquiera de los dos sea verdadero, lo unió aquí, 650 00:58:18,329 --> 00:58:23,780 se me convierte el falso y se sale del while. Mientras no sea 651 00:58:23,780 --> 00:58:27,500 alguno de los dos verdaderos, o bien este 652 00:58:27,500 --> 00:58:31,780 o bien este, todo el conjunto 653 00:58:31,780 --> 00:58:35,880 será falso. Entonces si todo el conjunto es falso 654 00:58:35,880 --> 00:58:39,139 y lo doy la vuelta aquí, se convierte en verdadero y me quedo en el while. 655 00:58:41,800 --> 00:58:44,619 Entonces aquí puedo poner un system 656 00:58:44,619 --> 00:58:58,210 .out.println error al meter 657 00:58:58,210 --> 00:59:22,440 el tipo debe ser a lo lado canto. Pongo aquí un print. Bueno, no sé si tendría que meter aquí 658 00:59:22,440 --> 00:59:27,840 un print, un system.out.println porque se me quedará este y este en la misma línea. Luego 659 00:59:27,840 --> 00:59:38,010 lo comprobamos en la primera ejecución. Y tengo que volver a hacer una lectura dentro de las llaves 660 00:59:38,010 --> 00:59:47,440 aquí. Bueno, aquí me quedaré hasta que me diga a lo lado canto. En el momento que esté bien una 661 00:59:47,440 --> 00:59:48,119 de las dos 662 00:59:48,119 --> 00:59:50,840 pues lo que voy a hacer va a ser 663 00:59:50,840 --> 00:59:52,360 hacer la instancia 664 00:59:52,360 --> 00:59:54,179 entonces digo, si 665 00:59:54,179 --> 00:59:58,260 este era un while, pues ahora sí 666 00:59:58,260 --> 01:00:02,320 ese es alola 667 01:00:02,320 --> 01:00:10,900 bueno, el más sencillo es canto, vamos a poner si es canto 668 01:00:10,900 --> 01:00:17,179 pues lo que voy a hacer va a ser 669 01:00:17,179 --> 01:00:19,280 que este, en cuanto al poliformismo 670 01:00:19,280 --> 01:00:21,300 vamos a decir que mi pic, ahora ya 671 01:00:21,300 --> 01:00:22,559 lo instancia un new 672 01:00:22,559 --> 01:00:25,989 y lo defino como canto 673 01:00:25,989 --> 01:00:32,079 si lo hago así, con canto 674 01:00:32,079 --> 01:00:33,900 me estará viniendo por este 675 01:00:33,900 --> 01:00:36,119 constructor, que en realidad no es 676 01:00:36,119 --> 01:00:40,179 el que me interesa. El que me interesa es 677 01:00:40,179 --> 01:00:44,000 este, que es el que está asignando, porque este, fijaros, que no hace nada. Este simplemente está para que 678 01:00:44,000 --> 01:00:47,760 compile. Entonces, aquí le pasaré canto, creo que 679 01:00:47,760 --> 01:00:51,599 recordar que tenía 5, 5 de vida, y luego recibía 680 01:00:51,599 --> 01:00:57,829 como nombre, a ver, canto, como era el nombre, 681 01:01:04,139 --> 01:01:08,469 Raichu Canto. Ah, no, este 682 01:01:08,469 --> 01:01:13,829 es el que se coge por teclado, es el Alola, el que no se 683 01:01:13,829 --> 01:01:16,889 recoge por teclado. Pues entonces vamos a hacer aquí, vamos a poner aquí a Lola 684 01:01:16,889 --> 01:01:23,119 y vamos a decir que a Lola y este 685 01:01:23,119 --> 01:01:28,710 será right to a Lola. Fijaros, este 686 01:01:28,710 --> 01:01:32,190 constructor que recibe los tres parámetros cuando se venga aquí a Lola 687 01:01:32,190 --> 01:01:36,670 será este, este se los pasa a través del 688 01:01:36,670 --> 01:01:40,730 super al constructor padre y el constructor padre 689 01:01:40,730 --> 01:01:44,650 que recibe los tres parámetros se los asigna ya a los atributos 690 01:01:44,650 --> 01:01:56,559 de clase. Bueno, ahí lo tengo construido ya. Y si no, si no es una Alola, pues resulta que va a ser 691 01:01:56,559 --> 01:02:01,260 un canto. Si es un canto, ¿qué necesitamos? Coger el nivel de energía y el nivel de vida. 692 01:02:08,869 --> 01:02:30,269 System of Print, el nivel de vida de Alola. Bueno, va a ser un número. Podríamos hacer un 693 01:02:30,269 --> 01:02:42,340 es int y luego limpiar el buffer cuando toque o bueno podemos si queréis la alternativa a esta 694 01:02:42,340 --> 01:02:56,699 hacemos mi scan igual punto nest line lo cogemos como una línea vamos a definir un momento un int 695 01:02:56,699 --> 01:03:08,849 aunque luego lo quitemos y aus hicimos un y aus igual a integer punto parse int de un string y 696 01:03:08,849 --> 01:03:25,710 string que utilizamos es el que acabamos de coger por teclado y ahora lo que tenemos que hacer es 697 01:03:25,710 --> 01:03:35,889 este es el nivel de vida pues tenemos que hacer para bueno fijaros que si era una lola hacíamos 698 01:03:35,889 --> 01:03:53,639 esto pues si es un canto lo que tenemos que hacer es llamar a canto aquí vamos a poner y aus vida 699 01:03:53,639 --> 01:03:57,440 y aus 700 01:03:57,440 --> 01:03:59,800 energía 701 01:03:59,800 --> 01:04:08,199 y aus vida 702 01:04:08,199 --> 01:04:10,880 y ahora hacemos esta misma 703 01:04:10,880 --> 01:04:11,699 para la energía 704 01:04:11,699 --> 01:04:18,659 de alola 705 01:04:18,659 --> 01:04:21,280 os creo de aquí una variable 706 01:04:21,280 --> 01:04:26,690 entonces aquí tenemos ya la vida, la energía 707 01:04:26,690 --> 01:04:28,550 y ahora creamos canto 708 01:04:28,550 --> 01:04:30,289 con el constructor indicándole 709 01:04:30,289 --> 01:04:31,969 que de vida tiene este nivel 710 01:04:31,969 --> 01:04:34,110 a ver si está en ese orden 711 01:04:34,110 --> 01:04:38,659 vida primero y energía segundo 712 01:04:38,659 --> 01:04:40,880 entonces decimos que de vida 713 01:04:40,880 --> 01:04:41,679 tiene ese valor 714 01:04:41,679 --> 01:04:49,989 y de energía pues tiene este otro. Vale, pues ya tenemos dados de alta 715 01:04:49,989 --> 01:04:54,090 según sea canto o según sea por poliformismo 716 01:04:54,090 --> 01:04:57,849 o según sea una lola, pues tenemos 717 01:04:57,849 --> 01:05:06,679 uno u otro. Hemos utilizado la característica de poliformismo de hacer un 718 01:05:06,679 --> 01:05:10,519 new a un tipo de objeto hijo cuando la referencia en sí por arriba 719 01:05:10,519 --> 01:05:13,400 era una referencia al padre, a Pikachu. 720 01:05:23,619 --> 01:05:27,480 Esta nos pide crear un menú en el que se indique 721 01:05:27,480 --> 01:05:31,340 lo que quieren hacer, si quieren volar, qué cosas quieren hacer. 722 01:05:31,500 --> 01:05:41,119 Vamos a ver si creamos el menú. 723 01:05:41,639 --> 01:05:45,440 Aquí podemos utilizar diferentes estructuras. 724 01:05:46,079 --> 01:05:47,940 Lo primero que vamos a hacer va a ser pedir un dato. 725 01:05:48,340 --> 01:05:52,460 Si vamos a pedir un dato y ponemos aquí un while como estructura de control de repetición, 726 01:05:52,920 --> 01:05:56,239 tendremos que hacer una primera petición del dato aquí fuera. 727 01:05:56,239 --> 01:06:00,619 Si utilizamos un do while, directamente aparecería 728 01:06:00,619 --> 01:06:09,139 do, la primera petición y el while se valora luego aquí abajo. Cualquiera de las estructuras está 729 01:06:09,139 --> 01:06:14,019 bien. Yo la verdad es que estoy más acostumbrado a utilizar el while que el do while, pues voy a 730 01:06:14,019 --> 01:06:39,519 hacerlo de esta forma. Entonces, podríamos crear un método que fuese menú. Bueno, vamos a 731 01:06:39,519 --> 01:07:03,050 poner menú, luego si acaso hacemos el método. Aplicación Pokémon, más podemos poner aquí 732 01:07:03,050 --> 01:07:14,380 instancia vamos a poner o participando 733 01:07:14,380 --> 01:07:29,699 aquí indicamos si participa por ejemplo un raicho 734 01:07:29,699 --> 01:07:39,860 o un canto. Bueno, pues aquí vamos a decir 735 01:07:39,860 --> 01:07:44,920 vamos a poner un barra T, nunca me acuerdo si la barra es esta, si no es esta luego la cambio 736 01:07:44,920 --> 01:07:49,059 a la siguiente para la tabulación y vamos a decir 737 01:07:49,059 --> 01:07:54,510 ponemos aquí 1 volar 738 01:07:54,510 --> 01:07:58,309 no volar es el que es solamente 739 01:07:58,309 --> 01:08:01,369 que está solo disponible en uno de ellos, pues uno luchar 740 01:08:01,369 --> 01:08:15,619 dos, vamos a poner entrenar, bueno el tres, el tres sería 741 01:08:15,619 --> 01:08:19,500 volar o salir directamente, entonces aquí si queréis podemos hacer una distensión ya 742 01:08:19,500 --> 01:08:23,380 de los dos, y coger y poner if, si 743 01:08:23,380 --> 01:08:29,800 mi pic, y para saber 744 01:08:29,800 --> 01:08:33,619 si mi pic durante esta ejecución está trabajando como una lola o como 745 01:08:33,619 --> 01:08:37,600 un canto, podríamos poner instance of 746 01:08:37,600 --> 01:08:42,000 todo junto, instance of de la clase 747 01:08:42,000 --> 01:08:46,520 alola, el instance of 748 01:08:46,520 --> 01:08:50,060 esta comprobación, ponemos la referencia de la clase padre 749 01:08:50,060 --> 01:08:53,739 instance of es una instancia de, es un objeto del tipo alola 750 01:08:53,739 --> 01:08:57,460 si es así devuelve un true o un false, entonces si es una alola 751 01:08:57,460 --> 01:09:02,319 pues ahí podríamos hacer algo, y si no es una alola, como solo tenemos dos alternativas 752 01:09:02,319 --> 01:09:06,319 pues haríamos lo contrario, entonces alola 753 01:09:06,319 --> 01:09:09,260 era el que podía volar o no podía volar? A ver, que me acuerde yo. 754 01:09:11,180 --> 01:09:14,380 Alola es el que vuela y canto 755 01:09:14,380 --> 01:09:18,140 el que no. Pues entonces, si Alola es el que vuela, pues 756 01:09:18,140 --> 01:09:22,199 podríamos poner como un 3 aquí 757 01:09:22,199 --> 01:09:27,649 la opción de volar y 758 01:09:27,649 --> 01:09:40,579 un 4 la opción de salir. Y si 759 01:09:40,579 --> 01:09:44,340 es el que no vuela, pues ponemos aquí como un 3 directamente 760 01:09:44,340 --> 01:09:58,069 la opción de salir, entonces decimos, bueno esto es lo que nos pide, este es el menú que nos saca 761 01:09:58,069 --> 01:10:14,579 y ahora, voy a poner un string S opción, que sea igual a mi scan, aquí ponemos un system.out.println 762 01:10:14,579 --> 01:10:51,500 o print, una nueva línea, dos tabuladores, estoy intentando maquear un poco la salida, vamos a meter 763 01:10:51,500 --> 01:10:57,909 una entrada nueva ahí, los tabuladores 764 01:10:57,909 --> 01:11:04,170 indica tu opción. Y ahora sí que leemos con mi scan 765 01:11:04,170 --> 01:11:25,979 punto next line, aquí 766 01:11:25,979 --> 01:11:28,500 cojo la opción y ahora me quedo aquí 767 01:11:28,500 --> 01:11:32,479 mientras la opción leída 768 01:11:32,479 --> 01:11:43,939 equals 4, ah no, 3, 4 769 01:11:43,939 --> 01:11:47,880 tenemos diferente valor para la opción en este 770 01:11:47,880 --> 01:12:09,789 caso tendríamos que hacer bueno vamos a buscar un truquillo aquí vamos a decir por ejemplo estoy 771 01:12:09,789 --> 01:12:14,550 pensando claro aquí me va a llegar si es uno u otro me va a llegar con el valor 3 o con el 772 01:12:14,550 --> 01:12:26,659 valor 4 no me queda más remedio que hacer aquí un hijo no se me ocurre ninguna forma otra vez 773 01:12:26,659 --> 01:12:39,680 como este utilizo este y por aquí y por aquí seguramente hay alguna forma más limpia de 774 01:12:39,680 --> 01:13:09,020 hacerlo pero bueno defino el string este aquí vale aquí cojo la opción dos veces una por cada 775 01:13:09,020 --> 01:13:13,659 uno de los valores está quedando un poco feo este código ahora para esta opción pero seguramente con 776 01:13:13,659 --> 01:13:20,199 un ratillo más lo dejaríamos más maquillado y claro aquí ahora tendremos que hacer una 777 01:13:20,199 --> 01:13:30,220 comprobación de si esa opción punto equals si es igual en este caso a 4 778 01:13:31,840 --> 01:13:38,159 pues quiere decir que estoy intentando salir se me ocurre podríamos poner aquí esa opción 779 01:13:38,159 --> 01:13:53,689 igual a 10 un valor común y aquí podríamos hacer que si la s opción es igual a 3 la 780 01:13:53,689 --> 01:13:57,729 o que vale a 10. Estoy buscando que esa opción tenga un valor común tanto en un 781 01:13:57,729 --> 01:14:01,130 caso como en otro. Entonces ahora aquí ya puedo decir 782 01:14:01,130 --> 01:14:05,350 que mientras la opción sea diferente a 10 783 01:14:05,350 --> 01:14:10,829 pues que siga. Al final en lo que he hecho en el otro lado ha sido convertir 784 01:14:10,829 --> 01:14:15,149 el valor 3 o 4 para que sea común en 10 en ambos casos. 785 01:14:16,729 --> 01:14:19,170 Entonces si es diferente a 10, fijaros, si hubiera 786 01:14:19,170 --> 01:14:23,189 sido 3 aquí, era para salir, pues sería 10. Acabaría, si hubiese sido 4 787 01:14:23,189 --> 01:14:27,270 aquí, si lo hemos convertido a 10, acabaría también. Si es distinto 788 01:14:27,270 --> 01:14:34,819 a 10, quiere decir que estamos en alguna de las otras. Entonces, aquí 789 01:14:34,819 --> 01:14:39,319 diríamos sí. S opción punto equals 790 01:14:39,319 --> 01:14:44,880 si es igual a 1 de forma común 791 01:14:44,880 --> 01:14:51,380 va a luchar. A 1 va a luchar. Aquí tendremos 792 01:14:51,380 --> 01:14:58,100 que hacer que luche. Else if, si la S opción 793 01:14:58,100 --> 01:15:03,590 es igual a 2, lo que 794 01:15:03,590 --> 01:15:17,800 a hacer va a ser entrenar el solo me queda una opción ya porque si no ha sido salir no 795 01:15:17,800 --> 01:15:34,050 luchar ni es entrenar pues será volar solamente puede hacerlo a lola entonces si queremos luchar 796 01:15:34,050 --> 01:16:03,300 podríamos hacer mi pic punto luchar si es entrenar mi pic punto entrenar y si es volar mi pic punto 797 01:16:03,300 --> 01:16:08,359 volar no me deja. ¿Por qué no me deja volar? Porque volar solamente está disponible 798 01:16:08,359 --> 01:16:11,720 en Alola. Alola 799 01:16:11,720 --> 01:16:16,180 es el que puede volar, pero canto no puede volar. Entonces mi 800 01:16:16,180 --> 01:16:18,699 pig no tiene la posibilidad de volar. ¿Qué podemos hacer aquí? 801 01:16:20,180 --> 01:16:24,100 Pues una vez llegados aquí a este punto, tenemos total seguridad de que 802 01:16:24,100 --> 01:16:27,920 es una Alola. Entonces podemos hacer aquí una Alola, podemos hacer un casting 803 01:16:27,920 --> 01:16:32,020 mi al igual, compórtate 804 01:16:32,020 --> 01:16:37,600 mi pic como pikachu como una lola a lola mi pic 805 01:16:40,420 --> 01:16:50,710 y ahora ponemos aquí y al punto volar y este sí que me deja volar bueno podríamos hacer esta 806 01:16:50,710 --> 01:16:57,069 esto no me ha dado problemas porque pues porque mi pic tiene la en ambos dos tienen la opción de 807 01:16:57,069 --> 01:17:06,380 luchar o de entrenar y una vez hecha esta jugada lo que tendremos que hacer es repetir el menú que 808 01:17:06,380 --> 01:17:24,210 es todo este rollo que hemos puesto aquí todo este rollo aquí está todo esto es el menú verdad 809 01:17:24,210 --> 01:17:32,890 luego podemos si queréis intentar sacarlo a un método común copio este es el del do para aquí 810 01:17:32,890 --> 01:17:38,050 un poco separado y lo pego de nuevo con esto investiga garantizando que después de hacer una 811 01:17:38,050 --> 01:17:44,470 vuelta de éstas vuelve a sacarme el menú y vuelve a hacer la jugada de nuevo fijaros como por aquí 812 01:17:44,470 --> 01:17:47,949 estoy haciendo el next line para coger cada una de las opciones en cada una de las veces 813 01:17:47,949 --> 01:17:52,430 y lo he metido adentro aquí de list y de else para diferenciar el instance of 814 01:17:52,430 --> 01:18:00,949 de Alola o el otro. Igual, después de cada una de las vueltas 815 01:18:00,949 --> 01:18:05,329 estaría bien mostrar cómo vamos de energía y cómo vamos 816 01:18:05,329 --> 01:18:09,050 de vida utilizando el método 817 01:18:09,050 --> 01:18:12,510 que hemos hecho para esto que era el 818 01:18:12,510 --> 01:18:16,750 bueno, llamando al toString, en verdad, era donde habíamos puesto 819 01:18:16,750 --> 01:18:21,109 el nivel de energía y vida, pues entonces con hacer lo siguiente, 820 01:18:21,470 --> 01:18:26,909 aquí poner un system.out.println 821 01:18:26,909 --> 01:18:36,279 barra n, vamos a meter una línea más, más 822 01:18:36,279 --> 01:18:39,619 mi pic. 823 01:18:40,859 --> 01:18:44,340 Este, como ponemos el objeto de la clase, 824 01:18:44,680 --> 01:18:47,939 llamará al println que hemos sobrescrito aquí. 825 01:18:47,939 --> 01:18:53,779 Y bueno, vamos a ver, vamos a lanzar una ejecución a ver qué pasa. 826 01:18:53,779 --> 01:19:01,579 dime el tipo, si ponemos cualquiera se queda ahí en un bucle 827 01:19:01,579 --> 01:19:09,939 vamos a decir Alola, vale, bueno, he puesto aquí Alola 828 01:19:09,939 --> 01:19:12,920 y se me queja y esto es porque 829 01:19:12,920 --> 01:19:19,989 he puesto la A mayúscula creo y estoy comprobando con Alola y canto 830 01:19:19,989 --> 01:19:22,609 todo en minúsculas, entonces lo que tenemos que hacer aquí 831 01:19:22,609 --> 01:19:27,510 al leer, es decir este 832 01:19:27,510 --> 01:19:38,310 igual, vamos a meterlo en minúscula ya que es con lo que estamos 833 01:19:38,310 --> 01:19:41,810 comparando por aquí, ¿verdad? Y aquí hacemos la misma. 834 01:19:42,390 --> 01:19:44,890 También podríamos utilizar aquí el Equals Ignore Case. 835 01:19:45,390 --> 01:19:50,869 Después ejecuto por ahí. Ahora pongo aquí a Lola. 836 01:19:51,909 --> 01:19:53,970 Vale, ella sí que le gusta. Fijaros, la barra 837 01:19:53,970 --> 01:19:55,649 no es la que he puesto. 838 01:19:56,710 --> 01:19:58,510 ¿Veis? Barra T, pues es la otra barra. 839 01:19:59,210 --> 01:20:02,670 Ahora lo cambiamos. Entonces vamos a decir luchar. 840 01:20:06,500 --> 01:20:08,680 Dice, soy Rachu, mi nivel de energía es 4 841 01:20:08,680 --> 01:20:11,479 y mi nivel de vida es 5. Es decir, ha restado 1 luchando. 842 01:20:11,479 --> 01:20:14,020 Vamos a luchar de nuevo. Me dice que es 3 843 01:20:14,020 --> 01:20:19,859 y el nivel de vida es 1. Vamos a entrenar y me dice 844 01:20:19,859 --> 01:20:23,560 que el nivel de vida es 4, aumenta en 1, entrenamos de nuevo, nivel de vida 845 01:20:23,560 --> 01:20:27,939 5, nivel de energía 6, va aumentando el nivel de energía de 1 en 1 846 01:20:27,939 --> 01:20:32,000 en Alola. Vamos a bajar 847 01:20:32,000 --> 01:20:35,699 el nivel de energía hasta intentar convertirlo en negativo, fijaros como 848 01:20:35,699 --> 01:20:39,720 no cambia, ya si sigo luchando se mantiene todo el rato el nivel 849 01:20:39,720 --> 01:20:43,000 de energía 0 por la protección que habíamos puesto en el setter. 850 01:20:43,000 --> 01:20:45,220 entrenamos 851 01:20:45,220 --> 01:20:48,300 y empieza 852 01:20:48,300 --> 01:20:49,979 a subir, fijaros 853 01:20:49,979 --> 01:20:52,020 con cada vez que voy dándole a entrenar 854 01:20:52,020 --> 01:20:54,079 en la opción 2, 2, 2, me va aumentando 855 01:20:54,079 --> 01:20:56,279 de uno en uno, y en este caso 856 01:20:56,279 --> 01:20:58,100 que puede volar, pues le doy aquí 857 01:20:58,100 --> 01:21:02,159 a volar, al volar 858 01:21:02,159 --> 01:21:03,939 no recuerdo si era que decrementaba 859 01:21:03,939 --> 01:21:05,000 de uno en uno 860 01:21:05,000 --> 01:21:08,039 al volar, pues bueno, ahí lo sigue haciendo 861 01:21:08,039 --> 01:21:09,880 el nivel de energía decrementando 862 01:21:09,880 --> 01:21:11,939 di a la opción salir 863 01:21:11,939 --> 01:21:13,880 y bueno, y termina el programa 864 01:21:13,880 --> 01:21:17,060 voy a cambiar las barras T 865 01:21:17,060 --> 01:21:18,939 estas que lo he puesto mal en todas partes 866 01:21:18,939 --> 01:21:20,899 y ahora me la muestra 867 01:21:20,899 --> 01:21:22,859 como impreso porque no es la 868 01:21:22,859 --> 01:21:24,420 barra esta del 7 sino que es la 869 01:21:24,420 --> 01:21:26,699 que está en la esquina superior izquierda 870 01:21:26,699 --> 01:21:27,300 del teclado 871 01:21:27,300 --> 01:21:35,920 la que hay que poner por aquí 872 01:21:35,920 --> 01:21:37,920 barra T para que meta ULE 873 01:21:37,920 --> 01:21:49,989 otra barra T por ahí 874 01:21:49,989 --> 01:22:00,720 este barra N también para el otro lado 875 01:22:00,720 --> 01:22:02,819 por aquí volvemos 876 01:22:02,819 --> 01:22:04,180 a tener la misma jugada 877 01:22:04,180 --> 01:22:11,939 ahí está 878 01:22:11,939 --> 01:22:28,079 bien, pues ya cambiadas las barras estas 879 01:22:28,079 --> 01:22:29,340 vamos a hacer otra ejecución 880 01:22:29,340 --> 01:22:34,520 ahora metemos un erróneo, decimos que sea 881 01:22:34,520 --> 01:22:36,699 con combinaciones 882 01:22:36,699 --> 01:22:38,619 de mayúsculas y minúsculas 883 01:22:38,619 --> 01:22:40,140 canto, puesto canta 884 01:22:40,140 --> 01:22:46,300 dime el nivel, vamos a poner 885 01:22:46,300 --> 01:22:48,420 nivel 4 y nivel 3 886 01:22:48,420 --> 01:22:50,880 bueno, ahora queda un poquito 887 01:22:50,880 --> 01:22:53,020 ya pues como pretendíamos 888 01:22:53,020 --> 01:22:54,619 aquí hemos tabulado esto un poquito más 889 01:22:54,619 --> 01:22:56,500 la tabulación del barra T para luchar 890 01:22:56,500 --> 01:22:58,899 entrenar, fijaros como en canto 891 01:22:58,899 --> 01:23:00,880 no nos sale la opción de volar y salir 892 01:23:00,880 --> 01:23:03,340 se nos ha marcado como opción 3, vamos a luchar 893 01:23:03,340 --> 01:23:08,880 y ha decrementado en 2 el nivel de energía, habíamos indicado que fuera 894 01:23:08,880 --> 01:23:12,640 3 y lo ha decrementado en 2, cuanto iba de 2 en 2 al luchar 895 01:23:12,640 --> 01:23:16,699 y ahora el nivel de vida ya es 0, de 1 debe haber pasado 896 01:23:16,699 --> 01:23:20,159 menos 1 pero ya es 0, si entrenamos 897 01:23:20,159 --> 01:23:25,100 empieza a subir el nivel de energía, cada vez que entrenamos volvemos a luchar 898 01:23:25,100 --> 01:23:28,819 y me decrementa y ya está 899 01:23:28,819 --> 01:23:39,340 no tenemos opciones y aquí le damos a la opción 3 pues se nos acaba el programa y bueno poco más 900 01:23:39,340 --> 01:23:47,159 o menos esto era lo que nos pedía el ejercicio no es un poco mejorable ha quedado un poco feo 901 01:23:47,159 --> 01:23:51,779 el código la verdad muy largo por aquí el menú aparece dos veces vamos a poner un método menú 902 01:23:51,779 --> 01:24:41,560 public main en el método menú pretendemos meter no existen opción opción ahora hemos hecho aquí 903 01:24:41,560 --> 01:24:54,079 que lo lea aquí es donde lucha vamos a intentar meter todo esto en el menú entonces aquí tenemos 904 01:24:54,079 --> 01:25:16,529 que llamar a menú ahora nos compila por varios motivos vale entonces el menú aquí no me deja 905 01:25:16,529 --> 01:25:28,199 porque porque no devuelve algo es el primer motivo entonces para que devuelva tenemos que decir esto 906 01:25:28,199 --> 01:25:49,100 que devuelva un string y aquí al final que haga un return de esa opción. Me he pasado, tiene que 907 01:25:49,100 --> 01:26:05,090 estar aquí, este es el final del menú. Publiz, void no, aquí lo tenemos. El siguiente problema que 908 01:26:05,090 --> 01:26:10,130 tengo es que mi pic no lo reconoce por aquí y lo estoy utilizando entonces tendré que pasárselo 909 01:26:10,130 --> 01:26:12,329 como parámetro, entonces pongo aquí pikachu 910 01:26:12,329 --> 01:26:15,859 mi pic 911 01:26:15,859 --> 01:26:22,770 pikachu mi pic, por ahí ya va 912 01:26:22,770 --> 01:26:24,789 compilando, escáner tampoco 913 01:26:24,789 --> 01:26:26,789 lo tengo definido aquí a esta altura, bueno ahora 914 01:26:26,789 --> 01:26:35,270 se lo paso también, escáner 915 01:26:35,270 --> 01:26:35,949 mi scan 916 01:26:35,949 --> 01:26:39,310 entonces aquí en la llamada al menú 917 01:26:39,310 --> 01:26:44,649 voy a pasarle mi pic 918 01:26:44,649 --> 01:26:46,630 que tengo por aquí y el escáner 919 01:26:46,630 --> 01:26:50,729 vale, ahora se me sigue quejando 920 01:26:50,729 --> 01:26:51,869 ¿por qué? porque 921 01:26:51,869 --> 01:26:54,869 estoy llamándolo desde un sitio estático al menú 922 01:26:54,869 --> 01:26:56,670 que no lo es, entonces menú 923 01:26:56,670 --> 01:26:58,109 lo voy a definir public static 924 01:26:58,109 --> 01:27:02,989 en realidad no necesito un menú diferente para cada instancia de la clase 925 01:27:02,989 --> 01:27:09,609 ejecutar pokemon y ya parece que compila, otra cosa que no he hecho 926 01:27:09,609 --> 01:27:12,170 por ser puristas es que aquí al final 927 01:27:12,170 --> 01:27:18,619 el while, este es el main, lo que voy a hacer va a ser cerrar 928 01:27:18,619 --> 01:27:21,840 el flujo de datos, mi scan, por ahí 929 01:27:21,840 --> 01:27:26,859 y el método lo he llamado aquí, bien llamado por aquí 930 01:27:26,859 --> 01:27:31,020 pero aquí tengo otra vez toda la jugada del 931 01:27:31,020 --> 01:27:33,640 método, entonces lo voy a volver a llamar aquí 932 01:27:33,640 --> 01:27:38,979 voy a duplicar el nombre de la variable y ahora ya 933 01:27:38,979 --> 01:27:47,520 este bloque de nuevo lo puedo borrar, bueno me queda más limpio 934 01:27:47,520 --> 01:27:55,300 el código del main, fijaros, me queda más limpio 935 01:27:55,300 --> 01:27:59,220 luego tiene otra cosa buena que es que si tenemos que cambiar algo en el menú 936 01:27:59,220 --> 01:28:03,319 un solo cambio aquí ya queda aplicado en los dos sitios que antes 937 01:28:03,319 --> 01:28:07,159 lo teníamos en dos sitios en código y ahora bueno en verdad nos queda probar 938 01:28:07,159 --> 01:28:16,859 a ver si funciona. Alola, bueno, por ahí algo se me ha quedado un poquito feo, como 939 01:28:16,859 --> 01:28:25,310 podéis ver, pero bueno, ahora lo miramos. Entonces, digo 1 para luchar, bueno, parece 940 01:28:25,310 --> 01:28:30,590 que sigue decrementando por aquí el nivel de energía, voy a entrenar, 2, lo vuelvo 941 01:28:30,590 --> 01:28:35,850 a incrementar. Bueno, la otra funcionalidad, solamente hemos modificado la gestión del 942 01:28:35,850 --> 01:28:41,109 menú y parece que sigue funcionando bien. Se dio a 4 para salir, se me acaba el programa. 943 01:28:41,109 --> 01:28:48,380 y luego la gestión está bueno pues seguramente se podrá se podrá hacer de alguna otra forma un 944 01:28:48,380 --> 01:28:52,819 poquito más limpia pero bueno aquí sobre la marcha está la que ha salido para plantearlo y que en el 945 01:28:52,819 --> 01:29:00,079 menú no saliera el valor 3 y el valor 4 para lola y solamente el valor 3 para salir en el caso de 946 01:29:00,079 --> 01:29:07,699 de canto este simbolito vemos por aquí pues fijaros es esto que se me ha colado aquí por 947 01:29:07,699 --> 01:29:18,329 aquí el barra y bueno poco más de esto alguna preguntilla si os ocurre a la hora de resolver 948 01:29:18,329 --> 01:29:33,149 el ejercicio este nada vale pues vamos a ver un momentito el otro el otro de los ejercicios la 949 01:29:33,149 --> 01:29:40,409 otra tarea por lo menos la planteamos si no tenéis ninguna duda de esta y la dejamos hecha hasta 950 01:29:40,409 --> 01:29:44,390 donde sea y así ya el próximo día podemos dejarlo por concluido 951 01:29:44,390 --> 01:29:51,489 esto y pasar a lo siguiente. Esta es otra de excepciones 952 01:29:51,489 --> 01:30:03,960 de otro año, a ver, esta es, menos excepciones. 953 01:30:04,720 --> 01:30:08,060 Bueno, pues nada, aquí lo que pretendemos en la tarea del tema 954 01:30:08,060 --> 01:30:12,020 8 de excepciones es reproducir alguna de las excepciones 955 01:30:12,020 --> 01:30:15,439 más típicas que se nos dan en los programas que si no las tenemos 956 01:30:15,439 --> 01:30:19,779 capturadas pues nos pega un pete y se nos acaba y luego definir 957 01:30:19,779 --> 01:30:29,380 una excepción propia mediante la creación de una clase personalizada un poco lo que estuvimos en 958 01:30:29,380 --> 01:30:35,199 realidad viendo el otro día justo la la tutoría de la semana pasada vuelve a ser un poco volver 959 01:30:35,199 --> 01:30:41,859 a repasar lo mismo vamos a ver a dónde llega hasta dónde llegamos en estos 25 minutos o media hora 960 01:30:41,859 --> 01:31:19,420 que nos queda vamos a crear un nuevo proyecto de java java project excepción bueno por aquí 961 01:31:19,420 --> 01:31:23,140 el enunciado, bueno, pues nos va a pedir una clase donde haya 962 01:31:23,140 --> 01:31:27,199 básicamente necesitamos una clase donde hacer toda la gestión 963 01:31:27,199 --> 01:31:30,699 y luego una segunda clase que sea mi clase excepción 964 01:31:30,699 --> 01:31:35,079 para que herede de excepción y con la que poder trabajar. Y nos pide que 965 01:31:35,079 --> 01:31:42,619 estemos en un menú hasta que se pulse fin. Pues venga, vamos a decir aquí 966 01:31:42,619 --> 01:31:49,600 new class, clase menú. Vamos a poner aquí 967 01:31:49,600 --> 01:31:51,060 que incluya el main ya. 968 01:31:51,060 --> 01:32:02,279 lo he creado justo en la clase 969 01:32:02,279 --> 01:32:06,560 que teníamos de la semana pasada con las excepciones, esta es la nueva excepción 970 01:32:06,560 --> 01:32:09,619 excepciones es la de la teoría de la semana pasada, bueno vamos aquí 971 01:32:09,619 --> 01:32:19,739 clase menú con el main, pues ahí está 972 01:32:19,739 --> 01:32:28,409 como vamos a ir cogiendo por teclado, scanner, mi scan 973 01:32:28,409 --> 01:33:05,380 system.in, indica el tipo de excepción, fijaros 974 01:33:05,380 --> 01:33:09,380 si queremos ponerlo ahí todo en una línea que igual queda 975 01:33:09,380 --> 01:33:13,560 menos claro, pero bueno, podríamos ponerlo así, en una 976 01:33:13,560 --> 01:33:17,739 misma System of Println, barra n, una nueva línea, un tabulador 977 01:33:17,739 --> 01:33:20,720 y podemos poner aquí 978 01:33:20,720 --> 01:33:25,560 aritmética, es por lo que veo en la primera 979 01:33:25,560 --> 01:33:29,359 que teníamos por ahí, podríamos meter otra línea, barra n 980 01:33:29,359 --> 01:33:34,779 ya os digo que igual queda menos claro, pero bueno, por hacer una variante 981 01:33:34,779 --> 01:33:38,100 barra t, ponemos otro tabulador y aquí decimos 982 01:33:38,100 --> 01:33:40,460 puntero nulo 983 01:33:40,460 --> 01:33:43,420 barra n 984 01:33:43,420 --> 01:33:45,500 barra t 985 01:33:45,500 --> 01:33:50,279 formato 986 01:33:50,279 --> 01:33:53,310 barra n 987 01:33:53,310 --> 01:33:55,710 barra t 988 01:33:55,710 --> 01:33:57,250 array 989 01:33:57,250 --> 01:34:00,600 barra n 990 01:34:00,600 --> 01:34:02,640 barra t 991 01:34:02,640 --> 01:34:03,800 y aquí vamos a poner propia 992 01:34:03,800 --> 01:34:05,399 para la clase propia 993 01:34:05,399 --> 01:34:20,289 standout.print 994 01:34:20,289 --> 01:34:28,729 vamos a meter un barra n 995 01:34:28,729 --> 01:34:32,550 barra t, dos barras c, vamos a poner 996 01:34:32,550 --> 01:34:36,029 dos tabuladores, vamos a poner aquí opción 997 01:34:36,029 --> 01:34:49,500 lo que quiere esto, ahí está 998 01:34:49,500 --> 01:34:53,279 y ahora string s opción 999 01:34:53,279 --> 01:34:59,149 y scan punto next line 1000 01:34:59,149 --> 01:35:11,869 y ahora para manejar como antes vamos a hacer 1001 01:35:11,869 --> 01:35:16,350 un tupper case, un tupper lower case 1002 01:35:16,350 --> 01:35:20,930 vamos a hacer en este caso un uppercase y lo convertimos 1003 01:35:20,930 --> 01:35:24,949 todo a mayúsculas. Y ahora creamos aquí la estructura 1004 01:35:24,949 --> 01:35:28,609 y decimos si ese opción.equals, acordaros 1005 01:35:28,609 --> 01:35:32,710 como es un tipo referenciado lo hacemos con equals, no con igual 1006 01:35:32,710 --> 01:35:36,770 igual, porque si hacemos un igual igual intentaría 1007 01:35:36,770 --> 01:35:40,630 compararnos posiciones de memoria, no contenidos 1008 01:35:40,630 --> 01:35:44,649 del string. Entonces si decimos que si es equals 1009 01:35:44,649 --> 01:36:12,859 a aritmética, pues tendrá que hacer una cosa, el shift, puntero nulo, formato, perdonad que voy un poco 1010 01:36:12,859 --> 01:36:33,539 a toda pastilla con esta, pero esa vez si nos da tiempo a acabarlo, array y propia, bueno pues aquí 1011 01:36:33,539 --> 01:36:38,420 tenemos lo que vamos cogiendo en cada caso y aquí podemos hacer, como lo que queremos es capturar 1012 01:36:38,420 --> 01:36:40,239 esas excepciones, vamos a poner aquí un try 1013 01:36:40,239 --> 01:36:49,340 tabulo ahí 1014 01:36:49,340 --> 01:36:51,600 y un catch 1015 01:36:51,600 --> 01:36:56,760 vamos a poner una excepción 1016 01:36:56,760 --> 01:36:59,100 acordaros la estructura también 1017 01:36:59,100 --> 01:37:01,039 en árbol por herencia de las 1018 01:37:01,039 --> 01:37:02,859 excepciones, pues estaba excepción 1019 01:37:02,859 --> 01:37:04,840 excepción 1020 01:37:04,840 --> 01:37:07,060 que estaba en la parte alta 1021 01:37:07,060 --> 01:37:07,460 de 1022 01:37:07,460 --> 01:37:10,220 todo el 1023 01:37:10,220 --> 01:37:11,859 java class 1024 01:37:11,859 --> 01:37:20,159 que estaba en la parte alta 1025 01:37:20,159 --> 01:37:22,140 de toda la estructura de excepciones 1026 01:37:22,140 --> 01:37:23,899 y luego podríamos ir 1027 01:37:23,899 --> 01:37:28,060 mostrando cada una de ellas, capturando cada una de ellas 1028 01:37:28,060 --> 01:37:30,979 de forma separada. Vamos a hacer una primera captura en general 1029 01:37:30,979 --> 01:37:35,420 y vamos a poner un system of print lnd e 1030 01:37:35,420 --> 01:37:40,300 el objeto que se construye cuando se produce la excepción. 1031 01:37:41,460 --> 01:37:44,500 Entonces, bueno, pues para hacer, para provocar diferentes 1032 01:37:44,500 --> 01:37:48,159 tipos de excepciones, pues para provocar una aritmética 1033 01:37:48,159 --> 01:37:51,939 pues serviría con dividir por cero, hacer una división por cero. 1034 01:37:51,939 --> 01:38:13,279 Entonces si ponemos aquí intival igual a 10 dividido entre 0, esto no tiene mucho sentido ponerlo por código porque directamente provocamos una excepción, pero esto podría ser una variable construida a partir de un proceso de estar metiendo datos, resta multiplicaciones, lo que dije es el algoritmo, y que casualmente en unas ejecuciones fuese 0 y en otras no. 1035 01:38:13,279 --> 01:38:20,239 lógicamente este código así tal cual no tiene no tiene mucha lógica otra de las cosas que veíamos 1036 01:38:20,239 --> 01:38:24,979 con las excepciones es que donde en el momento que se producía una excepción el código que 1037 01:38:24,979 --> 01:38:34,479 estaba por debajo dejaba de ejecutarse entonces vamos a ponerlo aquí unos mensajes para garantizar 1038 01:38:34,479 --> 01:38:45,279 esto de la excepción la excepción se produce aquí con lo cual lo previsible es que esta 1039 01:38:45,279 --> 01:38:56,399 otra no se ejecute no suceda ya bueno esto para después lo hacemos metemos un while para hasta 1040 01:38:56,399 --> 01:39:00,920 que sea fina vamos a hacer una ejecuciones por separado para que nos dé tiempo a probar bien 1041 01:39:00,920 --> 01:39:07,680 las excepciones todo este bloque en realidad dice el enunciado que vaya que se realice hasta que la 1042 01:39:07,680 --> 01:39:15,100 opción metida sea fin aquí no lo he puesto en en el menú pero es lo que dice entonces tendríamos 1043 01:39:15,100 --> 01:39:18,939 poner un bucle y volver a repetir dentro del while esto, si nos da tiempo lo hacemos 1044 01:39:18,939 --> 01:39:23,039 vamos a hacer una ejecución para provocar una excepción 1045 01:39:23,039 --> 01:39:26,920 aritmética, por ejemplo división por cero 1046 01:39:26,920 --> 01:39:30,319 decimos aritmética 1047 01:39:30,319 --> 01:39:35,340 y efectivamente este System.out.println al mostrar 1048 01:39:35,340 --> 01:39:39,020 la E, el objeto se ha cargado en la zona de la excepción 1049 01:39:39,020 --> 01:39:42,859 con cierta información del contexto que teníamos en ese momento 1050 01:39:42,859 --> 01:39:53,520 y al mostrarlo ha llamado al println, en el println ha llamado al toString de este objeto de la clase excepción 1051 01:39:53,520 --> 01:39:59,300 que está sobrescrito de la clase object y muestra el tipo de excepción y el motivo por aquí. 1052 01:39:59,300 --> 01:40:05,539 Pues ahí lo tenéis. Como decíamos antes, el código venía por aquí, esta línea se ejecuta correctamente, 1053 01:40:05,640 --> 01:40:10,039 aquí se produce la excepción y fijaros como el después de la excepción ya no se muestra. 1054 01:40:10,039 --> 01:40:20,659 ¿Por qué? Porque en este momento de la excepción directamente del try pasa a capturarlo este catch, nos muestra esta información y este código ya no se vuelve a ejecutar nunca más. 1055 01:40:20,659 --> 01:40:26,489 Bueno, el puntero nulo, mira, si cogemos y definimos aquí 1056 01:40:26,489 --> 01:40:32,109 la otra clase y aprovechamos y definimos la que vamos a utilizar 1057 01:40:32,109 --> 01:40:37,810 como clase personalizada luego, vamos a decir mi clase, 1058 01:40:40,119 --> 01:40:45,859 ahí lo tenemos, y aquí en mi clase definimos cualquier atributo 1059 01:40:45,859 --> 01:40:50,119 o cualquier método, y val, vamos a poner aquí, esta mi clase 1060 01:40:50,119 --> 01:40:54,039 tendría un atributo y val en el contexto del enunciado del ejercicio 1061 01:40:54,039 --> 01:40:58,159 pues aquí cogemos y definimos, decimos mi clase 1062 01:40:58,159 --> 01:41:03,270 mi cla, pero no hacemos el new 1063 01:41:03,270 --> 01:41:07,149 pues resulta que eso es un puntero nulo, entonces si ponemos 1064 01:41:07,149 --> 01:41:10,550 mi cla punto 1065 01:41:10,550 --> 01:41:18,359 puesto mi cal punto y val 1066 01:41:18,359 --> 01:41:24,340 igual a cero, bueno se me queja porque es una variable local 1067 01:41:24,340 --> 01:41:27,840 no inicializada, como no vamos a hacer el new, lo vamos a poner a nulo. 1068 01:41:29,500 --> 01:41:32,500 Entonces esto, efectivamente esto es nulo, pues es el acceso 1069 01:41:32,500 --> 01:41:36,600 a un elemento de un puntero nulo, no le va a gustar. 1070 01:41:38,689 --> 01:41:41,810 Vamos a poner antes y después de la excepción también. 1071 01:41:45,529 --> 01:41:48,189 Ejecutamos. Y ahora nos vamos a ir 1072 01:41:48,189 --> 01:41:58,479 por la opción de puntero nulo. Puntero nulo, efectivamente, 1073 01:41:58,479 --> 01:42:02,560 pues nada, pasa exactamente igual que antes. Al producirse 1074 01:42:02,560 --> 01:42:06,279 el error aquí en este acceso al no haber hecho el new 1075 01:42:06,279 --> 01:42:10,800 y ser un puntero nulo, se nos viene aquí la excepción, nos muestra la información 1076 01:42:10,800 --> 01:42:14,979 del objeto que se cargó en el contexto de la ejecución 1077 01:42:14,979 --> 01:42:18,680 y se muestra el antes de excepción pero no el de después y aquí 1078 01:42:18,680 --> 01:42:26,010 tenemos el mensaje. Bueno, de formato, pues de formato 1079 01:42:26,010 --> 01:42:30,920 fijaros que por teclado ese val 1080 01:42:30,920 --> 01:42:40,279 resulta que ese val vale hola. Ya tenemos un 1081 01:42:40,279 --> 01:42:44,380 int y val y entendemos que lo vamos a cargar 1082 01:42:44,380 --> 01:42:48,279 desde un string que supuestamente en el contexto de la ejecución 1083 01:42:48,279 --> 01:42:50,300 normal tendría aquí un valor numérico 1084 01:42:50,300 --> 01:42:55,880 pues hacemos el pase int y le cargamos 1085 01:42:55,880 --> 01:42:59,460 para que convierta en un valor de entero y se lo podemos meter en esta variable 1086 01:42:59,460 --> 01:43:03,760 la información que tiene ese val como string que supuestamente debería ser 1087 01:43:03,760 --> 01:43:08,000 un valor numérico pero resulta que tenemos algo que no es un número 1088 01:43:08,000 --> 01:43:29,079 hola en este caso esta operación va a producir va a provocar un error de formato entonces ejecutamos 1089 01:43:29,079 --> 01:43:37,840 ponemos por aquí formato pero tenéis number forma de excepción esto nos pasa cuando con 1090 01:43:37,840 --> 01:43:42,659 escáner nos ha pasado a veces cuando con escáner hemos metido un dato que estaba mal intentando 1091 01:43:42,659 --> 01:43:47,340 carrera hacer un par saint a un valor entero con esta jugada que yo suelo hacer por aquí 1092 01:43:47,340 --> 01:43:53,159 bueno, que suelo hacer cuando quiero cargar un entero, no es el caso aquí 1093 01:43:53,159 --> 01:43:56,500 bueno, el del array también lo hemos hablado a veces 1094 01:43:56,500 --> 01:44:00,539 de hecho hasta ya este tema 1095 01:44:00,539 --> 01:44:02,979 nos pegaba en excepción en los programas 1096 01:44:02,979 --> 01:44:05,920 si se nos producían y ahora ya sabemos, tenemos capacidad 1097 01:44:05,920 --> 01:44:09,239 de poder capturar el error 1098 01:44:09,239 --> 01:44:12,300 estabilizar para que el programa tenga sentido 1099 01:44:12,300 --> 01:44:15,020 porque a lo mejor se han producido la ejecución 1100 01:44:15,020 --> 01:44:17,420 por encima de la excepción haciendo cosas 1101 01:44:17,420 --> 01:44:21,159 y para completar con sentido el programa hay que hacer cosas por debajo 1102 01:44:21,159 --> 01:44:24,960 que no se realizan, entonces en el catch lo lógico sería 1103 01:44:24,960 --> 01:44:28,739 estabilizar el programa para volver a dar sentido a los datos 1104 01:44:28,739 --> 01:44:32,899 después de que se hayan ejecutado unos y otros no y tener la posibilidad de 1105 01:44:32,899 --> 01:44:36,840 continuar ejecutando en lugar de que nos salga aquí un error de estos 1106 01:44:36,840 --> 01:44:42,279 irrecuperables. Pues nada, imaginaos que tenemos aquí un array 1107 01:44:42,279 --> 01:44:46,039 int, un array de enteros por ejemplo 1108 01:44:46,039 --> 01:44:53,340 y decimos que tengo un tamaño new int 1109 01:44:53,340 --> 01:44:57,460 fijaros que esto no es constructor, insisto que ponemos aquí 1110 01:44:57,460 --> 01:45:01,640 corchetes en lugar de paréntesis, esto es simplemente una forma de dimensionar 1111 01:45:01,640 --> 01:45:06,880 el array, y si ahora decimos aquí miar, lógicamente este 1112 01:45:06,880 --> 01:45:10,979 array con dimensión 3, pues las tres posiciones de enteros que tienen es 1113 01:45:10,979 --> 01:45:14,880 miar 0, miar 1 y miar 2, si cojo e intento 1114 01:45:14,880 --> 01:45:20,699 acceder a la posición 4, pues nada me va a dar un error 1115 01:45:20,699 --> 01:45:24,340 me va a provocar una excepción de 1116 01:45:24,340 --> 01:45:28,439 array bound de índice fuera de 1117 01:45:28,439 --> 01:45:33,550 alcance. Pulsamos por aquí, ponemos aquí array 1118 01:45:33,550 --> 01:45:37,710 array index out of bounds excepción. Ahí lo tenemos. 1119 01:45:39,189 --> 01:45:41,270 Y bueno, ya nos queda la propia. Para la propia 1120 01:45:41,270 --> 01:45:45,810 bueno, pues son situaciones como la que hablábamos en la 1121 01:45:45,810 --> 01:45:49,689 tutoría de la semana pasada. Son excepciones que no son 1122 01:45:49,689 --> 01:45:54,130 comunes a todos los programas, no es que un array se haya ido de índice 1123 01:45:54,130 --> 01:45:58,630 o que hayamos dividido entre cero, sino que son situaciones particulares de nuestro ejercicio. 1124 01:45:59,310 --> 01:46:01,930 Entonces, para nuestro contexto de nuestro enunciado, 1125 01:46:02,310 --> 01:46:05,770 una situación excepcional la podemos gestionar a través de una clase, en este caso 1126 01:46:05,770 --> 01:46:09,850 mi clase la hemos llamado. Fijaros como 1127 01:46:09,850 --> 01:46:14,010 cuando se producen las excepciones en líneas generales, deja ejecutarse 1128 01:46:14,010 --> 01:46:17,310 el try y se va a una zona de catch. Esta zona de catch 1129 01:46:17,310 --> 01:46:21,510 es decir, se lanza una excepción por ese problema 1130 01:46:21,510 --> 01:46:25,369 que se ha producido y se captura en el catch. Para que tenga la característica 1131 01:46:25,369 --> 01:46:29,449 de poder ser lanzadas, pues tiene que tener cierto código Java 1132 01:46:29,449 --> 01:46:33,550 que desconozco cuál es, pero que está muy bien programado en las clases 1133 01:46:33,550 --> 01:46:37,470 que tenemos en las librerías de excepciones. Para que mi clase 1134 01:46:37,470 --> 01:46:41,510 pueda ser lanzada, necesita esas características. Entonces, o bien las programo yo aquí 1135 01:46:41,510 --> 01:46:44,489 el interfaz throughable este 1136 01:46:44,489 --> 01:46:46,529 o puedo hacer que herede 1137 01:46:46,529 --> 01:46:48,569 lo más fácil, lo más típico 1138 01:46:48,569 --> 01:46:50,149 de la clase excepción. 1139 01:46:50,789 --> 01:46:51,810 La clase excepción 1140 01:46:51,810 --> 01:46:54,210 sí que 1141 01:46:54,210 --> 01:46:56,250 puede lanzar excepciones 1142 01:46:56,250 --> 01:47:00,100 excepción 1143 01:47:00,960 --> 01:47:02,140 sí que puede 1144 01:47:02,140 --> 01:47:04,060 lanzar excepciones, entonces si la hago que herede 1145 01:47:04,060 --> 01:47:06,159 de esta, mi clase tendrá todas las características 1146 01:47:06,159 --> 01:47:08,140 de excepción más lo que yo ponga aquí. 1147 01:47:10,750 --> 01:47:11,970 Sin enredarme mucho, porque 1148 01:47:11,970 --> 01:47:13,850 no tenemos mucho tiempo, para que 1149 01:47:13,850 --> 01:47:15,949 mi clase tenga información 1150 01:47:15,949 --> 01:47:19,750 del contexto donde se produce la excepción, ¿cómo puedo 1151 01:47:19,750 --> 01:47:23,689 hacérsela llegar? Pues fijaros, para lanzar las excepciones, lo que se hace 1152 01:47:23,689 --> 01:47:26,989 es utilizar la instrucción through 1153 01:47:26,989 --> 01:47:30,149 de lanzar. En este caso lo que vamos a lanzar 1154 01:47:30,149 --> 01:47:36,569 este through que estoy poniendo aquí, en estos casos 1155 01:47:36,569 --> 01:47:40,989 se produce de forma implícita, es decir, no lo tengo que poner yo aquí 1156 01:47:40,989 --> 01:47:44,569 en el código. Se está produciendo un through que es lanzar la excepción 1157 01:47:44,569 --> 01:47:48,930 para que deje el código del trayecto de ejecutarse y se capturen el catch. 1158 01:47:49,609 --> 01:47:55,390 Como en el caso particular de mi clase no se da una situación general 1159 01:47:55,390 --> 01:47:58,529 que ya esté considerada por Java para que se produzca un lanzamiento, 1160 01:47:58,909 --> 01:48:01,149 por código tengo que realizar yo ese lanzamiento. 1161 01:48:01,850 --> 01:48:06,210 Entonces, para realizar ese lanzamiento lo que hago es utilizar la instrucción through 1162 01:48:06,210 --> 01:48:11,630 y si os fijáis, como comentábamos la semana pasada, 1163 01:48:11,630 --> 01:48:15,770 los catch reciben un objeto del contexto en el que se produce 1164 01:48:15,770 --> 01:48:19,649 la ejecución, entonces ese objeto hay que crearlo, en este caso 1165 01:48:19,649 --> 01:48:23,869 lo lanzamos con el through y es lo que estamos haciendo aquí, estamos creando con el new 1166 01:48:23,869 --> 01:48:27,710 un objeto, en este caso de la clase mi clase 1167 01:48:27,710 --> 01:48:32,069 y llamo al constructor, fijaros como ya compila 1168 01:48:32,069 --> 01:48:36,010 entonces, aquí lanzaría la excepción 1169 01:48:36,010 --> 01:48:39,529 lo que hubiese por debajo, como en estos casos de este código 1170 01:48:39,529 --> 01:48:43,250 ya no se ejecuta, ¿por qué? porque se ha producido una excepción, fijaros como 1171 01:48:43,250 --> 01:48:47,550 directamente no me deja el compilador en este caso meter código ya por debajo porque se da cuenta 1172 01:48:47,550 --> 01:48:53,710 que tengo aquí una instrucción through, sería el catch que lo está capturando 1173 01:48:53,710 --> 01:48:57,350 y este objeto sería el que estamos lanzando aquí 1174 01:48:57,350 --> 01:49:00,750 que sería un objeto de la clase propia 1175 01:49:00,750 --> 01:49:07,699 ¿qué tendría este objeto de la clase propia? pues en este momento tendría un atributo 1176 01:49:07,699 --> 01:49:11,420 int y val y todo aquello que tenga heredado de la clase 1177 01:49:11,420 --> 01:49:16,979 excepción. En este contexto, ¿qué es lo que me interesa? Pues conocer cierta 1178 01:49:16,979 --> 01:49:21,079 información del momento en el que se produce la excepción para poder 1179 01:49:21,079 --> 01:49:25,060 tratarla yo aquí en el catch. ¿Cómo le puede pasar 1180 01:49:25,060 --> 01:49:28,720 información? Pues el mejor momento, el sitio donde yo 1181 01:49:28,720 --> 01:49:32,739 tengo código en el cual puedo meter cosas en el momento que hago el 1182 01:49:32,739 --> 01:49:36,619 through para luego ponerlo aquí disponible, fijaros, es a través de 1183 01:49:36,619 --> 01:49:40,960 lanzar el constructor. Entonces aquí estoy lanzando 1184 01:49:40,960 --> 01:49:45,079 el constructor, ¿dónde se ejecuta el constructor de mi clase? 1185 01:49:45,300 --> 01:49:50,250 Pues aquí. Entonces, imaginaos que lo que me interesa es un IVAL, 1186 01:49:50,409 --> 01:49:53,609 el enunciado dice un valor aleatorio o algo de esto, 1187 01:49:54,689 --> 01:49:56,670 pues aquí pondría public 1188 01:49:56,670 --> 01:50:03,300 mi clase, aquí implemento yo, 1189 01:50:04,119 --> 01:50:07,159 IVAL, vamos a poner ale de aleatorio, 1190 01:50:07,159 --> 01:50:12,560 y el valor del contexto donde se produce la excepción, que lo recibo 1191 01:50:12,560 --> 01:50:16,279 aquí en el constructor, me interesa guardarlo en la clase para que pueda 1192 01:50:16,279 --> 01:50:20,600 ser utilizado por otros métodos. ¿Dónde defino los atributos 1193 01:50:20,600 --> 01:50:24,659 de la clase? Por aquí. ¿Estos atributos están disponibles 1194 01:50:24,659 --> 01:50:28,380 en qué ámbito? En el de la clase. Fijaros la llave. Si yo ahora pongo aquí 1195 01:50:28,380 --> 01:50:32,199 más métodos que están dentro de esas llaves, pues estos serán variables 1196 01:50:32,199 --> 01:50:36,619 accesibles desde esos métodos. ¿Este método en qué momento 1197 01:50:36,619 --> 01:50:39,979 lo estoy llamando? En el momento justo en el que se está produciendo la excepción. 1198 01:50:39,979 --> 01:50:48,800 Si tengo aquí cierta información que se la paso por aquí y la guardo en un atributo de clase, lo tendré disponible para manejar esa excepción por aquí. 1199 01:50:49,899 --> 01:50:58,060 Si pongo aquí int ival, pues aquí podría decir que ival ale sea igual a ival. 1200 01:51:01,180 --> 01:51:09,260 Lo que recibo del contexto de la ejecución en el constructor a través de un parámetro del método constructor me lo guardo en un atributo de clase. 1201 01:51:09,260 --> 01:51:17,359 y ahora aquí puedo tener otros métodos pues por ejemplo puedo sobreescribir y le voy a poner 1202 01:51:17,359 --> 01:51:43,439 overwrite, así, overwrite, overwrite, overwrite, no me acuerdo cómo se ponía esto, no le voy a poner 1203 01:51:43,439 --> 01:51:47,180 overwrite, luego si me acuerdo se lo pongo, public 1204 01:51:47,180 --> 01:51:50,819 string, toString 1205 01:51:50,819 --> 01:51:56,909 me aseguro de que lo pongo bien, aunque no ponga el overwrite, y ahora 1206 01:51:56,909 --> 01:52:00,590 pongo aquí un return, el valor 1207 01:52:00,590 --> 01:52:06,279 recibido es, y val, ale 1208 01:52:06,279 --> 01:52:11,250 sobreescribimos el método toString de esta forma 1209 01:52:11,250 --> 01:52:16,090 tiene que durar un return, y este método sobre screen, el método 1210 01:52:16,090 --> 01:52:25,310 tu screen sobre escrito será el que se utilice en el system out println este ya no me compila 1211 01:52:25,310 --> 01:52:30,689 porque porque he creado un constructor que recibe un parámetro con lo cual el de por defecto deja 1212 01:52:30,689 --> 01:52:38,630 de estar activo y aquí ahora necesitamos un constructor que al que le pasemos un valor 1213 01:52:38,630 --> 01:52:45,619 numérico les ponemos aquí un 3 vamos a poner y vamos a hacer una ejecución fijaros que cuando 1214 01:52:45,619 --> 01:52:52,779 se produce esta excepción es una captura general de todo esto y lo que estamos haciendo un sistema 1215 01:52:52,779 --> 01:52:56,859 println de, recordad este objeto es el que estamos haciendo aquí con el new 1216 01:52:56,859 --> 01:53:00,579 y como esto hemos puesto el nombre del objeto, llamará 1217 01:53:00,579 --> 01:53:04,579 al toString y el toString está devolviendo 1218 01:53:04,579 --> 01:53:08,760 el valor recibido es igual, es atributo de clase que hemos 1219 01:53:08,760 --> 01:53:11,960 cargado con la información que hemos recibido en el constructor 1220 01:53:11,960 --> 01:53:22,640 no me compila esto por aquí en algún sitio, vale, no me compila 1221 01:53:22,640 --> 01:53:26,640 por aquí porque he cambiado el nombre a esta 1222 01:53:26,640 --> 01:53:35,689 variable, ya estamos ahí, entonces si pongo aquí propia 1223 01:53:35,689 --> 01:53:39,029 pues fijaros, me dice el valor recibido es 3 1224 01:53:39,029 --> 01:53:44,050 este 3 lo he puesto aquí a piñón fijo y en el ejercicio 1225 01:53:44,050 --> 01:53:47,789 nos decía que hiciéramos un número aleatorio de 1226 01:53:47,789 --> 01:53:51,729 entre 0 y 10 me parece que era, bueno pues lo podríamos 1227 01:53:51,729 --> 01:53:55,750 hacer o bien con mat o con la clase mat o con la clase random 1228 01:53:55,750 --> 01:53:59,550 podemos coger valores aleatorios, bueno esto 1229 01:53:59,550 --> 01:54:05,529 echarle un ojillo a la solución que os he dejado resuelta que sería lo que nos faltaría un poco 1230 01:54:05,529 --> 01:54:13,250 para completar el ejercicio e insisto que he ido un poco a toda pastilla con este para conseguir 1231 01:54:13,250 --> 01:54:21,220 que nos diera tiempo en los 25 minutos que nos quedaban y más o menos ahí estamos. ¿Alguna 1232 01:54:21,220 --> 01:54:28,060 dudilla tenéis por ahí? ¿Alguna cosa que queréis consultar o preguntar de este otro ejercicio o del 1233 01:54:28,060 --> 01:54:35,310 primero, no, bueno pues 1234 01:54:35,310 --> 01:54:36,210 si no tenéis nada 1235 01:54:36,210 --> 01:54:39,210 vamos a ir cerrando ya hoy por aquí 1236 01:54:39,210 --> 01:54:41,229 ya la semana que viene nos vamos al tema 1237 01:54:41,229 --> 01:54:45,310 9, voy parando la grabación