1 00:00:00,500 --> 00:00:10,679 Voy a grabar esta clase, por lo tanto, si habláis, me dais el permiso de grabar vuestra voz y que se grabará en esta grabación. He dicho grabación 20 veces. 2 00:00:11,320 --> 00:00:28,239 Vale, entonces, después de haber visto los conceptos de objeto y de clase y la diferencia que hay, que repasamos muy rápidamente, la clase es como una idealización, una generalización, una abstracción de un concepto que estoy modelizando. 3 00:00:28,239 --> 00:00:38,520 Y luego a partir de esta abstracción puedo crear instancias concretas, réplicas de este molde que he creado, creando objetos. 4 00:00:38,820 --> 00:00:43,960 Entonces la clase Persona me dirá que todas las personas tendrán un nombre, un apellido y un DNI. 5 00:00:44,420 --> 00:00:51,820 Y luego tendré un objeto concreto que tiene un determinado valor en nombre, un determinado valor en apellido, un determinado valor en DNI. 6 00:00:51,820 --> 00:00:58,240 Y podré hacer cuantos objetos me da la gana a partir de este molde general que es la clase 7 00:00:58,240 --> 00:01:05,260 Vamos a ver algunos conceptos un poquito más avanzados de la programación orientada a objetos 8 00:01:05,260 --> 00:01:14,799 ¿Qué son estos conceptos? Son herramientas, son opciones, son posibilidades que me proporciona la programación orientada a objetos 9 00:01:14,799 --> 00:01:25,340 para que pueda lograr aprovechar mi código de una forma mejor, digamos así. 10 00:01:26,500 --> 00:01:29,680 ¿Es obligatorio utilizarlas? No, ¿vale? 11 00:01:30,280 --> 00:01:33,400 Según qué proyecto hacemos, todos los proyectos que hemos hecho hasta ahora, 12 00:01:33,500 --> 00:01:36,980 todos los ejercicios que hemos hecho ahora, pues no necesitan de estas cosas 13 00:01:36,980 --> 00:01:39,000 porque son proyectos muy, muy sencillos. 14 00:01:39,000 --> 00:01:59,739 Pero nosotros tenemos que, con ejemplos sencillos, aprender a utilizar estas herramientas porque luego en proyectos más complejos o en varios proyectos, en una empresa que desarrolla muchos proyectos, etc., pues estas herramientas nos proporcionan grandes ventajas como principalmente reuso de código. 15 00:01:59,739 --> 00:02:18,860 La idea de que cada vez que empezamos un nuevo proyecto tengamos que reinventar los mismos conceptos o remodelizar conceptos que ya hemos utilizado en otros proyectos no es una cosa positiva. 16 00:02:18,860 --> 00:02:37,400 A veces es necesario, a veces yo me doy cuenta de proyectos anteriores que, como había modelizado la persona, pues no es eficiente porque me provoca varios problemas, pues entonces rehago el concepto de personas de cero aprovechando del conocimiento que he ganado en los proyectos anteriores. 17 00:02:37,400 --> 00:02:56,159 Pero no siempre es así. Muchas veces una empresa que se dedica a un determinado aspecto, entonces es experta en un determinado problema, en un determinado contexto, pues ya ha creado su conjunto de clases que se reutilizan en proyectos distintos y quiere reutilizar lo que antes había. 18 00:02:56,159 --> 00:03:07,680 Sin embargo, muchas veces reutilizar cosas anteriores puede que no sea posible al 100%, que a lo mejor el nuevo proyecto tiene que añadir algo, quitar algo o modificar algo. 19 00:03:08,300 --> 00:03:19,879 Y entonces existen estas técnicas para que esto sea más fácil y sea más interesante, sea más productivo para las empresas. 20 00:03:19,879 --> 00:03:24,080 el primer mecanismo que vamos a ver es el mecanismo de herencia 21 00:03:24,080 --> 00:03:27,000 un poquito la herencia, ya lo hemos visto 22 00:03:27,000 --> 00:03:31,080 porque cuando en episodios anteriores de programación 23 00:03:31,080 --> 00:03:34,659 hemos visto el concepto que existe una clase objeto 24 00:03:34,659 --> 00:03:38,360 y que todas las clases que habéis creado vosotros son objetos 25 00:03:38,360 --> 00:03:41,819 y que tienen los mismos métodos de la clase object 26 00:03:41,819 --> 00:03:47,360 pues en realidad allí eso es la esencia de la herencia 27 00:03:47,360 --> 00:03:53,219 Lo que hemos dicho las otras veces es que vuestros objetos se heredan de object 28 00:03:53,219 --> 00:03:58,560 Pero vamos a formalizar un poquito más este concepto 29 00:03:58,560 --> 00:04:01,620 Mirando aquí que nos dice la transparencia 30 00:04:01,620 --> 00:04:05,240 Es un mecanismo para la reutilización del software 31 00:04:05,240 --> 00:04:14,419 Permite definir a partir de una clase otras clases que reutilicen todo o parte de los atributos o métodos de la clase que heredan 32 00:04:14,419 --> 00:04:16,639 Ejemplo, yo hago una persona 33 00:04:16,639 --> 00:04:19,600 Esta persona tiene un nombre y una edad 34 00:04:19,600 --> 00:04:22,860 A partir de este concepto de persona 35 00:04:22,860 --> 00:04:25,420 Yo podría crear dos clases nuevas 36 00:04:25,420 --> 00:04:28,019 Una que es profesor y una que es estudiante 37 00:04:28,019 --> 00:04:30,600 Ahora, tanto profesor como estudiante 38 00:04:30,600 --> 00:04:33,519 Comparten un nombre y una edad 39 00:04:33,519 --> 00:04:36,759 Porque tanto profesor como estudiante son personas 40 00:04:36,759 --> 00:04:39,480 Entonces la idea es que yo 41 00:04:39,480 --> 00:04:41,800 En vez de crearme una nueva clase entera 42 00:04:41,800 --> 00:04:44,759 Donde le diría, el estudiante tiene string nombre 43 00:04:44,759 --> 00:04:46,160 El estudiante tiene int edad 44 00:04:46,160 --> 00:04:52,480 más, por ejemplo, aquí tiene un array de int de sus notas, pues lo que voy a hacer es que le voy a decir, 45 00:04:52,579 --> 00:05:00,100 mira, el estudiante es una persona, el estudiante hereda de persona, importa en un cierto sentido, 46 00:05:00,220 --> 00:05:05,060 hasta si importar es un término feo porque existe import, que es un poquito distinto, 47 00:05:05,060 --> 00:05:15,459 pero recibe desde persona todo lo que persona tiene y a partir de allí puede hacer cosas, 48 00:05:15,459 --> 00:05:19,279 Puedo añadir nuevas características 49 00:05:19,279 --> 00:05:23,920 Por ejemplo, puedo decir que una persona no tiene un grupo 50 00:05:23,920 --> 00:05:26,279 Pero un estudiante sí que pertenece a un grupo 51 00:05:26,279 --> 00:05:28,000 Vosotros perteneces a uno 52 00:05:28,000 --> 00:05:32,560 Entonces podría ser que al estudiante le ponga string grupo 53 00:05:32,560 --> 00:05:35,920 Pero seguramente el estudiante es una persona 54 00:05:35,920 --> 00:05:37,480 Por lo tanto tendrá nombre y edad 55 00:05:37,480 --> 00:05:40,480 Y además su grupo y además sus notas 56 00:05:40,480 --> 00:05:42,500 Ahora, también el profesor es una persona 57 00:05:42,500 --> 00:05:45,220 Entonces también el profesor tendrá nombre y edad 58 00:05:45,220 --> 00:05:55,600 Pero además tiene un array de string que es las asignaturas que imparte. Por ejemplo, o podría tener un array de asignaturas siendo asignatura otra clase. 59 00:05:55,600 --> 00:06:00,819 esto lo está haciendo como ejemplo muy básico 60 00:06:00,819 --> 00:06:03,680 solo con atributos 61 00:06:03,680 --> 00:06:07,000 pero cuando se hereda, se heredan también los métodos 62 00:06:07,000 --> 00:06:09,860 entonces si la persona tenía un método saludar 63 00:06:09,860 --> 00:06:12,060 que decía hola soy y su nombre 64 00:06:12,060 --> 00:06:15,560 pues ahora también los profesores y los estudiantes 65 00:06:15,560 --> 00:06:17,319 tienen ese método 66 00:06:17,319 --> 00:06:22,740 si una clase A hereda de una clase B 67 00:06:22,740 --> 00:06:26,600 Quiere decir que la clase A puede hacer todo lo que hace una clase B 68 00:06:26,600 --> 00:06:28,800 Y posiblemente más 69 00:06:28,800 --> 00:06:31,800 O, y lo veremos un poquito más adelante 70 00:06:31,800 --> 00:06:34,139 Puede hacer lo mismo de la clase B 71 00:06:34,139 --> 00:06:35,860 Pero de forma distinta 72 00:06:35,860 --> 00:06:37,939 ¿Vale? 73 00:06:38,120 --> 00:06:39,279 Ejemplo de esto lo hemos hecho 74 00:06:39,279 --> 00:06:40,199 ¿Os acordáis del equals? 75 00:06:40,540 --> 00:06:43,879 Que perdimos un buen rato el viernes mirando ese ejemplo 76 00:06:43,879 --> 00:06:46,500 Pues cuando yo he creado mi clase que era tarea 77 00:06:46,500 --> 00:06:52,000 Y que heredaba el método equals desde object 78 00:06:52,000 --> 00:06:54,339 Y lo hemos probado antes sin hacer nada 79 00:06:54,339 --> 00:06:56,399 Y hemos utilizado el mismo método de object 80 00:06:56,399 --> 00:06:59,060 Y luego hemos creado un equals dentro de tarea 81 00:06:59,060 --> 00:07:01,699 Y hemos creado que hace lo mismo 82 00:07:01,699 --> 00:07:03,540 Porque puede utilizar el método equals 83 00:07:03,540 --> 00:07:05,459 Pero lo hace de una forma distinta 84 00:07:05,459 --> 00:07:07,779 Ahora en vez de equipararse como hace object 85 00:07:07,779 --> 00:07:09,000 Se equiparaba de otra forma 86 00:07:09,000 --> 00:07:11,720 Entonces más o menos estas ideas 87 00:07:11,720 --> 00:07:13,300 Ya las hemos trabajado 88 00:07:13,300 --> 00:07:15,420 Para que hoy cuando la veáis 89 00:07:15,420 --> 00:07:16,459 La formalicemos 90 00:07:16,459 --> 00:07:20,459 Pero no suenen como es la primera vez que lo escucho 91 00:07:20,459 --> 00:07:42,620 Vale, cuando hablamos de herencia podemos aplicarla, podemos utilizarla o nos sale a la mente y nos viene útil en dos posibles contextos. Uno es especializando y uno es generalizando. 92 00:07:42,620 --> 00:07:52,779 ¿Qué quiere decir? Por ejemplo, un ejemplo de especialización es cuando uso la clase coche especificándola, especializándola desde vehículo. 93 00:07:53,120 --> 00:08:00,680 Imaginaos que yo ya tengo la clase vehículo, que es una cosa genérica, y yo digo, vale, a partir de vehículo creo coche. 94 00:08:01,439 --> 00:08:05,959 Entonces, coche es un vehículo. Entonces, coche herederá de vehículo. 95 00:08:05,959 --> 00:08:24,160 Todo lo que puede hacer un vehículo lo puede hacer un coche, pero el coche tendrá algunas características extra más específicas para el coche mismo, ¿vale? Por ejemplo, el tipo de ruedas, que por ejemplo un vehículo como un barco no tiene tipos de ruedas, ¿sí? Y cosas por el estilo. 96 00:08:24,160 --> 00:08:38,120 Esto sería parecido a lo que hemos hecho aquí. Persona es genérico y luego lo que he hecho es especializarlo en un profesor, que es una persona con algo más, más específica, y estudiante, que es otra persona, pero más específica de otra forma. 97 00:08:39,259 --> 00:08:53,120 Entonces, el escenario en el que utilizamos la especialización es que tenemos que desarrollar una nueva clase que se parece mucho a una que ya tenemos, pero que necesita información como características o comportamientos adicionales. 98 00:08:54,159 --> 00:09:10,139 ¿Sí? Tengo un vehículo, este ya está existente, tengo que crear coche, que es algo más específico que vehículo, pero mucha parte, por ejemplo, moverse, por ejemplo, parar, por ejemplo, acelerar, pues son todas cosas que puede hacer un vehículo y, por lo tanto, lo reutilizaría en coche. 99 00:09:10,679 --> 00:09:10,879 ¿Sí? 100 00:09:11,740 --> 00:09:22,360 La solución de este escenario con especialización es que creo una subclase, ¿vale? Esta nomenclatura se puede llamar subclase, se puede llamar clase hija, se puede llamar clase derivada, ¿vale? 101 00:09:22,360 --> 00:09:31,259 que es una clase nueva a la que heredamos todo lo que está antes, pillamos todo el código 102 00:09:31,259 --> 00:09:36,440 como si copiáramos todo el código que estaba en vehículo, en la clase superior digamos 103 00:09:36,440 --> 00:09:43,679 lo copio sin tener que copiarlo en esta subclase y luego me pongo a añadir y a modificar 104 00:09:43,679 --> 00:09:49,179 las cosas puntuales que quiero modificar para este nuevo elemento concreto 105 00:09:49,179 --> 00:09:54,620 El segundo caso es en caso de generalización 106 00:09:54,620 --> 00:09:59,000 O sea, crear la clase vehículo como generalización de coche 107 00:09:59,000 --> 00:10:00,279 ¿Qué quiere decir esto? 108 00:10:00,539 --> 00:10:05,179 El escenario es, imaginaos que yo tengo un conjunto de varias clases 109 00:10:05,179 --> 00:10:07,000 Que en mi proyecto han surgido 110 00:10:07,000 --> 00:10:09,740 Y antes estaba haciendo una parte, he creado varias clases 111 00:10:09,740 --> 00:10:12,399 Luego he hecho otra parte, he pensado una escuela 112 00:10:12,399 --> 00:10:15,139 Y he creado alumno para gestionar alumno 113 00:10:15,139 --> 00:10:17,379 Luego he creado profesor para generar profesor 114 00:10:17,379 --> 00:10:22,639 luego he creado, no sé, secretario para poner la parte de secretaría que está ahí, 115 00:10:23,000 --> 00:10:28,179 y me he dado cuenta que todas estas clases que estoy creando comparten una parte. 116 00:10:28,799 --> 00:10:33,460 O sea, en todas estas, en alumno, en profesor, en secretario, 117 00:10:33,580 --> 00:10:40,519 todas tienen nombre, apellido, DNI y que pueden hacer operación de ejecutar su trabajo. 118 00:10:40,879 --> 00:10:41,240 No lo sé. 119 00:10:42,139 --> 00:10:45,940 Como me doy cuenta que todas estas clases comparten una parte, 120 00:10:45,940 --> 00:10:49,500 yo puedo sacar esa parte 121 00:10:49,500 --> 00:10:51,600 ponerla en una nueva clase 122 00:10:51,600 --> 00:10:53,559 que sería una clase más general 123 00:10:53,559 --> 00:10:55,960 que esta de aquí, como por ejemplo la clase persona 124 00:10:55,960 --> 00:10:59,200 y a ese punto hacer que toda esta parte 125 00:10:59,200 --> 00:11:03,639 que antes se replicaba en cada una de las clases 126 00:11:03,639 --> 00:11:06,240 ahora está bonita, empaquetada 127 00:11:06,240 --> 00:11:09,259 organizada en una única clase 128 00:11:09,259 --> 00:11:11,500 de las que las otras heredan 129 00:11:11,500 --> 00:11:14,679 es decir, es ver esto pero al revés 130 00:11:14,679 --> 00:11:21,720 Es ver esto que en vez de decir yo había creado persona y ahora las especializo en profesor y estudiante 131 00:11:21,720 --> 00:11:24,720 Yo tenía un proyecto en que tenía profesor y estudiante 132 00:11:24,720 --> 00:11:28,240 Y me doy cuenta que tanto profesor como estudiante tienen nombre y edad 133 00:11:28,240 --> 00:11:36,240 Y por lo tanto lo que hago es crearme una clase persona de la que luego profesor y estudiante heredarán 134 00:11:36,960 --> 00:11:37,899 ¿Por qué esto es útil? 135 00:11:38,399 --> 00:11:42,600 Porque si yo tengo un método, el ejecutar mi profesión 136 00:11:42,600 --> 00:11:58,080 Que está tanto en alumno como en profesor y que hace lo mismo en todas. Y ahora de repente me doy cuenta que hay un error, que quiero que haga una cosa distinta, etc. Debería entrar en todas las clases y modificarlo. 137 00:11:58,080 --> 00:12:07,179 Sin embargo, si yo he podido extraer estos datos, meterlos en una única clase, superclase 138 00:12:07,179 --> 00:12:11,000 En una clase padre, en una clase superior 139 00:12:11,000 --> 00:12:15,659 Y este método está allí, cuando yo modifique este método 140 00:12:15,659 --> 00:12:20,059 En automático lo estoy modificando para todas las clases que heredan de esta clase superior 141 00:12:20,059 --> 00:12:21,220 ¿Se entiende? 142 00:12:22,779 --> 00:12:25,039 Entonces, el mecanismo de herencia es único 143 00:12:25,039 --> 00:12:35,740 Es eso, yo puedo pillar una clase y decir que otra clase hereda de esta aquí, ¿vale? Entonces estaría como copiando esta clase aquí y luego añadiendo cosas o modificando cosas. 144 00:12:36,659 --> 00:12:51,740 Sin embargo, cuando se utiliza, la forma de pensar a cuando voy a utilizar la herencia tiene estos dos casos. Tiene el caso de tengo una cosa general y la quiero especializar en cosas con información adicional o al revés, generalización. 145 00:12:51,740 --> 00:13:02,240 Tengo muchas clases que coinciden en algunas partes, entonces la parte que coincide en todas, pues la extraigo, la pongo en una clase superior y luego hago que todas las demás hereden de esta. 146 00:13:02,320 --> 00:13:14,379 De esta forma, en vez de duplicar código en muchas clases, tengo un único sitio donde estoy poniendo este código compartido, digamos, entre las otras clases. 147 00:13:14,379 --> 00:13:16,679 Cuando 148 00:13:16,679 --> 00:13:18,440 Hago así, o sea, la clase 149 00:13:18,440 --> 00:13:20,500 Superior, digamos, se puede llamar 150 00:13:20,500 --> 00:13:22,759 Superclase, clase padre o clase 151 00:13:22,759 --> 00:13:24,799 Base, ¿vale? Según la nomenclatura 152 00:13:24,799 --> 00:13:26,759 Que utilicéis y como queráis 153 00:13:26,759 --> 00:13:27,539 Llamarla, ¿vale? 154 00:13:29,279 --> 00:13:30,940 Movemos el código que se repite 155 00:13:30,940 --> 00:13:33,000 A un único sitio, a una superclase 156 00:13:33,000 --> 00:13:34,799 Y luego las otras clases tiran de allí 157 00:13:34,799 --> 00:13:36,840 Si hago una modificación a este código repetido 158 00:13:36,840 --> 00:13:38,919 Automáticamente es como si lo estuviera 159 00:13:38,919 --> 00:13:40,980 Modificando 160 00:13:40,980 --> 00:13:42,820 En todas las clases 161 00:13:42,820 --> 00:13:44,539 que heredan desde allí 162 00:13:44,539 --> 00:13:47,100 ¿vale? entonces, esto es un ejemplo 163 00:13:47,100 --> 00:13:48,840 no hago zoom porque si no 164 00:13:48,840 --> 00:13:50,740 se estropea la grabación 165 00:13:50,740 --> 00:13:52,740 ¿vale? pero os lo leo 166 00:13:52,740 --> 00:13:53,840 más o menos, aquí tengo 167 00:13:53,840 --> 00:13:56,960 una clase recurso, que representa 168 00:13:56,960 --> 00:13:58,860 un recurso general, que tiene nombre 169 00:13:58,860 --> 00:14:00,720 descripción, decir nombre, decir 170 00:14:00,720 --> 00:14:02,840 descripción, ¿vale? un get nombre 171 00:14:02,840 --> 00:14:03,919 un get descripción 172 00:14:03,919 --> 00:14:06,799 y luego tengo como recurso un aula 173 00:14:06,799 --> 00:14:08,820 o un ordenador, ¿vale? y me doy 174 00:14:08,820 --> 00:14:11,059 cuenta que un aula tiene nombre, descripción 175 00:14:11,059 --> 00:14:12,679 decir nombre, decir descripción, pero 176 00:14:12,679 --> 00:14:18,200 además tiene localización y tiene decir localización mientras que un ordenador la 177 00:14:18,200 --> 00:14:22,519 localización no me interesaba y tenía sistema operativo es decir sistema operativo pero me 178 00:14:22,519 --> 00:14:30,240 doy cuenta que toda la parte azul es como una de estas tres clases de hecho está recurso podría 179 00:14:30,240 --> 00:14:35,639 ser visto como una generalización de aula ordenador y no sé qué más cosa impresora y 180 00:14:35,639 --> 00:14:39,360 y espacio y que se yo 181 00:14:39,360 --> 00:14:44,299 proyector, que se yo, todos tienen que tener un nombre 182 00:14:44,299 --> 00:14:48,080 en la descripción y sus métodos para llamar ese nombre a esa descripción, entonces que hago 183 00:14:48,080 --> 00:14:52,159 pues pillo recurso, lo dejo con estos 184 00:14:52,159 --> 00:14:55,879 datos que son los datos que todos los recursos tienen que tener 185 00:14:55,879 --> 00:15:00,340 y lo hago como una super clase de la que aula y ordenador 186 00:15:00,340 --> 00:15:04,120 heredan, a este punto en aula y ordenador no tengo 187 00:15:04,120 --> 00:15:06,519 que volver a reescribir esta información 188 00:15:06,519 --> 00:15:07,940 más solo añado 189 00:15:07,940 --> 00:15:10,220 las dos informaciones 190 00:15:10,220 --> 00:15:12,240 propias y específicas 191 00:15:12,240 --> 00:15:13,179 de aula de ordenador 192 00:15:13,179 --> 00:15:16,100 si lo veo como antes tenía 193 00:15:16,100 --> 00:15:18,279 estos y a partir de esto 194 00:15:18,279 --> 00:15:20,139 me he creado recursos y ahora 195 00:15:20,139 --> 00:15:22,419 hago que hereda, estaría haciendo una generalización 196 00:15:22,419 --> 00:15:24,159 si lo veo como no 197 00:15:24,159 --> 00:15:26,179 tenía un recurso y luego a partir 198 00:15:26,179 --> 00:15:27,960 de allí voy creando 199 00:15:27,960 --> 00:15:30,159 mis varios recursos concretos 200 00:15:30,159 --> 00:15:32,159 como aula, ordenador, proyector y que se yo 201 00:15:32,159 --> 00:15:33,879 pues entonces lo estoy viendo como 202 00:15:33,879 --> 00:15:34,700 Especialización 203 00:15:34,700 --> 00:15:36,820 ¿Dudas? 204 00:15:39,850 --> 00:15:41,509 ¿Cómo se hace esto 205 00:15:41,509 --> 00:15:43,529 En Java? Es decir, ¿cuál es la sintaxis 206 00:15:43,529 --> 00:15:45,389 Que me permite, dada una clase 207 00:15:45,389 --> 00:15:47,710 Hacer que otra clase 208 00:15:47,710 --> 00:15:49,590 Rede de ella? Pues con la palabra 209 00:15:49,590 --> 00:15:51,370 Reservada extends 210 00:15:51,370 --> 00:15:53,350 ¿Vale? Extiende 211 00:15:53,350 --> 00:15:55,110 En cierto sentido da esta cosa de 212 00:15:55,110 --> 00:15:57,450 Voy a pillar todo lo que es esta clase 213 00:15:57,450 --> 00:15:59,990 Y además la extiendo con algo más 214 00:15:59,990 --> 00:16:00,950 Entonces 215 00:16:00,950 --> 00:16:02,909 Yo tengo la clase recurso 216 00:16:02,909 --> 00:16:06,830 public class recurso normal, con dentro esta cosa aquí 217 00:16:06,830 --> 00:16:10,929 cuando voy a declarar la clase aula, public class aula 218 00:16:10,929 --> 00:16:14,610 extends recursos, entonces 219 00:16:14,610 --> 00:16:19,090 en este caso estaría diciendo que todo lo que está en recurso lo voy a añadir 220 00:16:19,090 --> 00:16:21,029 a aula, más lo que esté dentro de aula 221 00:16:21,029 --> 00:16:26,429 o public class ordenador extends recurso 222 00:16:26,429 --> 00:16:28,210 ¿dudas? 223 00:16:28,210 --> 00:16:35,090 No necesariamente 224 00:16:35,090 --> 00:16:39,850 No, puede extender clases de otros packages 225 00:16:39,850 --> 00:16:42,649 Siempre que tenga acceso a ellas 226 00:16:42,649 --> 00:16:45,750 Si la clase no es public 227 00:16:45,750 --> 00:16:48,610 Entonces no puede acceder a otro 228 00:16:48,610 --> 00:16:54,200 Los atributos y métodos que aparecen en azul de la clase padre 229 00:16:54,200 --> 00:16:55,879 Se repiten en las clases hijas 230 00:16:55,879 --> 00:16:57,419 ¿Vale? Aquí, ¿veis? 231 00:16:57,419 --> 00:16:59,519 Entonces no necesito repetir el código 232 00:16:59,519 --> 00:17:02,799 Basta con decir que una clase extiende o hereda de la otra 233 00:17:02,799 --> 00:17:03,360 Y ya está 234 00:17:03,360 --> 00:17:05,539 ¿Dudas? 235 00:17:06,000 --> 00:17:09,119 Además, imaginamos que decir nombre lo quiera cambiar 236 00:17:09,119 --> 00:17:09,640 ¿Vale? 237 00:17:09,880 --> 00:17:12,940 Aquí, en este contexto de aquí, yo lo debería cambiar en tres sitios 238 00:17:12,940 --> 00:17:14,519 Aquí, aquí y aquí 239 00:17:14,519 --> 00:17:16,980 Ahora, ¿con qué lo cambio aquí? 240 00:17:17,460 --> 00:17:20,099 Pues ya, tanto en aula como en ordenador, he hecho el cambio 241 00:17:20,099 --> 00:17:21,759 ¿Se entiende? 242 00:17:23,640 --> 00:17:24,119 ¿Dudas? 243 00:17:24,119 --> 00:17:31,059 Esto es como se llaman las cosas 244 00:17:31,059 --> 00:17:33,759 Para entendernos cuando hablamos 245 00:17:33,759 --> 00:17:35,200 Para que si yo digo una palabra 246 00:17:35,200 --> 00:17:39,000 Pues vosotros entendáis que se está entendiendo 247 00:17:39,000 --> 00:17:41,640 Entonces imaginamos una clase taxi 248 00:17:41,640 --> 00:17:44,099 A partir de vehículo 249 00:17:44,099 --> 00:17:48,799 Entonces taxi es la subclase 250 00:17:48,799 --> 00:17:51,960 Y vehículo es la superclase 251 00:17:51,960 --> 00:17:56,299 Entonces se puede decir que taxi hereda las variables y métodos de vehículo 252 00:17:56,299 --> 00:18:14,220 O que taxi es tiende vehículo. Se puede decir que taxi es una subclase de vehículo. Se puede decir que taxi es una clase derivada o una clase hija de vehículo. Al revés, puedes decir que vehículo es una superclase de taxi o una clase base o una clase padre de taxi. 253 00:18:14,220 --> 00:18:23,559 La herencia realiza una relación es un, es decir, que un taxi es un vehículo 254 00:18:23,559 --> 00:18:30,140 Un vehículo no es un taxi, ¿se entiende? 255 00:18:32,140 --> 00:18:40,079 Esto es un es interesante porque luego veremos que en determinados casos, y aquí entrará cosas como el polimorfismo, etc. 256 00:18:40,079 --> 00:18:51,680 Yo puedo utilizar, allá donde me han dicho que puedo utilizar un vehículo, yo puedo utilizar un taxi, porque el taxi es un vehículo. 257 00:18:52,319 --> 00:18:59,000 Entonces, no obstante su tipo sea taxi, pero como hereda todo lo que es vehículo, se puede portar como un vehículo. 258 00:19:00,000 --> 00:19:05,940 Sin embargo, no puedo poner un vehículo donde he dicho que aquí va un taxi, porque el vehículo no es un taxi. 259 00:19:07,200 --> 00:19:07,619 ¿Se entiende? 260 00:19:07,619 --> 00:19:14,200 aquí en un sitio donde me dicen 261 00:19:14,200 --> 00:19:18,160 puedes usar un recurso aquí, yo puedo poner tanto un aula como un ordenador 262 00:19:18,160 --> 00:19:21,599 porque los dos tendrán todo lo que hace falta de un recurso 263 00:19:21,599 --> 00:19:26,160 por lo tanto si este método requiere un recurso y luego de este recurso 264 00:19:26,160 --> 00:19:29,740 pilla, usa el nombre, decir nombre 265 00:19:29,740 --> 00:19:34,200 o el método de decir nombre, pues tanto si es un recurso 266 00:19:34,200 --> 00:19:37,240 como si es un aula, como si es un ordenador, tendrá este método 267 00:19:37,240 --> 00:19:41,539 lo puede utilizar, ahora si yo te digo que aquí recibo un aula 268 00:19:41,539 --> 00:19:45,660 como parámetro y luego dentro de este método usando este parámetro 269 00:19:45,660 --> 00:19:49,700 aula uso decir localización, si tú me has pasado un aula 270 00:19:49,700 --> 00:19:53,319 lo podrá hacer, pero si tú me has pasado un recurso no lo puede hacer 271 00:19:53,319 --> 00:19:56,980 porque el recurso no lo tiene decir localización, entonces no funcionaría 272 00:19:56,980 --> 00:20:00,619 mismo aquí, tengo una persona 273 00:20:00,619 --> 00:20:05,339 y esta persona tiene que saludar, vale, yo si te paso una persona 274 00:20:05,339 --> 00:20:11,579 tendrá el método de saludar y se saludará. Si te pasa un profesor, tendrá todos los métodos y datos de persona 275 00:20:11,579 --> 00:20:17,519 y por lo tanto podrás saludar también un profesor. Al revés, si el profesor tiene asignatura y te digo 276 00:20:17,519 --> 00:20:22,019 lístame tus asignaturas, un profesor lo puede hacer, pero si pongo un estudiante o pongo una persona, 277 00:20:22,180 --> 00:20:25,819 como no tiene la lista de... no lo puede hacer. ¿Se entiende? 278 00:20:25,819 --> 00:20:30,779 Entonces, hay esta relación de es un 279 00:20:30,779 --> 00:20:36,759 Las subclases son un superclase 280 00:20:36,759 --> 00:20:42,980 Entonces, mi clase animal es un 281 00:20:42,980 --> 00:20:50,670 Mi clase animal es un 282 00:20:50,670 --> 00:20:58,259 Exacto, object 283 00:20:58,259 --> 00:21:00,740 Porque todas las clases se reten de object 284 00:21:00,740 --> 00:21:01,440 Lo habíamos dicho 285 00:21:01,440 --> 00:21:02,440 ¿O no? 286 00:21:03,799 --> 00:21:04,279 Pues eso 287 00:21:04,279 --> 00:21:05,660 Es lo único que se puede decir 288 00:21:05,660 --> 00:21:06,880 ¿Puede ser un ser vivo? No lo sé 289 00:21:06,880 --> 00:21:10,220 Depende, si se extiende de la clase 290 00:21:10,220 --> 00:21:11,079 Ser vivo, sí 291 00:21:11,079 --> 00:21:14,140 ¿Vale? Entonces tendría que mi animal 292 00:21:14,140 --> 00:21:16,140 Extiende de la clase ser vivo 293 00:21:16,140 --> 00:21:17,460 Que extiende de object 294 00:21:17,460 --> 00:21:20,279 Porque siempre subiendo, subiendo, subiendo 295 00:21:20,279 --> 00:21:21,960 Llegaré a object 296 00:21:21,960 --> 00:21:23,279 Que es la 297 00:21:23,279 --> 00:21:25,079 Clase padre de todos 298 00:21:25,079 --> 00:21:28,099 La superclase definitiva 299 00:21:28,099 --> 00:21:29,000 ¿Sí? 300 00:21:29,859 --> 00:21:30,420 ¿Dudas? 301 00:21:34,289 --> 00:21:34,809 Sintaxis 302 00:21:34,809 --> 00:21:36,809 En Java para indicar que una clase red 303 00:21:36,809 --> 00:21:38,710 se usa extends, ya lo hemos dicho 304 00:21:38,710 --> 00:21:40,410 vale, modificador, aquí podemos poner 305 00:21:40,410 --> 00:21:42,829 public, private, lo que sea, class 306 00:21:42,829 --> 00:21:44,650 el nombre de la clase, hija 307 00:21:44,650 --> 00:21:46,789 extends, clase padre 308 00:21:46,789 --> 00:21:48,650 y luego ya la defino, vale 309 00:21:48,650 --> 00:21:50,750 entonces aquí 310 00:21:50,750 --> 00:21:52,869 por ejemplo, esto sería persona 311 00:21:52,869 --> 00:21:54,289 public class persona 312 00:21:54,289 --> 00:21:56,869 aquí no pongo nada, pero es como si estuviera 313 00:21:56,869 --> 00:22:06,900 poniendo extends 314 00:22:06,900 --> 00:22:08,900 object, si no 315 00:22:08,900 --> 00:22:10,819 pongo nada, aquí estoy poniendo 316 00:22:10,819 --> 00:22:12,440 extends object 317 00:22:12,440 --> 00:22:13,740 si 318 00:22:13,740 --> 00:22:17,259 O sea que aquí arriba estaría object 319 00:22:17,259 --> 00:22:17,980 ¿Sí? 320 00:22:18,500 --> 00:22:19,319 Tengo persona 321 00:22:19,319 --> 00:22:22,279 Luego tengo public class alumno 322 00:22:22,279 --> 00:22:23,839 Que extends persona 323 00:22:23,839 --> 00:22:25,480 Entonces alumno 324 00:22:25,480 --> 00:22:27,640 Es un 325 00:22:27,640 --> 00:22:29,319 Persona 326 00:22:29,319 --> 00:22:32,640 Un objeto alumno es un objeto persona 327 00:22:32,640 --> 00:22:34,259 Que es un objeto object 328 00:22:34,259 --> 00:22:35,420 ¿Sí? 329 00:22:37,200 --> 00:22:38,980 Public class empleado 330 00:22:38,980 --> 00:22:40,160 Extend persona también 331 00:22:40,160 --> 00:22:42,779 Y esto no necesariamente 332 00:22:42,779 --> 00:22:44,740 se acaba aquí, yo puedo hacer public class 333 00:22:44,740 --> 00:22:46,460 profesor que extensa empleado 334 00:22:46,460 --> 00:22:48,819 entonces la persona tiene nombre 335 00:22:48,819 --> 00:22:50,740 y apellido, el empleado tiene también 336 00:22:50,740 --> 00:22:52,720 un sueldo, el profesor tiene también 337 00:22:52,720 --> 00:22:54,779 además que un sueldo, que un nombre 338 00:22:54,779 --> 00:22:56,960 que un apellido, tiene también una lista de asignaturas 339 00:22:56,960 --> 00:22:59,460 ¿se entiende? 340 00:22:59,799 --> 00:23:01,940 y esto lo puedo hacer cuanto me da la gana, creando 341 00:23:01,940 --> 00:23:04,200 una jerarquía de clases 342 00:23:04,200 --> 00:23:10,890 es automático 343 00:23:10,890 --> 00:23:13,549 lo hace él, si tú no me dices de quién 344 00:23:13,549 --> 00:23:15,410 extendes, en automático extendes de obvio 345 00:23:15,410 --> 00:23:22,460 eso es una buenísima pregunta 346 00:23:22,460 --> 00:23:25,019 Y es no en Java 347 00:23:25,019 --> 00:23:29,119 Porque hay otros lenguajes de programación que sí lo permiten 348 00:23:29,119 --> 00:23:32,380 Java no permite multiherencia 349 00:23:32,380 --> 00:23:33,619 Herencia múltiple 350 00:23:33,619 --> 00:23:37,240 Siempre tú puedes heredar de una sola clase 351 00:23:37,240 --> 00:23:39,680 Puedes hacer una secuencia 352 00:23:39,680 --> 00:23:44,119 Te dices, mira, profesor necesita heredar de empleado y de persona 353 00:23:44,119 --> 00:23:47,140 Vale, pues persona necesita de empleado, empleado de profesor 354 00:23:47,140 --> 00:23:47,599 Eso sí 355 00:23:47,599 --> 00:23:49,819 Pero no puedes decirle extend 356 00:23:49,819 --> 00:23:51,779 Persona y extend 357 00:23:51,779 --> 00:23:55,900 Animal 358 00:23:55,900 --> 00:23:57,500 Por eso son animales 359 00:23:57,500 --> 00:24:03,039 Solo en los exámenes 360 00:24:03,039 --> 00:24:04,980 Y entonces 361 00:24:04,980 --> 00:24:07,400 Si yo tuviera que crear una estructura 362 00:24:07,400 --> 00:24:09,440 Como esta, estas serían 363 00:24:09,440 --> 00:24:10,940 Claramente como son public 364 00:24:10,940 --> 00:24:13,160 Cada una en su 365 00:24:13,160 --> 00:24:14,259 Fichero 366 00:24:14,259 --> 00:24:17,420 Esto en persona.java tendría esta definición 367 00:24:17,420 --> 00:24:19,220 Aquí, en alumno.java 368 00:24:19,220 --> 00:24:20,240 Esta definición aquí, etc 369 00:24:20,240 --> 00:24:30,730 Esta es un poquito la idea 370 00:24:30,730 --> 00:24:31,789 ¿Vale? 371 00:24:32,190 --> 00:24:34,230 Cuando yo tengo una clase alumno 372 00:24:34,230 --> 00:24:35,369 Sería la 373 00:24:35,369 --> 00:24:37,990 La estructura externa 374 00:24:37,990 --> 00:24:39,809 Tengo todos 375 00:24:39,809 --> 00:24:43,190 Los atributos, tanto de persona como alumno 376 00:24:43,190 --> 00:24:45,029 Como los métodos de persona y de alumno 377 00:24:45,029 --> 00:24:45,690 ¿Vale? 378 00:24:47,369 --> 00:24:49,130 En teoría es como si 379 00:24:49,130 --> 00:24:51,130 El objeto de la subclase 380 00:24:52,069 --> 00:24:55,250 Encrustara dentro un objeto 381 00:24:55,250 --> 00:24:56,430 De la superclase 382 00:24:56,430 --> 00:25:00,430 y veremos ahora cuando veremos 383 00:25:00,430 --> 00:25:02,349 los constructores 384 00:25:02,349 --> 00:25:05,009 cuando yo me creo un objeto alumno 385 00:25:05,009 --> 00:25:07,029 antes me estoy creando 386 00:25:07,029 --> 00:25:07,890 un objeto persona 387 00:25:07,890 --> 00:25:09,630 y antes me estoy creando 388 00:25:09,630 --> 00:25:12,289 un objeto object 389 00:25:12,289 --> 00:25:13,769 ¿sí? 390 00:25:15,369 --> 00:25:16,049 ¿dudas? 391 00:25:16,670 --> 00:25:18,930 por eso un alumno puede tener 392 00:25:18,930 --> 00:25:21,269 acceso a los nombres, apellidos, al año de nacimiento 393 00:25:21,269 --> 00:25:22,890 a imprimir y además 394 00:25:22,890 --> 00:25:24,789 a las cosas suyas, mientras una persona 395 00:25:24,789 --> 00:25:42,619 sólo tendría acceso a estas cosas aquí. Duda. Te he contestado. Más dudas. Ejemplo. ¿Os acordáis los 396 00:25:42,619 --> 00:25:54,000 modificadores que eran public, protected, package y private? Y nosotros decimos, bueno, protected no 397 00:25:54,000 --> 00:26:02,339 sabemos qué es porque no lo entenderemos hasta que veremos las la herencia pues ahora ya hemos 398 00:26:02,339 --> 00:26:08,460 visto la herencia según que es que es protected pues si os acordáis public esta clase o este 399 00:26:08,460 --> 00:26:16,019 método esta variable es accesible desde cualquier lado no me importa private sólo desde dentro la 400 00:26:16,019 --> 00:26:23,759 clase package sólo desde dentro la clase u otras clases que parte que pertenecen al mismo 401 00:26:23,759 --> 00:26:32,079 package? Pues con protected es a otras clases que pertenecen al mismo package o que hereden 402 00:26:32,079 --> 00:26:40,319 de esta clase. Si yo tengo una clase que está en otro package, que pero extiende esta clase 403 00:26:40,319 --> 00:26:48,160 de aquí, pues entonces puede acceder a sus métodos y a sus variables. Son cuatro niveles 404 00:26:48,160 --> 00:26:53,140 de protección, de privacidad 405 00:26:53,140 --> 00:26:57,539 que tiene. Desde lo más privado posible, que es sólo esta clase puede utilizar 406 00:26:57,539 --> 00:27:00,660 estas cosas, hasta lo más amplio posible, que es 407 00:27:00,660 --> 00:27:04,519 todos lo pueden utilizar. Y con esto puedo jugar. 408 00:27:05,859 --> 00:27:32,019 No tiene acceso a esas variables. Pues tú puedes utilizar 409 00:27:32,019 --> 00:27:34,420 los métodos públicos, que es lo que se suele hacer. 410 00:27:36,220 --> 00:27:39,380 Cuando tú pones el private, no lo pienses con herencia. 411 00:27:39,380 --> 00:27:54,480 Cuando nosotros poníamos el sueldo de mi cuenta es private, pero luego el sacar dinero, meter dinero, pues lo ponías como público. Lo que tú querías es que la gente no atacara directamente la variable, 412 00:27:54,480 --> 00:28:00,119 va a pasar por un método en el que tú haces los controlos necesarios para evitar que él saque 100 413 00:28:00,119 --> 00:28:06,700 euros cuando tienen sólo 50 en el banco o sea que el método es público entonces tú heredas eso la 414 00:28:06,700 --> 00:28:11,319 private te dice que no puedes acceder a la variable directamente pero puedes seguir utilizando los 415 00:28:11,319 --> 00:28:17,000 métodos que tú tienes si tú la tienes protected como has heredado podrás acceder cosa que a lo 416 00:28:17,000 --> 00:28:24,000 mejor una otra clase desde fuera del package no puede atacar porque es protect entonces eso luego 417 00:28:24,000 --> 00:28:45,779 Luego, para los ejercicios que hacemos nosotros no valen mucho, pero luego en un programa más complejo donde la seguridad empieza a ser interesante, saber limitar el acceso a métodos o cosas así, o de todas formas hacer que el acceso sea controlado porque tú accedes desde un método particular y no del método que te da la gana. 418 00:28:45,779 --> 00:28:48,000 Pero luego tú tengas métodos de apoyo 419 00:28:48,000 --> 00:28:49,440 Que sí que utilizas dentro 420 00:28:49,440 --> 00:28:51,559 Asumiendo que todo funciona bien 421 00:28:51,559 --> 00:28:53,119 Porque lo has hecho tú dentro del package 422 00:28:53,119 --> 00:28:55,299 No sé si me explico, pues eso lo puedes hacer 423 00:28:55,299 --> 00:28:57,700 Entonces con eso tienes los varios niveles 424 00:28:57,700 --> 00:28:58,019 De 425 00:28:58,019 --> 00:29:00,240 De seguridad 426 00:29:00,240 --> 00:29:02,799 No me sale 427 00:29:02,799 --> 00:29:04,359 Visibilidad 428 00:29:04,359 --> 00:29:07,619 ¿Sí? Vale, entonces aquí 429 00:29:07,619 --> 00:29:09,440 Tenemos una clase protected, vale 430 00:29:09,440 --> 00:29:11,339 Tenemos public persona 431 00:29:11,339 --> 00:29:13,440 Con nombres igual a 432 00:29:13,440 --> 00:29:15,339 Anónimo, vale, public persona 433 00:29:15,779 --> 00:29:18,339 que son dos constructores 434 00:29:18,339 --> 00:29:20,299 vale, uno es sin nada, es constructor 435 00:29:20,299 --> 00:29:22,160 por defecto, entonces me pone solo que el nombre 436 00:29:22,160 --> 00:29:24,160 anónimo y no me pone nada en este de aquí 437 00:29:24,160 --> 00:29:26,059 me pondrá null y me pondrá 438 00:29:26,059 --> 00:29:28,019 cero aquí, y si no persona 439 00:29:28,019 --> 00:29:29,920 con tres datos que accede 440 00:29:29,920 --> 00:29:31,099 a ellos de ahí, vale 441 00:29:31,099 --> 00:29:34,000 entonces public 442 00:29:34,000 --> 00:29:36,380 void imprime que accederá 443 00:29:36,380 --> 00:29:37,960 a estas cosas, el acceso 444 00:29:37,960 --> 00:29:40,039 a los constructores y 445 00:29:40,039 --> 00:29:42,099 al método 446 00:29:42,099 --> 00:29:44,099 imprime es público, todo lo pueden 447 00:29:44,099 --> 00:29:45,960 hacer, pero si quiero modificar estas 448 00:29:45,960 --> 00:29:48,140 cosas, la puedo modificar solo desde el mismo 449 00:29:48,140 --> 00:29:49,980 package, clase del mismo package 450 00:29:49,980 --> 00:29:51,779 o clases que hereden 451 00:29:51,779 --> 00:29:54,160 esta persona, vale, esto es 452 00:29:54,160 --> 00:29:55,940 un poco, en cierto sentido 453 00:29:55,940 --> 00:29:57,279 como meterlo privado, pero 454 00:29:57,279 --> 00:29:58,900 permito a quien 455 00:29:58,900 --> 00:30:01,559 estenda persona de poder 456 00:30:01,559 --> 00:30:03,740 trabajar con estas variables 457 00:30:03,740 --> 00:30:08,680 vale 458 00:30:08,680 --> 00:30:11,000 en este contexto 459 00:30:11,000 --> 00:30:12,660 vale, de protect 460 00:30:12,660 --> 00:30:13,339 de cosas así 461 00:30:13,339 --> 00:30:16,400 ahora veremos por qué 462 00:30:16,400 --> 00:30:25,880 a la pregunta que has hecho tú. Existe una palabra reservada, que se usa en dos contextos 463 00:30:25,880 --> 00:30:33,339 distintos, esto es para constructores o métodos, que es la palabra super. Super es algo parecido 464 00:30:33,339 --> 00:30:44,839 al concepto de dis. ¿Os acordáis dis? ¿Qué era dis? Estoy hablando de una instancia, 465 00:30:45,579 --> 00:30:50,420 pero sin saber cuál es la instancia. Es esta instancia. ¿Por qué? Porque estoy definiendo 466 00:30:50,420 --> 00:30:52,500 una clase, todavía no tengo un objeto 467 00:30:52,500 --> 00:30:54,579 creado, es la clase en general 468 00:30:54,579 --> 00:30:56,619 pero tengo que decir que cuando tú tendrás 469 00:30:56,619 --> 00:30:58,519 un objeto, pilla ese objeto 470 00:30:58,519 --> 00:31:00,519 y haz algo con él, pero como no 471 00:31:00,519 --> 00:31:02,640 tengo una referencia, no es x, no es 472 00:31:02,640 --> 00:31:04,660 new objeto, porque todavía no lo tengo 473 00:31:04,660 --> 00:31:06,400 pues entonces lo llamo this 474 00:31:06,400 --> 00:31:08,779 pues super es algo parecido 475 00:31:08,779 --> 00:31:10,660 pero se refiere no a mi 476 00:31:10,660 --> 00:31:12,660 sino a mi super clase 477 00:31:12,660 --> 00:31:14,380 es una referencia 478 00:31:14,380 --> 00:31:16,700 a la clase de la que yo heredo 479 00:31:16,700 --> 00:31:19,160 ¿sí? 480 00:31:19,160 --> 00:31:28,359 Ahora, superasís normalmente se suele utilizar en términos de constructor, ¿vale? 481 00:31:28,559 --> 00:31:30,200 Y también de método, eso lo veremos después 482 00:31:30,200 --> 00:31:34,839 Si vosotros miráis este es alumno que extiende persona, ¿vale? 483 00:31:34,839 --> 00:31:41,339 Como alumno extiende persona, tiene su grupo y su horario, que son cosas propias de alumno 484 00:31:41,339 --> 00:31:47,119 Pero tendrá también nombre, apellido y año de nacimiento, porque lo derivan desde persona, ¿sí? 485 00:31:47,119 --> 00:31:51,240 Ahora, cuando yo creo un alumno vacío 486 00:31:51,240 --> 00:31:53,079 Que no sé nada de él 487 00:31:53,079 --> 00:31:57,160 Lo que quiero hacer es crear una persona 488 00:31:57,160 --> 00:32:00,819 O sea, un alumno con nombre anónimo 489 00:32:00,819 --> 00:32:04,900 Entonces, lo que estoy haciendo aquí, con esta línea de aquí 490 00:32:04,900 --> 00:32:07,240 Es, vale, cuando creas un alumno 491 00:32:07,240 --> 00:32:13,319 Llama al constructor de la superclase sin parámetros 492 00:32:13,319 --> 00:32:17,019 Es decir, esto 493 00:32:17,019 --> 00:32:33,500 Entonces, cuando yo estoy llamando alumno así, lo que hará él es llamar primero al constructor sin parámetros de arriba, porque lo estoy llamando aquí, a esto. 494 00:32:34,099 --> 00:32:42,240 Entonces me pondrá, me creará todo lo que es una persona con sus atributos, me creará la parte esta aquí gris, ¿vale? 495 00:32:42,539 --> 00:32:47,539 Poniendo en nombre anónimo, y aquí datos por defecto porque no los tengo. 496 00:32:47,539 --> 00:32:51,259 Y después seguirá con este constructor 497 00:32:51,259 --> 00:32:53,180 Y como este constructor no tiene nada 498 00:32:53,180 --> 00:32:54,400 Lo dejará ahí, así 499 00:32:54,400 --> 00:32:56,500 Entonces este constructor de aquí 500 00:32:56,500 --> 00:32:57,920 La parte debajo del super 501 00:32:57,920 --> 00:32:59,740 Crearía la parte blanca 502 00:32:59,740 --> 00:33:02,059 Que pero como es un constructor por defecto 503 00:33:02,059 --> 00:33:02,619 No hace nada 504 00:33:02,619 --> 00:33:04,480 Pondría dentro group null 505 00:33:04,480 --> 00:33:05,759 Y dentro echar 506 00:33:05,759 --> 00:33:07,079 No sé qué carácter 507 00:33:07,079 --> 00:33:07,880 Un carácter 508 00:33:07,880 --> 00:33:09,680 Nulo 509 00:33:09,680 --> 00:33:12,319 ¿Están de acuerdo? 510 00:33:13,240 --> 00:33:13,480 Vale 511 00:33:13,480 --> 00:33:15,779 Fijaos en esto 512 00:33:15,779 --> 00:33:24,279 A ver, pero alumno es una persona 513 00:33:24,279 --> 00:33:27,059 Entonces, cuando yo creo un alumno 514 00:33:27,059 --> 00:33:30,519 Antes de crear un alumno, tengo que crear una persona 515 00:33:30,519 --> 00:33:32,500 Porque un alumno es una persona 516 00:33:32,500 --> 00:33:34,839 Entonces, si no tengo una persona, no puedo crear un alumno 517 00:33:34,839 --> 00:33:37,279 Entonces, esta cosa de aquí 518 00:33:37,279 --> 00:33:40,460 Te está diciendo, vale, para crear un alumno 519 00:33:40,460 --> 00:33:42,039 Porque este es el constructor del alumno 520 00:33:42,039 --> 00:33:47,400 Haz, llama el constructor de mi clase padre 521 00:33:47,400 --> 00:33:48,460 ¿Vale? 522 00:33:48,680 --> 00:33:51,799 Y como aquí no tiene parámetros, el que no tiene parámetros 523 00:33:51,799 --> 00:33:52,799 Es decir, esto 524 00:33:52,799 --> 00:33:57,309 Entonces, este de aquí 525 00:33:57,309 --> 00:33:59,569 Lo que hará 526 00:33:59,569 --> 00:34:01,230 Es construir la parte gris 527 00:34:01,230 --> 00:34:03,829 El corazón 528 00:34:03,829 --> 00:34:05,049 La parte que es persona 529 00:34:05,049 --> 00:34:07,589 Y que pondrá en nombre 530 00:34:07,589 --> 00:34:09,150 Anónimo, porque lo pone aquí 531 00:34:09,150 --> 00:34:11,650 Y como en los demás no te hace nada 532 00:34:11,650 --> 00:34:13,250 Pues pondrá en apellidos null 533 00:34:13,250 --> 00:34:14,829 Y en año de nacimiento, cero 534 00:34:14,829 --> 00:34:17,650 Y ahora he creado esta parte aquí 535 00:34:17,650 --> 00:34:18,809 Pero no he creado un alumno 536 00:34:18,809 --> 00:34:20,809 He creado solo la parte persona 537 00:34:20,809 --> 00:34:24,050 Volvería aquí y seguiría con este 538 00:34:24,050 --> 00:34:26,349 Constructor, que pero como no hace nada 539 00:34:26,349 --> 00:34:28,269 Pondrá dentro de grupo 540 00:34:28,269 --> 00:34:30,190 Y de horario valores por defectos 541 00:34:30,190 --> 00:34:32,329 Y ya está, ya tengo mi alumno con la parte 542 00:34:32,329 --> 00:34:33,530 Dentro y la parte fuera creada 543 00:34:33,530 --> 00:34:36,550 ¿Vale? Déjame explicar el próximo 544 00:34:36,550 --> 00:34:38,309 Que a lo mejor es más claro 545 00:34:38,309 --> 00:34:39,929 O sea, se clarifica algo 546 00:34:39,929 --> 00:34:42,570 Pongamos un alumno, un constructor 547 00:34:42,570 --> 00:34:44,769 De alumno que pilla solo nombre, apellido 548 00:34:44,769 --> 00:34:45,610 Y no nacimiento 549 00:34:45,610 --> 00:34:48,170 Pero no pilla ni grupo ni horario 550 00:34:48,170 --> 00:34:50,550 ¿Vale? Entonces yo lo que puedo 551 00:34:50,550 --> 00:34:52,510 Hacer es, vale, muy bien, vete a 552 00:34:52,510 --> 00:34:59,489 Llamar super de nombre, apellido y año nacimiento. 553 00:34:59,489 --> 00:35:12,969 O sea, estoy buscando un constructor de mi clase superior que tenga estos tres parámetros, string, string, int. 554 00:35:13,489 --> 00:35:16,630 Y voy a mirar y efectivamente tengo un constructor string, string, int. 555 00:35:17,570 --> 00:35:21,010 Entonces, esta vez no estaré usando esto, estaré usando esto. 556 00:35:21,010 --> 00:35:27,650 Y como hemos dicho que soy una persona, primero creo una persona y luego crearé la parte de alumno. 557 00:35:27,869 --> 00:35:31,130 Y en la parte de persona pondré nombre dentro de nombre, apellido dentro de apellido, 558 00:35:31,230 --> 00:35:37,269 y como luego no tengo nada más, pues la parte de alumno se quedará como vacía. 559 00:35:37,809 --> 00:35:39,690 Se quedará con valores por defecto. 560 00:35:41,750 --> 00:35:45,730 Esto es crear un alumno, pero sin saber las características de alumno. 561 00:35:45,730 --> 00:35:51,150 Y luego finalmente tengo el constructor propio de alumno de verdad 562 00:35:51,150 --> 00:35:57,429 Que sería alumno con nombre, apellido, año de nacimiento, su grupo y su horario 563 00:35:57,429 --> 00:36:00,809 Entonces, ¿qué hará esto? 564 00:36:01,010 --> 00:36:03,329 Pues primero construir una persona 565 00:36:03,329 --> 00:36:07,030 Y para hacer una construcción de una persona, llamará el constructor super 566 00:36:07,030 --> 00:36:10,849 Con los parámetros necesarios a crear una persona 567 00:36:10,849 --> 00:36:12,889 Esto creará la parte gris 568 00:36:12,889 --> 00:36:24,469 y después seguirá llamando, por ejemplo, este método que es ponGrupo al que le paso este grupo y este horario 569 00:36:24,469 --> 00:36:31,829 y si os fijáis, ponGrupo lo que hace es rellenar dis.grupo y dis.horario, comprobando que el grupo no sea nulo. 570 00:36:34,530 --> 00:36:37,420 Es un ejemplo. ¿Se entiende? 571 00:36:38,239 --> 00:36:42,619 Entonces, si ahora aquí tengo tres constructores de alumnos, puedo hacer un alumno anónimo, 572 00:36:42,619 --> 00:36:58,440 Puedo hacer un alumno que sepa los datos de personas, pero todavía no sepa su grupo y su horario, o puedo crear un alumno que sepa todo. Y lo que voy a hacer es usar los constructores ya existentes de la persona. 573 00:36:58,440 --> 00:36:59,280 de la persona 574 00:36:59,280 --> 00:37:02,780 ahora, la pregunta es 575 00:37:02,780 --> 00:37:04,260 centrémonos en esto 576 00:37:04,260 --> 00:37:06,260 ¿no podría haber hecho esto? 577 00:37:08,909 --> 00:37:10,409 es decir, ver que public 578 00:37:10,409 --> 00:37:12,309 alumno con estos datos son los mismos 579 00:37:12,309 --> 00:37:14,190 en vez de llamar super 580 00:37:14,190 --> 00:37:16,590 bla bla bla, hacer que dis.nombre 581 00:37:16,590 --> 00:37:18,309 es igual a nombre, dis.apellida es igual a 582 00:37:18,309 --> 00:37:20,050 apellida, dis.nacimiento es igual a nacimiento 583 00:37:20,050 --> 00:37:21,070 ¿funcionaría? 584 00:37:25,820 --> 00:37:29,539 funcionaría, sí 585 00:37:29,539 --> 00:37:31,900 lo podría hacer perfectamente 586 00:37:31,900 --> 00:37:33,480 en este caso 587 00:37:33,480 --> 00:37:35,219 o sea que esto 588 00:37:35,219 --> 00:37:36,579 O esto 589 00:37:36,579 --> 00:37:39,579 Son idénticos en este caso 590 00:37:39,579 --> 00:37:41,159 ¿Vale? 591 00:37:41,699 --> 00:37:43,360 Se suele usar esto 592 00:37:43,360 --> 00:37:44,380 ¿Por qué? 593 00:37:45,360 --> 00:37:46,340 Primero porque es más 594 00:37:46,340 --> 00:37:49,260 Más 595 00:37:49,260 --> 00:37:50,579 ¿Cómo se dice? 596 00:37:50,679 --> 00:37:51,280 Conciso 597 00:37:51,280 --> 00:37:55,000 Pero por otro lado 598 00:37:55,000 --> 00:37:57,860 Tiene también otra razón 599 00:37:57,860 --> 00:37:58,920 Que viene más adelante 600 00:37:58,920 --> 00:37:59,380 ¿Dónde viene? 601 00:37:59,380 --> 00:38:00,300 Más adelante 602 00:38:00,300 --> 00:38:02,539 Entonces la veremos más adelante 603 00:38:02,539 --> 00:38:02,800 ¿Vale? 604 00:38:02,880 --> 00:38:04,539 Pero pasa por 605 00:38:04,539 --> 00:38:07,079 Si yo esto lo meto private 606 00:38:07,079 --> 00:38:11,059 Esta cosa de aquí ya no funcionaría 607 00:38:11,059 --> 00:38:15,500 Entonces no podría crear la persona con los datos que le he pasado 608 00:38:15,500 --> 00:38:17,920 Sin embargo, si uso super 609 00:38:17,920 --> 00:38:21,400 Como el constructor sí es público 610 00:38:21,400 --> 00:38:30,699 Sí lo puede hacer, en parte 611 00:38:30,699 --> 00:38:32,820 No lo hemos visto todavía porque viene más adelante 612 00:38:32,820 --> 00:38:34,780 Por algún lado viene esta cosa explicada 613 00:38:34,780 --> 00:38:36,199 Pero, de algún modo es esto 614 00:38:36,199 --> 00:38:39,000 Si tú aquí le pones privado 615 00:38:39,000 --> 00:38:41,639 Entonces desde la subclase no puede acceder 616 00:38:41,639 --> 00:39:07,079 Entonces, ¿qué hago? Pues uso cosas como esta. Por ejemplo, accediendo al super, pues entonces sí puede acceder porque super sí es accesible. El constructor. Fijaos que por ahora super aquí lo hemos usado solo como constructor. Tenemos dos otras formas de usar super, que es como referencia para acceder a sus variables o como método. Y lo veremos ahora en la próxima transparencia. 617 00:39:07,079 --> 00:39:08,179 dudas hasta aquí 618 00:39:08,179 --> 00:39:16,139 porque no estoy accediendo a la variable 619 00:39:16,139 --> 00:39:17,699 estoy accediendo al constructor 620 00:39:17,699 --> 00:39:21,139 y si tú querías hacer alguna protección o cosa por el estilo 621 00:39:21,139 --> 00:39:22,619 has metido aquí la protección 622 00:39:22,619 --> 00:39:24,460 no me está 623 00:39:24,460 --> 00:39:27,159 permitiendo de acceder a año nacimiento 624 00:39:27,159 --> 00:39:28,219 y poner menos 7 625 00:39:28,219 --> 00:39:30,699 porque tú dentro de este constructor 626 00:39:30,699 --> 00:39:32,760 habrás comprobado que año nacimiento 627 00:39:32,760 --> 00:39:34,960 no puede ser negativo y que por lo tanto 628 00:39:34,960 --> 00:39:36,300 no me meterá nunca menos 7 629 00:39:36,300 --> 00:39:40,590 luego no lo has hecho pues el problema es tuyo 630 00:39:41,389 --> 00:39:43,530 ok 631 00:39:43,530 --> 00:39:47,179 Prueba 632 00:39:47,179 --> 00:39:50,599 Vamos a ver 633 00:39:50,599 --> 00:39:51,679 Esta es una clase prueba 634 00:39:51,679 --> 00:39:53,420 Tiene un main 635 00:39:53,420 --> 00:39:56,420 Persona vecina es igual a new persona 636 00:39:56,420 --> 00:39:57,760 Con estos datos 637 00:39:57,760 --> 00:40:00,239 Alumno, un alumno es igual a new alumno 638 00:40:00,239 --> 00:40:01,199 Con estos datos 639 00:40:01,199 --> 00:40:04,659 Un alumno.pongrupo le pasa dos cosas 640 00:40:04,659 --> 00:40:06,079 Os recuerdo pongrupo es esto 641 00:40:06,079 --> 00:40:07,820 Vale, entonces 642 00:40:07,820 --> 00:40:09,860 Aquí en vez de utilizar este constructor 643 00:40:09,860 --> 00:40:12,360 He usado este constructor y luego he rellenado 644 00:40:12,360 --> 00:40:14,440 Estos dos utilizando su método 645 00:40:14,440 --> 00:40:15,199 aquí 646 00:40:15,199 --> 00:40:17,760 si ahora llamo 647 00:40:17,760 --> 00:40:19,579 vecina.imprime 648 00:40:19,579 --> 00:40:21,380 imprime es esto 649 00:40:21,380 --> 00:40:24,179 es un método de clase persona 650 00:40:24,179 --> 00:40:26,119 y lo que hace es decir 651 00:40:26,119 --> 00:40:28,519 datos personales y luego pone su nombre 652 00:40:28,519 --> 00:40:30,599 su apellido y su año de nacimiento 653 00:40:30,599 --> 00:40:32,099 pues si yo llamo 654 00:40:32,099 --> 00:40:34,980 vecina.imprime 655 00:40:34,980 --> 00:40:36,420 lo que obtendré es 656 00:40:36,420 --> 00:40:37,900 datos personales 657 00:40:37,900 --> 00:40:39,579 Luis Asenjo Martínez 658 00:40:39,579 --> 00:40:43,989 si ahora 659 00:40:43,989 --> 00:40:51,050 hallamos un alumno.imprime, oye, en alumno no está imprime. Está imprime grupo, pero 660 00:40:51,050 --> 00:40:58,530 no está imprime. Pero como extende persona, está importando, está copiando este de aquí. 661 00:40:58,530 --> 00:41:06,489 Y entonces usará el imprime definido en persona, que fijaos, usa solo nombre, apellido 662 00:41:06,489 --> 00:41:12,170 y año nacimiento, que son los datos que están en persona y que también alumno tiene. Por 663 00:41:12,170 --> 00:41:17,769 Por lo tanto, el alumno podrá escribir datos personales Juan Ugarte López, 1985. 664 00:41:20,269 --> 00:41:21,610 ¿Sí? Exactamente como el otro. 665 00:41:21,809 --> 00:41:24,489 Y luego dice, un alumno, punto, imprime grupo. 666 00:41:25,369 --> 00:41:31,929 Es decir, sobre un alumno utiliza este método de aquí, que escribe el grupo y el horario. 667 00:41:33,389 --> 00:41:33,590 ¿Sí? 668 00:41:33,590 --> 00:41:39,610 Y lo puede hacer porque el alumno está definido en primer grupo. 669 00:41:39,610 --> 00:41:42,429 ¿Podría hacer vecina punto en primer grupo? 670 00:41:50,559 --> 00:41:51,380 ¿Cuánto atrás? 671 00:42:00,949 --> 00:42:02,889 ¿Y podría hacer vecina punto en primer grupo? 672 00:42:03,530 --> 00:42:04,349 No, ¿por qué no? 673 00:42:06,619 --> 00:42:10,239 Porque alumno es una persona 674 00:42:10,239 --> 00:42:13,820 Pero persona no es un alumno 675 00:42:13,820 --> 00:42:17,519 Con el alumno puedo usar todo lo que está en persona 676 00:42:17,519 --> 00:42:20,239 Pero en persona no puedo usar las cosas que están en alumno 677 00:42:21,059 --> 00:42:22,900 ¿Se entiende? 678 00:42:23,940 --> 00:42:24,480 ¿Dudas? 679 00:42:28,019 --> 00:42:28,400 Vale 680 00:42:28,400 --> 00:42:30,940 ¿Qué pasaría si el atributo 681 00:42:30,940 --> 00:42:32,400 Ah, sí, está aquí, que es lo que decía antes 682 00:42:32,400 --> 00:42:35,039 Que el atributo nombre fuera privado, declarado private 683 00:42:35,039 --> 00:42:36,280 Si yo aquí 684 00:42:36,280 --> 00:42:38,980 El nombre lo pongo 685 00:42:38,980 --> 00:42:40,039 Como private 686 00:42:40,039 --> 00:42:41,179 Nombre 687 00:42:41,179 --> 00:42:44,840 Si hiciera esto 688 00:42:44,840 --> 00:42:46,940 De aquí, de alumno 689 00:42:46,940 --> 00:42:48,980 Esto es el constructor de alumno 690 00:42:48,980 --> 00:42:50,619 Y hago dis.nombres igual a nombre 691 00:42:50,619 --> 00:42:52,500 Dis.apellidos, apellidos, etc, etc 692 00:42:52,500 --> 00:42:53,800 Cuando hago esto 693 00:42:53,800 --> 00:42:55,179 Se enfada 694 00:42:55,179 --> 00:42:58,440 Me dice, tú no puedes acceder al nombre 695 00:42:58,440 --> 00:43:02,179 Porque el nombre lo has declarado en persona 696 00:43:02,179 --> 00:43:03,519 Y es privado 697 00:43:03,519 --> 00:43:06,860 Entonces se puede usar solo dentro de persona 698 00:43:06,860 --> 00:43:08,000 Solo dentro de esta clase 699 00:43:08,000 --> 00:43:13,559 Sin embargo, si yo lo uso con super nombre, apellido 700 00:43:13,559 --> 00:43:16,000 Yo no estoy accediendo a la variable nombre 701 00:43:16,000 --> 00:43:20,119 Yo estoy usando el constructor de persona 702 00:43:20,119 --> 00:43:22,440 Y el constructor de persona es público 703 00:43:22,440 --> 00:43:24,159 Puede acceder tranquilamente a él 704 00:43:24,159 --> 00:43:26,679 Y será él desde dentro de persona 705 00:43:26,679 --> 00:43:27,699 Que accede al nombre 706 00:43:27,699 --> 00:43:29,260 Entonces sí lo puede hacer 707 00:43:29,260 --> 00:43:39,829 No accede directamente al campo privado 708 00:43:39,829 --> 00:43:41,809 Si no llamo al constructor de la superclase 709 00:43:41,809 --> 00:43:43,949 Que podría incluir controles adicionales 710 00:43:43,949 --> 00:43:45,909 Sobre el campo que se ha declarado private 711 00:43:45,909 --> 00:43:47,210 Y podría preguntarme 712 00:43:47,210 --> 00:43:49,110 Que no sea null 713 00:43:49,110 --> 00:43:51,389 Que sea al menos un carácter 714 00:43:51,389 --> 00:43:52,989 Que no sé qué, no sé cuánto 715 00:43:52,989 --> 00:43:54,090 ¿Dudas? 716 00:43:59,269 --> 00:44:01,829 Vale, vamos a darnos una pausa 717 00:44:01,829 --> 00:44:03,670 Sobre la teoría 718 00:44:03,670 --> 00:44:07,929 Y intentamos crear esta estructura de aquí 719 00:44:07,929 --> 00:44:12,130 Vamos a crear una clase dispositivo 720 00:44:12,130 --> 00:44:15,230 Que tenga dos otras clases 721 00:44:15,230 --> 00:44:17,750 Que son la clase móvil y la clase ordenador 722 00:44:17,750 --> 00:44:20,849 Las dos que hereden desde dispositivo 723 00:44:20,849 --> 00:44:24,110 Tened en cuenta que aquí hay algunos metodillos 724 00:44:24,110 --> 00:44:25,889 Como por ejemplo el método enciende 725 00:44:25,889 --> 00:44:28,710 Que escribirá el dispositivo está encendido 726 00:44:28,710 --> 00:44:32,289 Y que probablemente se terá el encendido a true 727 00:44:32,289 --> 00:44:35,190 Apaga, apaga el dispositivo 728 00:44:35,190 --> 00:44:37,489 Estado que dice el número serial 729 00:44:37,489 --> 00:44:39,369 O sea, este dispositivo está encendido 730 00:44:39,369 --> 00:44:41,309 O apagado, dependiendo de si 731 00:44:41,309 --> 00:44:42,769 Está encendido o apagado 732 00:44:42,769 --> 00:44:45,030 El móvil 733 00:44:45,030 --> 00:44:47,849 Además que todo lo que hace un dispositivo 734 00:44:47,849 --> 00:44:49,510 Añade su número 735 00:44:49,510 --> 00:44:50,969 Número de teléfono 736 00:44:50,969 --> 00:44:54,090 Y tiene estado móvil 737 00:44:54,090 --> 00:44:54,989 Que fijaos 738 00:44:54,989 --> 00:44:57,829 Es parecido a estado, solo que estado móvil 739 00:44:57,829 --> 00:44:59,090 Lo que hace, te dice que 740 00:44:59,090 --> 00:45:01,170 El móvil con número no sé qué 741 00:45:01,170 --> 00:45:02,889 Y número serial no sé cuánto 742 00:45:02,889 --> 00:45:04,230 Está encendido o apagado 743 00:45:04,230 --> 00:45:06,590 Es una especificación de ese estado 744 00:45:06,590 --> 00:45:08,349 Y aquí también estará ordenador 745 00:45:08,349 --> 00:45:09,170 Que tiene un IP 746 00:45:09,170 --> 00:45:11,489 Y dice estado del ordenador 747 00:45:11,489 --> 00:45:13,070 Que dirá, escribe el móvil 748 00:45:13,070 --> 00:45:15,269 No, el móvil no, será el ordenador 749 00:45:15,269 --> 00:45:16,130 Con IP, IP 750 00:45:16,130 --> 00:45:18,610 Y número serial está encendido o apagado 751 00:45:18,610 --> 00:45:21,429 ¿Lo hacéis vosotros? 752 00:45:22,070 --> 00:45:24,800 ¿No queréis que lo haga yo? 753 00:45:26,219 --> 00:45:27,000 Haced vosotros 754 00:45:27,000 --> 00:45:29,800 Haced vosotros 755 00:45:29,800 --> 00:45:32,719 Venga haciéndolo vosotros 756 00:45:32,719 --> 00:45:34,219 ¿Cuánto tardáis en hacer esto?