1 00:00:00,300 --> 00:00:10,500 Voy a grabar esta clase y por lo tanto si habláis o preguntáis algo me autorizáis a grabar vuestras voces. 2 00:00:10,740 --> 00:00:14,419 Entonces hoy vamos a empezar lo que es la programación orientada a objetos. 3 00:00:15,119 --> 00:00:21,699 Es un paradigma nuevo, vamos a cambiar desde la programación estructurada, que es lo que hemos hecho hasta ahora, 4 00:00:21,699 --> 00:00:28,219 entonces los mecanismos sustancialmente de control de flujo de ejecución que hemos visto hasta ahora, 5 00:00:28,219 --> 00:00:33,859 Y vamos a cambiar un poco la forma con la que nos enfocamos a los sistemas 6 00:00:33,859 --> 00:00:37,420 Y nos enfocamos a los proyectos y a las clases que hacemos 7 00:00:37,420 --> 00:00:42,200 Vamos a entender por fin que es una clase, que es un objeto 8 00:00:42,200 --> 00:00:46,679 Que es esa palabra static, que son estas cosas de public, etc 9 00:00:46,679 --> 00:00:52,939 Y vamos a empezar a profundizar en el potencial real de Java 10 00:00:52,939 --> 00:00:57,219 Hasta ahora nosotros hemos utilizado Java como si fuera un lenguaje de programación 11 00:00:57,219 --> 00:00:58,840 Estructurado sustancialmente 12 00:00:58,840 --> 00:01:00,939 Y tenía un montón de cosas engorrosas 13 00:01:00,939 --> 00:01:02,399 Que poner que no servían de nada 14 00:01:02,399 --> 00:01:04,060 Porque no las estábamos aprovechando 15 00:01:04,060 --> 00:01:07,159 Ahora vamos a intentar 16 00:01:07,159 --> 00:01:09,060 Mejorar un poco esa cosa 17 00:01:09,060 --> 00:01:10,900 ¿Vale? Entonces programación orientada a objetos 18 00:01:10,900 --> 00:01:12,780 Es un paradigma 19 00:01:12,780 --> 00:01:14,780 De programación cuyo elemento 20 00:01:14,780 --> 00:01:16,879 Estructural principal es el objeto 21 00:01:16,879 --> 00:01:19,120 ¿Os acordáis cuál era el elemento estructural 22 00:01:19,120 --> 00:01:20,980 Principal de la programación estructurada? 23 00:01:28,140 --> 00:01:29,400 Exacto, las funciones 24 00:01:29,400 --> 00:01:31,980 ¿Vale? En la programación estructurada 25 00:01:31,980 --> 00:01:33,560 La base sustancialmente 26 00:01:33,560 --> 00:01:41,939 Era hacer funciones, las varias funciones recolectaban una funcionalidad, un procedimiento, algo que se hace 27 00:01:41,939 --> 00:01:49,040 Luego se ponía un nombre a ese trozo de código y de esta forma era reutilizable 28 00:01:49,040 --> 00:01:55,939 Esa cosa más o menos no se ha perdido, pero se añade un concepto nuevo, el concepto de objeto 29 00:01:55,939 --> 00:02:09,219 Ahora hablaremos de eso. Sostancialmente, intentar empaquetar en una única entidad, digamos así, todo lo que se refiere a esa entidad misma. 30 00:02:09,939 --> 00:02:17,419 Entonces, cuando yo voy a modelizar un determinado concepto, modelizo un animal, modelizo un coche, modelizo una persona, modelizo un alumno, 31 00:02:17,419 --> 00:02:27,680 Pues voy empaquetando todo junto lo que es las características de esa entidad y lo que puede hacer esa entidad. 32 00:02:28,439 --> 00:02:40,639 Van de la manita los datos propios que caracterizan esa entidad y todas las acciones, todos los cálculos, los procedimientos, funciones, etc. 33 00:02:40,639 --> 00:02:45,759 Los métodos de esa entidad 34 00:02:45,759 --> 00:02:48,460 Y haremos ejemplos para entenderlo mejor 35 00:02:48,460 --> 00:02:52,319 Elemento estructural principal en el paradigma de la programación imperativa 36 00:02:52,319 --> 00:02:54,500 Si lo ponen aquí, el estructural de la función 37 00:02:54,500 --> 00:02:56,240 Si lo ponen, lo sabéis leer 38 00:02:56,240 --> 00:03:01,919 Las mejoras que aporta la programación orientada a objetos son 39 00:03:01,919 --> 00:03:03,300 Análisis 40 00:03:03,300 --> 00:03:07,939 La forma con la que nosotros analizamos un problema 41 00:03:07,939 --> 00:03:12,139 Intentamos estructurarlos y trabajar con ellos 42 00:03:12,139 --> 00:03:17,979 Se refleja bastante con la programación orientada a objetos 43 00:03:17,979 --> 00:03:25,780 Nosotros como seres humanos estamos acostumbrados constantemente a interactuar con lo que tenemos a nuestro alrededor 44 00:03:25,780 --> 00:03:27,479 Y utilizarlo de alguna forma 45 00:03:27,479 --> 00:03:30,319 Yo pillo el martillo y sé utilizar el martillo 46 00:03:30,319 --> 00:03:33,219 Pillo un coche y sé utilizar un coche 47 00:03:33,219 --> 00:03:35,280 Sé que me puedo esperar del coche 48 00:03:35,280 --> 00:03:37,039 Cuáles son las características de un coche 49 00:03:37,039 --> 00:03:59,740 La idea a nivel de programación orientada a objetos es que yo me creo abstracciones de estas entidades, es lo que quiero modelizar, y según mi sistema, según lo que yo quiero hacer en mi programa, voy adaptando las características y las funcionalidades de este objeto, de esta entidad. 50 00:03:59,740 --> 00:04:05,719 ¿Qué quiero decir? Si yo, por ejemplo, voy a trabajar en un sistema de alumnos 51 00:04:05,719 --> 00:04:12,020 entendido como un sistema para secretaría, a lo mejor en secretaría lo que le interesa 52 00:04:12,020 --> 00:04:17,939 del alumno son determinados datos que a nivel de docencia, a nivel de profesor 53 00:04:17,939 --> 00:04:24,819 no son los mismos. A lo mejor a un profesor le interesan mucho las notas y las materias 54 00:04:24,819 --> 00:04:30,420 que cursan los alumnos. Entonces si creo un alumno y voy a crear una modelización del 55 00:04:30,420 --> 00:04:36,060 concepto de alumno, pues le tendré que poner un array de notas, un array de materias cursadas 56 00:04:36,060 --> 00:04:41,540 o algo por el estilo. Si lo hago para secretaría, pues a lo mejor lo que interesa son otras 57 00:04:41,540 --> 00:04:46,519 cosas. Son un array de documentos, que son los documentos anteriores o los informes que 58 00:04:46,519 --> 00:04:51,279 tenía anteriormente. O un array de certificados, que son los certificados que yo puedo crear 59 00:04:51,279 --> 00:04:57,000 y entregar a los alumnos. Entonces, dependiendo de cuál es el contexto en el que voy a modelizar 60 00:04:57,000 --> 00:05:03,319 un determinado concepto, pues puede ser que este mismo concepto sea distinto, ¿vale? 61 00:05:03,540 --> 00:05:09,980 Aparezca de una forma o de otra. Pero la idea es que cuando voy a analizar, yo tengo un problema, 62 00:05:10,120 --> 00:05:14,060 tengo que hacer un sistema, tengo que hacer un programa que solucione este problema y que me ayude 63 00:05:14,060 --> 00:05:23,060 a resolver este problema, pues cuando voy a analizar los conceptos, pues los objetos son muy, en un cierto sentido, 64 00:05:23,240 --> 00:05:32,959 parecidos a lo que haría pensando esos objetos en la vida real, o al menos más cercano con respecto a lo que era 65 00:05:32,959 --> 00:05:42,279 la programación en la imperativa estructural. Entonces, esto hace que sea un poquito más sencillo entender las piezas 66 00:05:42,279 --> 00:05:45,519 con la que voy a trabajar en la programación orientada a los objetos. 67 00:05:46,199 --> 00:05:50,519 Otra ventaja interesante de la programación orientada a los objetos es la escalabilidad. 68 00:05:50,680 --> 00:05:58,300 Es decir, que escalar un problema quiere decir, sustancialmente, hacerlo más complejo. 69 00:05:58,879 --> 00:06:06,139 Escalar un problema puede ser que antes trabajaba con 100 alumnos y ahora tengo un instituto de 1000 alumnos. 70 00:06:06,139 --> 00:06:16,139 El problema se ha hecho más complejo. No tanto porque el problema de gestionar los alumnos haya cambiado, pero no es lo mismo gestionar 10 personas que gestionar 1.000 personas. 71 00:06:16,139 --> 00:06:37,079 ¿Vale? Entonces, la idea es que la programación orientada a objetos es muy buena en crear soluciones que en un cierto sentido luego sean modificables, sean adaptables cuando el problema se vuelve más grande. 72 00:06:37,079 --> 00:06:41,879 Entonces mientras que en el estructurado las funciones 73 00:06:41,879 --> 00:06:46,259 A lo mejor el algoritmo que he utilizado es relativamente lento 74 00:06:46,259 --> 00:06:48,019 Entonces por 10 personas funciona bien 75 00:06:48,019 --> 00:06:50,800 Pero cuando llega a 1000 tengo que cambiar el algoritmo 76 00:06:50,800 --> 00:06:52,000 Tengo que reestructurar todo 77 00:06:52,000 --> 00:06:54,300 Pues en la programación orientada a objetos 78 00:06:54,300 --> 00:06:57,019 El algoritmo a lo mejor siempre mantiene 79 00:06:57,019 --> 00:07:01,819 Pero como que me da más instrumentos, más herramientas 80 00:07:01,819 --> 00:07:05,180 Para que pueda escalar el problema 81 00:07:05,180 --> 00:07:12,199 Cambiar lo que tengo en mi sistema para que pueda enfrentarse a problemas más complejos 82 00:07:12,199 --> 00:07:15,420 Y finalmente reutilización del código 83 00:07:15,420 --> 00:07:23,180 El concepto es que yo puedo crear una modelización de un determinado concepto 84 00:07:23,879 --> 00:07:25,660 Un alumno, un coche, un animal 85 00:07:25,660 --> 00:07:29,180 Y que si mañana vuelvo a hacer un nuevo sistema 86 00:07:29,699 --> 00:07:33,459 Donde se utilizan alumnos, animales o coches 87 00:07:33,459 --> 00:07:37,620 pues yo tengo ya una base, tengo ya el elemento coche creado 88 00:07:37,620 --> 00:07:42,259 y puedo pillar esa misma clase, ese mismo objeto modelizado 89 00:07:42,259 --> 00:07:46,040 traerlo a mi nuevo sistema, reutilizar ese código 90 00:07:46,040 --> 00:07:50,740 y luego si quiero, porque el nuevo sistema utiliza cosas un poquito distintas 91 00:07:50,740 --> 00:07:53,139 pues lo adapto al nuevo contexto 92 00:07:53,139 --> 00:07:57,500 pero digamos que la base, las cosas fundamentales 93 00:07:57,500 --> 00:08:00,680 a lo mejor las puede reutilizar de otros proyectos 94 00:08:00,680 --> 00:08:10,680 Esto de poder reutilizar el código es bastante importante porque me puede facilitar mucho o agilizar mucho la creación de nuevos proyectos. 95 00:08:10,680 --> 00:08:18,920 proyectos. ¿Dudas? Es un poco el concepto de no tener que reinventar la rueda cada vez. 96 00:08:19,120 --> 00:08:24,779 Si yo ya me he hecho un programa o un sistema que calcula la media de las notas de los alumnos, 97 00:08:25,100 --> 00:08:30,759 pues y ahora la necesito otra vez, no la re-implemento desde cero, sino me traigo las clases que 98 00:08:30,759 --> 00:08:37,190 necesito para que esto funcione y ya las tengo hechas. Característica de la programación 99 00:08:37,190 --> 00:08:42,769 nota de objeto, ¿vale? Creamos clases que definen unos datos y un comportamiento y creamos 100 00:08:42,769 --> 00:08:49,429 objetos de estas clases, ¿vale? Sostancialmente aquí trabajamos con dos conceptos, el concepto 101 00:08:49,429 --> 00:08:55,750 de clase y el concepto de objeto, ¿vale? La clase es un molde, es una abstracción, 102 00:08:56,490 --> 00:09:04,809 ¿vale? La clase es una definición genérica de un concepto que yo voy a modelizar, es 103 00:09:04,809 --> 00:09:10,269 alumno. ¿Qué alumno? ¿Este o este? No. El alumno en general. ¿Qué características 104 00:09:10,269 --> 00:09:14,649 tiene el alumno? Pues seguramente tendrá un nombre. Todos los alumnos tienen que tener 105 00:09:14,649 --> 00:09:21,070 un nombre. Tendrá una dirección. Pues cada alumno tendrá una dirección. A partir de 106 00:09:21,070 --> 00:09:27,470 este molde general, que tendrá nombre, apellido y materias cursadas, hago para decir, pues 107 00:09:27,470 --> 00:09:44,470 Crearé objetos. ¿Qué son objetos? Son instancias, son implementaciones concretas de la clase. Pensad de estar en la playa y tenéis las formitas, moldes que jugáis con la arena. 108 00:09:44,470 --> 00:09:48,269 ¿Cómo se llaman aquí? Los moldes, ¿vale? 109 00:09:48,690 --> 00:09:51,789 Vosotros tenéis el molde de una tortuga, ¿vale? 110 00:09:52,110 --> 00:09:57,049 Y ese molde no es una tortuga de arena, no sé si me explico 111 00:09:57,049 --> 00:10:01,730 Es una cosa que os puede permitir de crear una tortuga de arena 112 00:10:01,730 --> 00:10:10,049 Cuando vosotros pilláis la arena, la metéis ahí dentro y la pegáis al suelo dándole golpecitos con la pala 113 00:10:10,049 --> 00:10:12,830 Pues a ese punto habéis creado una tortuga de arena 114 00:10:12,830 --> 00:10:14,529 Esa es una instancia 115 00:10:14,529 --> 00:10:16,389 Y podéis sacar el molde 116 00:10:16,389 --> 00:10:18,970 Y crear cuantas instancias queráis 117 00:10:18,970 --> 00:10:20,929 Y tendréis 5 o 6 118 00:10:20,929 --> 00:10:23,750 Tortugas 119 00:10:23,750 --> 00:10:26,009 Todas iguales 120 00:10:26,009 --> 00:10:28,190 Pero cada tortuga es distinta 121 00:10:28,190 --> 00:10:29,889 ¿Se entiende? 122 00:10:30,549 --> 00:10:32,190 Las tortugas son objetos 123 00:10:32,190 --> 00:10:34,210 El molde las clase 124 00:10:34,210 --> 00:10:36,980 ¿Si? 125 00:10:37,779 --> 00:10:39,419 Luego tu cambias la clase 126 00:10:39,419 --> 00:10:40,820 Pillas la clase estrella 127 00:10:40,820 --> 00:10:42,679 Que es otra figurita 128 00:10:42,679 --> 00:10:44,659 Y haces cuantas estrellas quieres 129 00:10:44,659 --> 00:11:07,860 Entonces, objetos estrellas. Tú tienes la clase Scanner, que es una clase astrata que permite luego de usar métodos como leer de teclado, y creas un objeto Scanner, Scanner, Scanner, igual New, Scanner, y ese objeto Scanner es el lector para tu programa. 130 00:11:07,860 --> 00:11:09,620 ¿Se entiende? 131 00:11:11,480 --> 00:11:13,379 Entonces, la clase es general 132 00:11:13,379 --> 00:11:18,659 La clase me define una abstracción del concepto que yo voy a modelizar 133 00:11:18,659 --> 00:11:20,100 Es el modelo general 134 00:11:20,100 --> 00:11:29,139 A partir de este modelo general yo puedo crear muchos distintos objetos que son instancias concretas 135 00:11:29,139 --> 00:11:30,120 Mis alumnos 136 00:11:30,120 --> 00:11:35,340 Yo tenía un alumno, en general un alumno tiene que tener nombre, apellido y lista de materias 137 00:11:35,340 --> 00:11:44,440 Luego creo el alumno Paco Fernández y eso es un objeto, es un objeto concreto, ¿vale? 138 00:11:44,600 --> 00:11:50,419 Tendrá la misma estructura que todos los otros alumnos, tendrá un nombre, un apellido y las materias, ¿vale? 139 00:11:50,899 --> 00:11:58,259 Pero es un objeto concreto y podré crear cuantos objetos me da la gana, cuantas instancias de una clase me da la gana. 140 00:11:59,879 --> 00:12:02,720 ¿Se entiende? Volveremos sobre esto. 141 00:12:02,720 --> 00:12:06,639 Los objetos colaboran entre ellos para conseguir algo 142 00:12:06,639 --> 00:12:11,700 Entonces yo crearé varios objetos, crearé, por ejemplo, si quiero hacer una escuela 143 00:12:11,700 --> 00:12:18,620 Crearé mis alumnos, crearé mis profesores, crearé objetos materias, crearé objetos aulas, lo que haga falta 144 00:12:18,620 --> 00:12:22,659 Y luego estos objetos se irán componiendo entre ellos 145 00:12:22,659 --> 00:12:28,039 Por ejemplo, una escuela tendrá un array de clases 146 00:12:28,039 --> 00:12:32,759 Cada clase tendrá un array de alumnos y un profesor 147 00:12:32,759 --> 00:12:38,279 Y voy combinándolos de tal forma que los varios objetos se relacionan entre ellos 148 00:12:38,279 --> 00:12:40,500 Hablaremos de esto y lo haremos con calma 149 00:12:40,500 --> 00:12:44,460 Entre objetos, la forma de colaborarse es pasándose mensajes 150 00:12:44,460 --> 00:12:48,340 Para poder pasarse mensajes de un objeto a otro 151 00:12:48,340 --> 00:12:51,259 Se hacen con llamadas a métodos 152 00:12:51,259 --> 00:12:53,679 Llamadas a funciones y procedimientos 153 00:12:53,679 --> 00:12:56,539 Yo pillaré un objeto, el objeto alumno 154 00:12:56,539 --> 00:12:58,820 Y le daré método saluda 155 00:12:58,820 --> 00:13:01,919 Entonces llamaré sobre mi alumno Paco 156 00:13:01,919 --> 00:13:03,980 El objeto saluda 157 00:13:03,980 --> 00:13:05,539 El método saluda 158 00:13:05,539 --> 00:13:07,019 Y entonces Paco saludará 159 00:13:07,019 --> 00:13:08,679 Diciendo, hola, soy Paco 160 00:13:08,679 --> 00:13:10,960 Curso estas materias 161 00:13:10,960 --> 00:13:12,379 Y pondrá sus materias 162 00:13:12,379 --> 00:13:15,399 Si lo llamo sobre el objeto Sara 163 00:13:15,399 --> 00:13:17,340 Pues el alumno Sara 164 00:13:17,340 --> 00:13:18,500 Pues Sara dirá 165 00:13:18,500 --> 00:13:20,379 Oye, mira, soy Sara 166 00:13:20,379 --> 00:13:22,679 Y mis materias son estas otras 167 00:13:22,679 --> 00:13:24,259 ¿Se entiende? 168 00:13:24,259 --> 00:13:53,379 ¿Vale? Fijaos que la clase no cambia, o sea, todas las clases alumnos pueden saludar, tendrán el método saludar y tendrán un nombre, y el método saludar de este objeto dirá, escribe tú contenido de nombre diciendo hola soy contenido de nombre, luego se lo llamo sobre el objeto que tenía Paco en nombre, dirá hola soy Paco, y si lo llamo sobre el objeto que se llamaba Sara, pues dirá hola soy Sara. 169 00:13:55,889 --> 00:14:11,929 Entonces, dos conceptos que tienen que estar cada vez más claros. Clase, la abstracción, el concepto general, la modelización de lo que voy a hacer y luego los objetos, instancias concretas de este de aquí. 170 00:14:11,929 --> 00:14:17,230 Este es el molde y estos son los objetos que creo a través del molde. 171 00:14:18,309 --> 00:14:21,370 Cada clase va a ocuparse de lo que es su responsabilidad. 172 00:14:21,690 --> 00:14:27,590 Esto de poder crear clases me permitirá crear distintas clases, distintos tipos de objetos, 173 00:14:28,610 --> 00:14:33,149 que sustancialmente me permitirán hacer un poco lo que antes llamábamos de videovincerás. 174 00:14:33,149 --> 00:14:55,250 Yo a cada una de estas clases le asignaré un cierto número de posibles métodos, posibles funciones, posibles procedimientos que puedan hacer los comportamientos de estas clases y asignaré a cada clase comportamientos distintos para que luego pueda combinar estos entre ellos para obtener lo que yo quiero, el funcionamiento de la escuela. 175 00:14:55,250 --> 00:15:07,789 Pero en el funcionamiento de la escuela, los alumnos tendrán la responsabilidad de las acciones que son para alumno, los profesores tendrán las responsabilidades de las acciones para profesores, etc. 176 00:15:07,789 --> 00:15:18,049 Por ejemplo, el alumno tiene una serie de notas, hemos dicho, ¿quién rellena esas notas? Pues el profesor. 177 00:15:18,049 --> 00:15:30,870 Entonces, el profesor tendrá un método que pillará a un alumno y pillará una nota y irá a ese alumno a buscar su lista de notas y añadirá esa nota al alumno, por ejemplo. 178 00:15:32,970 --> 00:15:36,769 Vamos a ver lo que dice aquí, pero en un ejemplo. Ejemplo, coche. 179 00:15:37,649 --> 00:15:42,049 Un coche puede ser un ejemplo de clase, con unas características y una funcionalidad propia. 180 00:15:42,049 --> 00:15:49,049 Por ejemplo, un coche puede tener como características propias color, marca, modelo y matrícula. 181 00:15:50,029 --> 00:15:55,610 Está claro que a lo mejor en otros contextos, pues no me interesa el color del coche. 182 00:15:56,250 --> 00:16:03,090 Si yo soy un vendedor de coches y hago un sistema para vender coches, pues a lo mejor el color del coche me interesa mucho. 183 00:16:04,350 --> 00:16:11,330 Si yo soy, no sé, me lo invento, de la DGT y tengo que poner multas, el color del coche me interesa menos. 184 00:16:11,330 --> 00:16:14,389 Así me interesa porque la targa es en base al color 185 00:16:14,389 --> 00:16:16,049 Sí, pero me entendéis lo que quiero decir 186 00:16:16,049 --> 00:16:17,909 Dependiendo del contexto 187 00:16:17,909 --> 00:16:20,409 Puede ser que esta clase tenga unas características 188 00:16:20,409 --> 00:16:22,730 O otras, algunas que son fundamentales 189 00:16:22,730 --> 00:16:24,429 Porque si no, no puedo hacer el sistema 190 00:16:24,429 --> 00:16:26,389 Que yo quiero, o puede ser que haya 191 00:16:26,389 --> 00:16:28,649 Datos adicionales que me dejo allí 192 00:16:28,649 --> 00:16:30,470 Y que sean opcionales o lo que sea 193 00:16:30,470 --> 00:16:32,730 ¿Vale? En este caso en concreto 194 00:16:32,730 --> 00:16:34,950 Yo he decidido de modelizar un coche 195 00:16:34,950 --> 00:16:36,309 Y he decidido que el coche 196 00:16:36,309 --> 00:16:38,490 Las características que definen un coche 197 00:16:38,490 --> 00:16:40,309 En mi programa son su color 198 00:16:40,309 --> 00:16:42,269 Su marca, su modelo y su matrícula 199 00:16:42,269 --> 00:16:44,590 Cuando creo un coche 200 00:16:44,590 --> 00:16:46,590 Tendré que definir 201 00:16:46,590 --> 00:16:48,610 Cuál es su color, cuál es su marca 202 00:16:48,610 --> 00:16:50,789 Cuál es su modelo y cuál es su matrícula 203 00:16:50,789 --> 00:16:52,769 Entonces puedo crear el coche 204 00:16:52,769 --> 00:16:55,789 Renome 205 00:16:55,789 --> 00:16:59,149 Verde con matrícula 37 206 00:16:59,149 --> 00:17:01,190 Pues ese es un coche concreto 207 00:17:01,190 --> 00:17:03,190 Y luego me creo 208 00:17:03,190 --> 00:17:05,230 El Ferrari 209 00:17:05,230 --> 00:17:07,109 No sé el modelo de Ferrari 210 00:17:07,109 --> 00:17:08,109 Testa rosa 211 00:17:08,109 --> 00:17:09,650 Viejo pero bonito 212 00:17:09,650 --> 00:17:13,230 Rojo, como no, matrícula 95 213 00:17:13,230 --> 00:17:17,950 Mismo molde, pero ha hecho dos objetos distintos 214 00:17:17,950 --> 00:17:20,269 El Megane y el Ferrari 215 00:17:20,269 --> 00:17:22,930 ¿Sí? ¿Se entiende? 216 00:17:25,150 --> 00:17:29,210 Su funcionalidad, las funcionalidades del coche son desplazarse o parar 217 00:17:29,210 --> 00:17:33,569 Yo puedo o parar el coche, el coche se parará 218 00:17:33,569 --> 00:17:37,049 O puedo desplazar el coche de aquí a Zaragoza 219 00:17:37,049 --> 00:17:46,829 ¿Vale? Entonces ahora yo podré pillar el Megane, llamar el método desplazarse y darle como destino Bilbao. 220 00:17:47,309 --> 00:17:55,589 Ahora el coche verde, el Megane, hará un recorrido para llegar a... ¿Qué quiere decir desplazarse? No lo sé. 221 00:17:56,089 --> 00:17:57,789 Ya lo tendremos que definir. 222 00:17:57,789 --> 00:18:23,829 A lo mejor si mi sistema es para calcular rutas, pues cuando hace el desplazarse, pues calculará cuántos kilómetros ha recorrido. Si es para calcular gastos en términos de gasolina, pues cuando yo hago desplazarse, me calculará cuánto cuesta desplazarse hasta Bilbao en base a cuánto gasta el coche, cuántos kilómetros va a hacer, y entonces me devolverá, oye, mira, has gastado 30 euros. 223 00:18:23,829 --> 00:18:40,589 Si yo soy una empresa que tiene que repartir paquetes, por ejemplo, una empresa de logística, pues a lo mejor mi concepto es desplazarse para ver cuánto me cuesta mover una camioneta de aquí a Bilbao para entregar los paquetes que tengo que entregar ahí. 224 00:18:41,349 --> 00:18:42,609 Depende del contexto. 225 00:18:42,609 --> 00:18:45,250 pero mi coche 226 00:18:45,250 --> 00:18:47,589 he definido que tiene esta característica 227 00:18:47,589 --> 00:18:49,150 de aquí y puede hacer 228 00:18:49,150 --> 00:18:51,569 su comportamiento, sus métodos 229 00:18:51,569 --> 00:18:53,490 lo que puede 230 00:18:53,490 --> 00:18:55,529 hacer es desplazarse 231 00:18:55,529 --> 00:18:57,549 o parar, si quiero que pueda 232 00:18:57,549 --> 00:18:59,029 hacer otras cosas como 233 00:18:59,029 --> 00:19:01,430 no sé, tocar el 234 00:19:01,430 --> 00:19:03,410 claxon, pues tendré que crear 235 00:19:03,410 --> 00:19:05,130 un nuevo método 236 00:19:05,130 --> 00:19:07,289 no sé, pitar, que cuando lo llamo 237 00:19:07,289 --> 00:19:07,589 hace 238 00:19:07,589 --> 00:19:08,930 no sé 239 00:19:08,930 --> 00:19:11,630 pero todo depende 240 00:19:11,630 --> 00:19:15,150 Del contexto de que yo quiero que haga este coche 241 00:19:15,150 --> 00:19:22,750 Una clase coche es la responsabilidad de manejar todo aquello que tenga que ver con el coche 242 00:19:22,750 --> 00:19:26,509 Un garage con muchos coches puede hacer uso de ella 243 00:19:26,509 --> 00:19:29,309 O un constructor, o un conductor también 244 00:19:29,309 --> 00:19:36,470 Es decir, que el coche empaquetará todo lo que es relacionado con el coche 245 00:19:36,470 --> 00:19:41,369 Podría tener otra característica que sea velocidad, si me interesa la velocidad 246 00:19:41,369 --> 00:19:49,609 Podría tener otra característica que es lugar actual, si me interesa georeferenciarlo en algún lado del mundo 247 00:19:49,609 --> 00:19:54,930 Pero todo lo que está relacionado con coche, tiene que ir en coche 248 00:19:54,930 --> 00:20:01,549 No puedo crear coche sin matrícula y luego crearme otra clase y en esa clase decir 249 00:20:01,549 --> 00:20:02,849 ¿Y este coche tiene esta matrícula? 250 00:20:03,549 --> 00:20:07,549 No, matrícula es una característica de coche, tiene que ir empaquetado con coche 251 00:20:07,549 --> 00:20:12,150 todo lo que define coche, tanto en términos de características 252 00:20:12,150 --> 00:20:15,789 como en términos de funcionalidades que puede hacer coche 253 00:20:15,789 --> 00:20:17,769 tiene que estar en la clase coche 254 00:20:17,769 --> 00:20:19,990 ¿se entiende? 255 00:20:20,569 --> 00:20:24,650 entonces, ahora se me ocurre, quiero hacer una nueva cosa del coche 256 00:20:24,650 --> 00:20:27,470 que es, no sé, decelerar 257 00:20:27,470 --> 00:20:31,690 pues tendré que ir a la clase coche 258 00:20:31,690 --> 00:20:33,730 crear un nuevo método de decelerar 259 00:20:33,730 --> 00:20:36,910 y implementar allí el método de decelerar de coche 260 00:20:36,910 --> 00:20:39,210 Es decir, qué hace el coche cuando se decelera. 261 00:20:39,670 --> 00:20:44,829 Y posiblemente tendrá una característica velocidad y haré velocidad menos menos. 262 00:20:45,609 --> 00:20:48,549 Y tendré dos nuevos métodos que son acelerar y decelerar. 263 00:20:48,910 --> 00:20:52,509 Acelerar hace velocidad más más y decelerar hace velocidad menos menos. 264 00:20:52,930 --> 00:20:55,049 Por ejemplo, pero está todo siempre empaquetado. 265 00:20:55,410 --> 00:20:58,069 Los coches, lo que puede hacer el coche, están en la clase coche. 266 00:20:58,450 --> 00:20:58,829 ¿Se entiende? 267 00:21:02,819 --> 00:21:06,640 Si ahora me creo una nueva clase u otra parte de mis sistemas, 268 00:21:06,640 --> 00:21:08,599 Como por ejemplo, estoy haciendo un garage 269 00:21:08,599 --> 00:21:11,400 Entonces lo que está haciendo es un taller 270 00:21:11,400 --> 00:21:13,259 Entonces me llegan coches 271 00:21:13,259 --> 00:21:14,740 Y yo los tengo que clasificar 272 00:21:14,740 --> 00:21:16,759 Para luego decir qué problema tienen 273 00:21:16,759 --> 00:21:18,019 Etcétera, etcétera 274 00:21:18,019 --> 00:21:20,660 Pues entonces mi taller 275 00:21:20,660 --> 00:21:22,980 Puede identificar los coches 276 00:21:22,980 --> 00:21:24,700 Utilizando la clase coche 277 00:21:24,700 --> 00:21:26,779 Cada vez que viene un nuevo cliente 278 00:21:26,779 --> 00:21:28,940 Yo lo que hago es, créame un nuevo coche 279 00:21:28,940 --> 00:21:30,880 Y le pondré allí que el color es 280 00:21:30,880 --> 00:21:32,500 El color del coche que acaba de entrar 281 00:21:32,500 --> 00:21:34,720 La marca es la marca del coche que acaba de entrar 282 00:21:34,720 --> 00:21:36,140 El modelo, la matrícula 283 00:21:36,140 --> 00:21:47,779 Le pongo todos los datos y ahora me creo un nuevo objeto y este objeto se queda allí y es un coche que está en mi base de datos, en mi sistema, con el que luego podré hacer cosas. 284 00:21:47,779 --> 00:21:54,779 Por ejemplo, el garage podrá asignarle un técnico y el técnico podrá reparar el coche y lo que sea. 285 00:21:54,779 --> 00:22:05,019 también el mismo coche lo podría utilizar si en vez de hacer un sistema de taller 286 00:22:05,019 --> 00:22:11,519 pues es un sistema de préstamos de coches y yo tengo que identificar el conductor 287 00:22:11,519 --> 00:22:15,480 entonces yo tendré una base de datos de conductores, una serie de objetos conductores 288 00:22:15,480 --> 00:22:19,960 y a cada conductor cuando le presto este coche, pues lo que voy a hacer es alquilar este coche 289 00:22:19,960 --> 00:22:25,480 le voy a asignar el coche, no sé qué, el verde, me gana, no sé qué, no sé cuánto 290 00:22:25,480 --> 00:22:45,089 Estoy reutilizando la misma clase de coche para dos sistemas completamente distintos. ¿Se entiende? Podría ser que a lo mejor cuando uso coche como taller o cuando uso coche como alquiler coches, pues necesite algo de información distinta. 291 00:22:45,089 --> 00:22:51,009 En ese caso ya veremos como se puede pillar coche como base 292 00:22:51,009 --> 00:22:52,690 Todos los coches son así 293 00:22:52,690 --> 00:22:56,650 Pero en particular el coche para el taller tendrá estas características extra 294 00:22:56,650 --> 00:22:57,869 Esta funcionalidad es extra 295 00:22:57,869 --> 00:23:01,930 Entonces lo que haremos es extender esta clase 296 00:23:01,930 --> 00:23:03,109 Pero por ahora no 297 00:23:03,109 --> 00:23:08,450 Cuando queramos que un coche se desplace en un garage 298 00:23:08,450 --> 00:23:12,569 Por ejemplo tendremos que comunicarnos con el coche específico 299 00:23:12,569 --> 00:23:15,049 Y darle la dirección a la que queremos que se desplace 300 00:23:15,049 --> 00:23:17,009 O sea, pillaré el coche mega en verde 301 00:23:17,009 --> 00:23:18,470 Le diré, oye mira tú 302 00:23:18,470 --> 00:23:21,029 Objeto, utiliza tu método 303 00:23:21,029 --> 00:23:21,970 Desplazarse 304 00:23:21,970 --> 00:23:24,829 Y te doy como parámetro este garage 305 00:23:24,829 --> 00:23:26,970 Entonces tú lo que has hecho es moverte a ese garage 306 00:23:26,970 --> 00:23:28,970 O te doy este parámetro a este taller 307 00:23:28,970 --> 00:23:31,190 Pues entonces tú estás asignado a ese taller 308 00:23:31,190 --> 00:23:33,109 Dependiendo de 309 00:23:33,109 --> 00:23:34,109 Qué quiero hacer 310 00:23:34,109 --> 00:23:35,890 Más o menos 311 00:23:35,890 --> 00:23:41,500 Clases, una clase es lo que 312 00:23:41,500 --> 00:23:43,880 En el lenguaje de programación nos va a 313 00:23:43,880 --> 00:23:47,500 permitir definir o construir uno o varios objetos, ¿vale? 314 00:23:47,559 --> 00:23:52,240 Es mi molde, es la abstracción, es, no pienso en un objeto concreto, 315 00:23:52,640 --> 00:23:55,819 mas pienso en una categoría de objetos, en una clase de objetos. 316 00:23:56,319 --> 00:23:59,980 Cuando pienso a coche, no pienso a mi coche de casa, pienso a un coche en general. 317 00:23:59,980 --> 00:24:05,400 Si yo os digo, definidme un coche, vosotros me decís, el Megane blanco que tengo en casa. 318 00:24:05,400 --> 00:24:14,359 Es decir, un medio de transporte con cuatro ruedas, que tiene un motor y unos asientos 319 00:24:14,359 --> 00:24:18,339 Y eso no me has definido ni tu coche, ni el mío, ni otro 320 00:24:18,339 --> 00:24:20,519 Has definido una clase, un concepto 321 00:24:20,519 --> 00:24:21,619 Esto es lo mismo 322 00:24:21,619 --> 00:24:24,279 Cuando yo hago la clase, lo tengo que pensar así 323 00:24:24,279 --> 00:24:30,140 Voy a hacer un coche, pues le pondré número de asientos, le pondré color, le pondré cilindrada del motor 324 00:24:30,140 --> 00:24:35,220 Le pondré número de ruedas, lo que me haga falta a mí para luego modelizarlo 325 00:24:35,220 --> 00:24:45,720 Está claro que si yo soy el taller, pues a lo mejor no me interesa saber la temperatura del habitáculo. 326 00:24:47,849 --> 00:24:55,009 A un taller no le interesa. Le interesará saber si funciona o no el aire acondicionado como cosa para repararla o no. 327 00:24:55,349 --> 00:24:57,029 Pero no cuál es la temperatura actual. 328 00:24:57,029 --> 00:25:04,410 Sin embargo, si soy un sistema de gestión de carreras en el desierto 329 00:25:04,410 --> 00:25:09,210 Pues a lo mejor saber cuál es la temperatura actual del habitáculo del coche de carrera X 330 00:25:09,210 --> 00:25:14,150 Pues me interesa, porque si se pasa de 60 grados, pues le puede dar un problema 331 00:25:14,150 --> 00:25:17,670 Entonces, no sé si me explico lo que quiero decir 332 00:25:17,670 --> 00:25:21,329 No hay una forma de modelizar el coche 333 00:25:21,329 --> 00:25:26,930 Hay mil formas que dependen de lo que tú quieres del coche mismo 334 00:25:26,930 --> 00:25:33,380 podemos decir que son moldes para construir objetos, estos moldes tienen 335 00:25:33,380 --> 00:25:38,240 que ser de escritos o programados y cada molde va a tener unas 336 00:25:38,240 --> 00:25:47,000 características, un nombre, unos atributos y unos métodos, el cómo se llama este 337 00:25:47,000 --> 00:25:54,640 molde, esta clase, las características de esta clase que se llamarán los 338 00:25:54,640 --> 00:26:00,039 atributos vale los atributos de una clase son las características de los 339 00:26:00,039 --> 00:26:06,720 objetos que luego iré a crear vale y los métodos son las funciones proceduras y 340 00:26:06,720 --> 00:26:13,059 características y comportamiento que puede hacer este objeto en mi clase se 341 00:26:13,059 --> 00:26:18,940 llama coche este es su nombre sus características son color marca 342 00:26:18,940 --> 00:26:21,039 Modelo y matrícula 343 00:26:21,039 --> 00:26:22,799 Y sus métodos son 344 00:26:22,799 --> 00:26:23,920 Desplazarse y parar 345 00:26:23,920 --> 00:26:29,319 ¿Sí? ¿Dudas? 346 00:26:31,779 --> 00:26:33,859 Entonces, por ejemplo, una clase 347 00:26:33,859 --> 00:26:35,660 Que no usaremos casi nunca 348 00:26:35,660 --> 00:26:37,160 La clase persona, ¿vale? 349 00:26:37,559 --> 00:26:39,759 Se define en un fichero que tiene el mismo 350 00:26:39,759 --> 00:26:41,519 Nombre y extensión java, ¿vale? 351 00:26:41,559 --> 00:26:43,519 Punto java, es decir, que si yo voy a crear 352 00:26:43,519 --> 00:26:45,579 La clase persona, public 353 00:26:45,579 --> 00:26:47,819 Class persona, la tendré 354 00:26:47,819 --> 00:26:49,900 Que crear en persona punto java 355 00:26:49,900 --> 00:26:51,440 ¿Sí? 356 00:26:51,579 --> 00:26:53,660 Y esto lo vamos 357 00:26:53,660 --> 00:26:56,079 haciendo desde el principio, si os acordáis 358 00:26:56,079 --> 00:26:57,759 la primera vez que hicimos 359 00:26:57,759 --> 00:26:58,900 la clase hello world 360 00:26:58,900 --> 00:27:01,660 y os dije, la clase hello world la tenéis 361 00:27:01,660 --> 00:27:03,640 que guardar en hello world.java 362 00:27:03,640 --> 00:27:05,940 se tiene que llamar igual, con la misma mayúscula 363 00:27:05,940 --> 00:27:07,640 sin minúscula 364 00:27:07,640 --> 00:27:09,599 y luego la compilábamos 365 00:27:09,599 --> 00:27:11,759 o lo que sea, pero cuando una clase 366 00:27:11,759 --> 00:27:12,680 es pública 367 00:27:12,680 --> 00:27:15,039 si no es pública 368 00:27:15,039 --> 00:27:17,619 esto no vale, lo veremos más adelante 369 00:27:17,619 --> 00:27:19,019 cuando una clase es pública 370 00:27:19,019 --> 00:27:21,240 tiene que estar en un fichero que se llama 371 00:27:21,240 --> 00:27:23,440 como la clase .java 372 00:27:23,440 --> 00:27:27,960 La palabra reservada class es para definir una clase 373 00:27:27,960 --> 00:27:33,259 Public class ejercicio 1 374 00:27:33,259 --> 00:27:35,480 Pues nosotros estábamos creando una clase ahí 375 00:27:35,480 --> 00:27:37,279 Luego no la usábamos como clase 376 00:27:37,279 --> 00:27:39,500 Porque nosotros no sabíamos que es un objeto 377 00:27:39,500 --> 00:27:41,299 Y no estábamos programando orientada a objetos 378 00:27:41,299 --> 00:27:43,220 Pero la idea es esa 379 00:27:43,220 --> 00:27:45,819 Todos los ejercicios que hemos hecho nosotros 380 00:27:45,819 --> 00:27:47,259 Hemos creado clases 381 00:27:47,259 --> 00:27:50,319 Usadas impropiamente, pero hemos creado clases 382 00:27:50,319 --> 00:27:52,660 Definimos los atributos 383 00:27:52,660 --> 00:27:55,240 Los datos relevantes y los métodos 384 00:27:55,240 --> 00:27:57,059 O sea, el comportamiento de cada clase 385 00:27:57,059 --> 00:27:58,859 ¿Habéis visto algo de OML? 386 00:28:00,339 --> 00:28:01,680 Universal Modeling Language 387 00:28:01,680 --> 00:28:03,539 Todavía no, lo veréis 388 00:28:03,539 --> 00:28:07,579 Existe un lenguaje general 389 00:28:07,579 --> 00:28:12,799 Universal para definir cosas 390 00:28:12,799 --> 00:28:15,579 Dentro del mundo de la informática 391 00:28:15,579 --> 00:28:18,480 Que crea una serie de diagramas 392 00:28:18,480 --> 00:28:20,200 De diagramas de funcionalidad 393 00:28:20,200 --> 00:28:21,279 Diagramas de clases 394 00:28:21,279 --> 00:28:31,980 diagrama de casos de usos, diagrama de no sé qué, que sostancialmente es una forma de modelizar y documentar antes de implementar las cosas, 395 00:28:32,539 --> 00:34:28,460 los datos de este objeto, si lo llamo sobre este objeto, me utilizará esto. 396 00:34:28,699 --> 00:34:33,940 Cuando un método depende del objeto, no tiene el static. 397 00:34:33,940 --> 00:34:48,699 Cuando depende de un objeto, cuando el resultado utiliza elementos, atributos que son propios del objeto, el método no es estático. 398 00:34:50,260 --> 00:35:02,139 Si el método no depende del objeto, sino depende de la clase, es decir, que cualquier objeto de esa clase haría lo mismo, 399 00:35:02,139 --> 00:35:06,679 no depende de si es Paco o si es Sara 400 00:35:06,679 --> 00:35:08,840 porque siempre haría lo mismo 401 00:35:08,840 --> 00:35:11,760 pues entonces puede ser estático 402 00:35:11,760 --> 00:35:17,230 cuando es estático 403 00:35:17,230 --> 00:35:20,130 no se llama sobre un objeto 404 00:35:20,130 --> 00:35:22,369 sino se llama sobre una clase 405 00:35:22,369 --> 00:35:24,889 y por ahora esto es complejo 406 00:35:24,889 --> 00:35:26,750 lo retomaremos más adelante 407 00:35:26,750 --> 00:35:29,369 por ahora simplemente sepáis que hay dos formas 408 00:35:29,369 --> 00:35:31,610 de utilizar static y no static 409 00:35:31,610 --> 00:35:35,030 y que antes todos los métodos que hacíamos nosotros 410 00:35:35,030 --> 00:35:37,349 le poníamos el static porque no sabíamos que era 411 00:35:37,349 --> 00:35:38,650 ahora 412 00:35:38,650 --> 00:35:40,989 cuando estamos trabajando con objetos 413 00:35:40,989 --> 00:35:42,849 ese static se pierde 414 00:35:42,849 --> 00:35:44,550 para 415 00:35:44,550 --> 00:35:45,849 estos 416 00:35:45,849 --> 00:35:48,550 estos métodos de aquí 417 00:35:48,550 --> 00:35:50,929 los métodos que definen 418 00:35:50,929 --> 00:35:52,349 el comportamiento del objeto 419 00:35:52,349 --> 00:35:54,710 pero por ejemplo el main 420 00:35:54,710 --> 00:35:57,030 el main es un 421 00:35:57,030 --> 00:35:59,170 punto de acceso donde empieza mi trabajo 422 00:35:59,170 --> 00:36:01,070 ¿vale? entonces eso tiene que 423 00:36:01,070 --> 00:36:03,090 ser static, no puede depender de un 424 00:36:03,090 --> 00:36:05,050 objeto. Porque tú 425 00:36:05,050 --> 00:36:07,030 cuando empiezas el programa, los objetos ni siquiera 426 00:36:07,030 --> 00:36:08,510 los tienes. Entonces, ¿sobre 427 00:36:08,510 --> 00:36:10,889 qué objeto lo usas si no tienes objetos? 428 00:36:13,280 --> 00:36:13,400 ¿Sí? 429 00:36:14,440 --> 00:36:16,599 Por ahora, nosotros centrámonos en 430 00:36:16,599 --> 00:36:18,860 los objetos. Haremos los métodos así. 431 00:36:19,260 --> 00:36:20,539 El único que tendrá static 432 00:36:20,539 --> 00:36:22,420 a partir de ahora, grosso modo, será 433 00:36:22,420 --> 00:36:23,260 el main. 434 00:36:25,000 --> 00:36:26,719 Luego, con el pasar del tiempo, 435 00:36:26,840 --> 00:36:28,840 cuando tendremos más claro que es una clase 436 00:36:28,840 --> 00:36:30,599 que es un objeto, ya 437 00:36:30,599 --> 00:36:32,880 retomaremos este concepto de static 438 00:36:32,880 --> 00:36:38,519 no static y volveremos a explicarlo con la idea de ahora ya sé que es un objeto una clase y vamos a 439 00:36:38,519 --> 00:36:45,900 ver cuál es la diferencia por ahora sepáis simplemente que cuando no tiene static es algo que se refiere 440 00:36:45,900 --> 00:36:52,380 a un objeto no puedo llamar un método que no es static si no tengo un objeto por algún lado ahora veremos