Bien, por fin. Vale, muy bien, pues nada. Ya sabéis que voy a grabar la tutoría y luego la pondré por ahí en el enlace en Academos y en el curso virtual en el Ágora este hay un apartado que es el libro del tutor o algo así. Pues ahí en el libro del tutor pondré también el enlace. Pondré las transparencias también de lo que estamos viendo para ver si os sirve. Y bueno, a vosotros les voy a pasar el papelete este para que firméis. Y bueno, pues nada, como sé que siempre hay gente que no pudo asistir el primer día y no hubo grabación, pues voy a recordar ahí un poco. Las cosas importantes, ¿no? Por ejemplo, lo de la práctica. Hay una práctica obligatoria, ¿no? Que es la gestión del hospital universitario que tenéis que matricularos, apuntaros en un grupo y eso se hace en el sitio web de prácticas.uned.es, pero todavía no han salido los grupos. Los grupos yo creo que hasta bien entrada el mes que viene no saldrán. Seguramente puede que sean las fechas. Normalmente suelen ser como la semana antes de Semana Santa. La semana después, por ahí va la cosa más o menos. O sea que después de la sesión práctica todavía tendréis más o menos un mes o un poquillo más para terminar la práctica. Y bueno, la práctica la corrige vuestro tutor de prácticas. Yo no la voy a corregir porque yo no soy tutor de prácticas. Así que bueno, si me queréis preguntar algo, pues podéis preguntármelo. Pero vamos, yo de la práctica tampoco tengo mucha idea. Y bueno, también los que vinisteis el otro día. En el otro día os enseñé el entorno de desarrollo este en el que hay que hacer la práctica, el BlueJay. Y como no se grabó, pues nada, esos momentos se perderán en el tiempo, como lágrimas en la lluvia. Pero aparte del ejemplo este del proyecto de las formas, este era... A ver, está muy cutre. Este, ¿no? Sí, este era mejor. Yo os dije que se podía... Con el botón derecho se podían crear objetos nuevos. ¿Veis? Aquí teníamos... Y aquí una vez que el banco... Este era el banco de objetos y aquí en el banco de objetos podíamos también con el botón derecho seleccionar métodos para ejecutar cosas, ¿no? Y uno de ellos era dibujar. Pues en este caso, pues le dábamos y nos salía aquí esta casa tan maravillosa. Entonces, como las formas estas se podían cambiar de color. Podían cambiar de color con... Bueno, también se puede poner en blanco y negro y luego pintar. Ahora voy a salir el dibujito en blanco y negro. No, ¿por qué? A ver... Ahora. Vale. Bueno, en el otro proyecto en el que había cosas individuales, por ejemplo aquí un nuevo triángulo. Lo podía hacer visible para que estuviera dibujado. Y una cosa que podía hacer aquí era... Cambiar el color. Cambiar el color para pasarle parámetros a los métodos en el BlueJay este. Pues en caso del color, como es un string, pues yo le pongo un string y la cosa pues más o menos funciona, ¿no? A ver si ha cambiado. ¿Esto es brown? No sé. La verdad que no parece, pero bueno. Bueno, ahí no entro porque estas cosas de los colores me hacen... Me hacen fallos. Pero hay otro que es el People este. Ajá. A ver, voy a cerrar este. Vale, vale. Entonces es una base de datos de personas, ¿no? Y hay... Pues personal y estudiantes. Voy a dar un pilar a esto y voy a hacer una nueva base de datos. ¿Veis? Y entonces aquí ya me empiezan los problemas, ¿no? Porque la base de datos esta tiene personas y puedo añadir una persona. No va a ser que las personas o son eso... O personal o estudiante. Entonces lo que voy a hacer, primero me voy a crear un estudiante. Un student. Y como veis, tiene un string que es el nombre. Pues lo voy a llamar Manolo. Y el año de nacimiento, pues yo qué sé. 2006, ¿no? Para que pueda ir a la universidad. Yo creo que algunos de vosotros han nacido en el 2006. Y un student ID, pues no sé. Le vamos a llamar 001. No hay como... Vale. Entonces ahora ya tengo un estudiante. Entonces, si yo cojo la base de datos esta y quiero añadir persona, el add person este, lo doy aquí y me va a pedir que introduzca un objeto de tipo persona. Entonces, como ya no es un string... Si fuera un string o si fuera un numerillo, pues sería muy fácil porque yo pongo el string. Pongo unas comillas. Escribo lo que sea. Y para el numerillo, pues escribo el numerillo y tantas cosas. Pero cuando... Aquí lo que me piden es un objeto, pues lo que voy a hacer es que voy a arrastrar el objeto este. El student ID este lo voy a meter aquí. No me ha hecho ni caso. Pero... Ahora sí. Student 1. Lo he metido y ahora ya tenemos el estudiante metido. Habéis visto que he pasado como parámetro un objeto en el ID este. Entonces, si lo doy al método de listar, pues aquí justamente nos va a salir Manolo con acciones 2006 y tiene como... Es estudiante y su identificador es 001, ¿no? Así que yo os invito a que cojáis... Hay más... Los proyectos que hay del libro y los ejecutéis en el BlueJ y practiquéis un poco a ver si podéis hacerlos funcionar y que salgan las cosas, porque haciendo... Soltándose un poco con el BlueJ, ¿no? Todo bien. De momento, ¿alguna duda? ¿Alguna consulta? Que lo meto, ¿dónde? En lo último, esto del... En el... Ah, en la máquina de tickets esa. Uy, eso te lo he apuntado. Espera ahí. Creo que está en alguna transparencia o en algún sitio. ¿En alguna página del libro? En los ejercicios, en el ejemplo del libro. Sí, sí. Entonces, en la máquina de tickets si las sacas y ponen... Lo verás tú. Que por lo menos una persona riqueza está en punto y coma. Bueno, vaya. Para llamar a un metodista que pone el punto y coma al final, claro. Le llamas cuando vas a poner un precio, no le pones punto y coma y te da el retorno. Uy, pues... ¿Qué pasa? Que... Si ves el ejemplo ese, enséñamelo porque... El punto y coma tiene que estar. Aquí va a quedar todo en punto y coma. A ver, pues si os parece bien, podemos seguir, ¿no? A ver. Bueno, bueno. Vamos a lanzar esto. Aquí lo veo todo con... Las llamadas son con punto y coma al final. Si es la declaración del método, aquí no hace falta punto y coma. A ver. Bueno, que yo quería abrir este canal a probar. Es más lujoso. A ver. No sé si lo comparto con el... Con el Teams no veo mucho luego. Bueno, lo he compartido con el Teams pero luego no veo mucho del chat. Pero, en fin. Vale, pues... Sí. Pues no sé dónde está el lápiz inteligente este. Se lo deben llevar a... Haber llevado a la enfermería porque el otro día no funcionaba tampoco. Vale. Como vimos el otro día, ya somos unos expertos en la diferencia entre objetos y cámaras. Y clases y esas cosas, ¿no? Entonces vamos a hablar un poco de la interacción de objetos. Y los conceptos principales son la abstracción, la modularización y vamos a ver cómo se crean los objetos, unos diagramas de objetos y cómo llamar a los métodos. En este capítulo hay un ejemplo de código que es el... Que es un reloj. Es un reloj que tiene pues las... Que visualiza las horas y los minutos y va pasando el tiempo. Se va actualizando el display ese de las horas y los minutos. O sea que eso es con lo que vamos a trabajar en esta parte del capítulo. Y, bueno, pues según el libro es un reloj estándar de 24 horas estilo europeo. Esto es... Aunque sea una gran sorpresa pero sí, los americanos hacen lo del AM y el PM y por eso luego pierden todos los vuelos y los trenes y los autobuses y todo. Pero bueno. Y la hora de las 24 horas esto le llaman a la hora militar. Muy bueno. Completamente irrelevante para... A esto no, salvo que hay un ejercicio que dice que cómo se haría el reloj con el formato del AM y PM. Que no es tan inmediato como parece. Parece una petición así como muy sencilla pero luego hay que pensar un poquillo para hacerlo bien. Vale, entonces lo primero que quería decir sobre la extracción y la modularización es que es uno de los principios fundamentales de la programación orientada a objetos. Porque si habéis programado con lenguajes que no sean orientados a objetos pues es muy habitual que la modularización no sea muy buena. Que esté todo mezclado incluso en lenguajes que sí pero que tienen módulos y cosas de estas hay gente que lo mezcla todo. Pero sobre todo... Eh... El concepto clave es el de... El ocultamiento de la información. Entonces digamos que las clases corresponden con conceptos y lo importante es lo que hace una clase. Lo importante no es cómo lo hace y por eso normalmente lo que hace una clase a ti no te importa porque tú no lo puedes ver. Es decir, no puedes acceder directamente a los campos de la clase para cambiarles el valor o cosas por el estilo, por eso se considera una mala práctica ¿no? Tú tienes una clase y objetos de esa clase y lo que haces es llamar a los métodos de la clase esa para que hagan cosas ¿no? Eso ya digo yo que en C y en todo eso, eso no existe. Coges ahí pues llamar y coger cualquier variable, cualquier objeto que tengas para llamar le das y lo puedes modificar sin permiso de nadie ¿no? Además también hay ocultamiento de esto de la información. Entonces... Por ejemplo, si uno quiere el ejemplo clásico y viene en el libro porque en estas cosas de la informática pues hay tradición también. Entonces si uno quiere construir un coche, un coche es un sistema muy complejo ¿no? Entonces puede decir uno que va a tener ahí pues un motor, unas ruedas, un volante, yo qué sé, intermitentes y otras cosas mucho más complicadas que gracias a Dios yo desconozco. Pero... Trataría de hacer una modularización, es decir, de dividir el sistema de un problema complejo en cosas ¿no? Que podrían ser eso, el volante, las ruedas, el motor, este tipo de cosas. Y luego está el concepto de la abstracción. La abstracción es que cuando una parte digamos que ya está completada o a lo mejor la ha hecho otra persona u otro equipo, yo ya me olvido, o sea no pienso en qué tiene dentro, sino me centro únicamente en lo que hace. Entonces ahí las ruedas a mí me sirven para correr, yo tengo un método que se llama pues girar ruedas y ya está, yo ya no quiero saber nada más de la rueda, es como que me quito ahí todos los detalles de la cabeza y me centro solamente en la relación que tienen los objetos con digamos el siguiente nivel, que a lo mejor sería el coche ¿no? Entonces ya podría hacer una clase de coche, que el coche cogiera el volante, ahí pues gira el volante, gira las ruedas, mete marchas, cosas así. Eso es un poco un concepto importante ¿no? Lo que es complicado de hacer pues lo voy dividiendo en módulos que sean cada vez más sencillos y cuando son lo suficientemente sencillos pues entonces los codifico, los programo y ya me paso al nivel de abstracción en el cual ya me olvido de lo que tienen por dentro de Intringulis y ya simplemente me centro en lo que sería la interfaz. Te van a hacer los métodos públicos de lo que yo puedo llamar para hacer cosas con ellos ¿no? Se me tiene que encasar ahí en el nivel digamos superior. Entonces yo ahora pasaría a la esa pero no puedo. Vale. Un concepto, o sea una herramienta que se utiliza a veces son los diagramas. Esto es la práctica y todo eso pues os van a pedir que hagáis un diagrama de clases y cosas de esas porque es una cosa que es muy apañada. Esto lo vamos a ver aquí a la derecha ¿no? El diagrama de clases que yo para este ejemplo tan sencillo voy a tener una clase que es la clase principal que va a ser el visor del reloj y voy a utilizar como clase de apoyo otra clase que se va a llamar visor de números. El visor de números es una cosa que te pone dos dígitos y voy a tener dos objetos de esos que va a ser uno para las horas y otro para los minutos. Parece razonable ¿no? Vale, pues esta sería la relación de las clases. Le he puesto aquí la flechita esta y esto lo podéis interpretar como que la clase visor del reloj utiliza la clase visor de números. El nivel de esta asignatura yo creo que con eso va a quedar. Normalmente se diría que es una relación de composición o alguna cosa de estas pero luego hay otras que son de herencia pero la herencia la veremos más adelante. Así que de momento la clase del visor del reloj utiliza el visor de números y esos también en el BlueJ si lo habéis visto las cajitas esas de las clases pues también tienen flechitas entre ellas ¿no? Representan lo mismo. Entonces la diagrama de clases es una cosa estática porque las clases son las que son. Eso, si tú te pones a ejecutar el programa las clases siguen siendo las mismas y la relación entre las clases tampoco cambia. Con lo cual es una cosa estática. Sin embargo el diagrama de objetos que es lo que está a la izquierda. Es un invento distinto. Es una cosa esencialmente dinámica. Es decir que eso es como que paramos la ejecución del programa y entonces en un momento dado vamos a ver qué objetos tenemos y los valores que tienen esos campos de los objetos esos ¿no? Entonces si yo tengo ahí mi reloj y lo paro pues entonces tengo un objeto aquí que se llama mi visor que es del tipo visor de reloj. Vale. Y tiene un campo para las horas y otro campo para los minutos. Como son campos a otros, esos campos son objetos a su vez no, como ya dije el otro día no son tipos básicos. Entonces todo lo que no es un tipo básico pues es un objeto y hay que acceder a él a través de una flechita que recuerda sospechosamente a los punteros ¿eh? Pero mucho mucho. Entonces las horas por ejemplo pues apunta a un objeto que sería, no le he puesto nada nombre pero en este tipo de visor de número pues ala aquí tiene un once. El once si lo puedo poner directamente porque es un número y es un tipo básico ahí no hay flechita ni hay nada ¿no? Y los minutos pues nada tengo otro objeto de visor de número que el su valor pues es cero tres. O sea tiene un campo dentro que vale cero tres o sea serían los once y tres y ya está yo creo que el concepto luego se vuelve más complicado pero vamos de vez en cuando sacaremos diagramas de estos. Esto se entiende ¿no? Claro, es que vinieron el otro día que sabían mucho ahí ya se han ido ¿no? Acabo de estudiar Teleco yo creo que trabajaba ahí y sabía programar mucho. Vale pues aquí tenemos otro ejemplo. Aquí esto está un poco más currado porque si lo pensáis como siempre hay varias versiones de lo del reloj este empieza siendo pues la versión chapucera y luego la va dejando en una cosa pues que funciona un poco mejor. Es como la vida misma. Entonces ¿qué vamos a hacer? Pues bueno los visores estos de número nosotros sabemos que las horas pues hay veinticuatro horas entonces le vamos a poner el límite veinticuatro para que así cuando lleguemos a veinticuatro pues de la vuelta se ponga cero y en los minutos pues nos interesa que cuando llegue a sesenta se ponga cero entonces ese va a ser su límite ¿no? Entonces aquí en este diagrama de objetos lo tenemos visto con más detalle ¿no? Aquí por ejemplo serían las quince y veintitrés y ya sabéis que aquí en este diagrama de objetos sabemos que los visores de número estos aparte de un valor tienen también un límite que es cuando se vuelve a poner a cero el marcador ¿no? Vale. Pues esta es la clase visor de números, la clase de apoyo que se lo he mostrado a dígitos que he puesto aquí para que no haya confusión. Entonces tenemos unos métodos que son de estos métodos de acceso y modificación que siempre se suelen llamar con set lo que sea y get lo que sea. En el libro de hoy le llaman mutadores y no sé qué pero bueno son los de acceso y modificación de toda la vida. Entonces aquí set valor pues le vamos a poner un valor ahí al número ¿no? Y le pasamos pues justamente el nuevo valor que queremos. Entonces aquí hacemos, esto es algo del chat ¿no? A ver, es alguien que está en la sala espera. Uy del chat hay un montón de cosas. Es que no me sale en el reloj. Creo que tengo que entrar en el Teams con el teléfono. Esto es muy complicado ¿eh? Con tanta cosa. A ver, vamos a intentarlo. Porque así puedo ver el chat en el reloj. Voy a unirme. Agregar dispositivo. Está grabando y transcribiendo. Pues sí. Sí, sí, parece que el chat está por aquí. A ver. Uy está súper pequeña. Pues el otro año pasado lo veía. Perdimos cómo se pone el chat solo. Bueno, ya llegarán. A ver, voy a poner un... Escuchas, escuchas, pero no se ve nada. ¿Eh? No se ve la pantalla. ¿Y la estoy compartiendo? Pues bueno, pues déjame ver como testigo. Ahora. Ah, bueno. Claro, eso es normal. Eso es lo que pasa. Efectivamente, la referencia. ¿Qué pasa si me entrega la práctica obligatoria? Suspendes la práctica. Y si no apruebas, no apruebas la asignatura. Es fácil. No puedes realizar el examen, dice Pablo Fernández. Pues te equivocas, Pablo. El examen puedes hacerlo porque tú has pagado la matrícula. De hecho, antes lo impedíamos, pero nos demandaron. Y entonces ahora puedes suspender la práctica, puedes ir al examen tranquilamente. No la vas a aprobar. Pero el examen puedes hacerlo porque es tu derecho. ¿Son individuales? Pues sí son individuales. Vale, muy bien. Pues parece que estoy al día del chat. Espero que me salga en el reloj ahora. A ver. Vale, pues entonces lo que quería hacer en el set valor este, pues para ponerle un valor ahí que se servirá para las horas o para los minutos o en un objeto que sea, lo primero que hago aquí es una validación en la primera línea para que el valor nuevo sea mayor o igual que cero y sea menor que el límite porque no voy a poner que son las 27 horas o la hora de menos 3 porque eso no estaría muy bien entonces bueno, si eso el valor es razonable, pues a valor le hacemos el nuevo valor que le he bajado y todos somos felices. Esto de la validación de los datos de entrada es muy importante pero ya habría que hacerlo siempre porque nunca te puedes cuidar de los datos que te llegan que es una causa bastante habitual de muchos problemas y mucho dolor pero bueno, y que todos los hackers como es natural, pues explotan que la gente no compruebe las cosas y al final pues pasa lo que pasa Bueno, el getValor creo que lo podéis imaginar, pero bueno getValor del visor hay dos puntos en medio para distinguir la hora de los minutos voy acelerando aquí la parte que no es relevante pues me da cuenta y tenemos los operadores lógicos, porque aquí ya hemos visto el line este, el if, ya lo conocéis del c más menos y si os habéis maturado en el segundo cuatrimestre pues no es una condición lógica que tiene que ser verdadera o falsa en principio o también puede ser error y que hace el programa hacer la tercera opción y cuando la condición es cierta pues entonces se ejecuta lo que hay debajo y a veces hay una cosa que es el else y es lo que se ejecuta cuando la condición es falsa volveremos sobre ello entonces tiene los operadores lógicos de c, ahí no se calentaron mucho la cabeza entonces los dos ampersand sextos es un i lógico entonces este es cierto cuando a es cierto y b es cierto los dos palotes estos es el o lógico es uno inclusivo este es cierto cuando a es cierto o b es cierto y si a y b son ciertos los dos pues también es cierto y en la la admiración esta esto es la negación entonces no a es como lo contrario de a si a es cierto pues la negación es falsa y si a es falso pues no a es cierto y esto tiene una evaluación en cortocircuito esos que tienen el doble ampersand el doble palito eso quiere decir que si viendo el primero ya sabemos cuál va a ser el resultado el segundo no lo evaluamos entonces si estoy mirando a y b si a es falso pues yo ya sé que a y b va a ser falso porque ya sabemos que el segundo es falso es imposible que sean verdaderos los dos pues entonces el b ni lo miro y el cortocircuito con el o pues es el a o b si a es cierto ya pues va a ser lo que pase con b pues el resultado total va a ser cierto entonces el b no lo miro pues eso es una optimización porque está bien y también tiene su intringulis porque a lo mejor evaluar el b porque hace que fallara el programa y ponemos ejemplos de eso así que aparte de una optimización pues hace un poco un truqui pero normalmente se hace con cortocircuito porque va más rápido y existen las versiones sin cortocircuito que son poner solo un ampersand o solo un palito entonces aquí se evalúa obligatoriamente las dos cosas que no suele ser una gran idea pero bueno la opción está ahí entonces que es interesante de cómo incrementamos el valor de los visores estos que tienen ahí un valor y un límite ¿no? pues tenemos un método de incrementar y entonces lo que vamos a hacer va a ser esta cosa maligna el valor le vamos a asignar el valor más uno, módulo o límite entonces ¿pero qué es eso? bueno pues el módulo es el el nombre cursi del resto de la división entera entonces por ejemplo esto se llama módulo aunque está representado en un porcentaje entonces por ejemplo aquí yo que se ha puesto la tabla al 8 y la tabla del módulo sería pues 0 entre 8 pues da 0 1 entre 8 pues el cociente sería 0 pero el resto sería 1 entonces es 1 2 entre 8 pues el resto es 2 y así sigo 7 entre 8 pues el resto es 7 pero cuando llego al 8 8 el módulo de 8 pues es 0 porque el cociente es 1 y el resto es 0 pero no me sobra nada y ya con el 9 pues vuelvo aquí a empezar entonces esto es un poco aquí la ruleta de la fortuna que cuando voy llamando a incrementar pues el valor vale 0 1, 2, 3, 4, 5, 6, 7 y de repente vuelve a valer 0 entonces utilizo la cosa esta del resto de la división entera hay como truqui para que me sea más sencillo hacer las cosas podría haber puesto un código mucho más feo con no sé qué el se me hace cuanto patatín patatán para conseguir el mismo efecto pero pues lo hemos puesto así porque esto funciona muy bien y se utiliza mucho en todas las cosas que implican pues no sé buffers circulares o estructuras circulares de algún tipo yo que sé como productores consumidores y cosas de estas hay en programación concurrente pues todo el mundo tira del módulo listas enlazadas circulares cosas raras de estas el módulo siempre aparece y a ver en el test de la asignatura pues también sale el módulo incluso con vertientes hay un poco indeseado como qué pasa si algunos de los números son negativos el módulo puede ser negativo hay una de las preguntas del test que a veces cae depende fundamentalmente sobre esa cuestión estoy seguro que muchos nos habéis planteado que es normal vale entonces luego tenemos un sprint que va a ser el valor del visor y aquí sí que hace una cosa es bastante cutrosa porque si el valor es menor de 10 es decir que va a tener solo un dígito pues le añade aquí con la comilla cero comillas le añade un cero y se lo pega al valor esto es los strings el más este sirve para concatenar strings entonces si valor es un string bueno no no es un string valor es un número estoy sumando estoy aquí haciendo un string más un más un número pues esto es un tipo típico caso de esto de promoción de tipos en una mesa de promoción aquí Isaba ya sabe que si tú a un string le sumas un número lo que quiere decir es que el número lo conviertas en un string y que concatenes los dos entonces ya me saldría pues yo que sé 0.9 o 0.8 el valor que fuera ¿no? y si el valor es mayor de 10 entonces no tengo que añadirle nada lo que me hace es que devuelvo las comillas comillas esto es más valor es decir el mismo truco de convertir el número en un string pero sumándolo en una cadena vacía entonces otro otro truco realmente esto es una forma bastante guarra de hacerlo hay formas mucho mejores pues bueno en el libro han decidido que esto tenía el máximo valor pedagógico y nada yo pues lo voy a respetar pues tú imagínate que que estábamos con con los minutos y entonces estás en el minuto 58 ¿no? pues a 58 pues dices pues ahora calculo 58 más 1 que es 59 y luego el módulo de entre 60 entonces 58 entre 60 o sea 59 entre 60 pues da 0 y el resto es 59 ¿no? pues entonces efectivamente le he sumado 1 al valor o sea el valor ahora vale 59 pero si yo vuelvo a llamar voy a tener que 59 más 1 es 60 y cuando le haga el módulo va a ser la división entre 60 el cociente me va a dar 1 pero el resto me va a dar 0 y entonces el valor que le voy a poner al valor va a ser 0 es la forma de hacer que cuando pasa al límite se ponga a hacer el contador ¿no? vale por ahora todo bien ¿no? a ver no ha salido nada vale parece que hay poca animación ahí en el chat eso es bueno sigamos bueno otros conceptos que son importantes son objetos que crean objetos hasta ahora los únicos objetos que hemos creado han sido con el blue j dándole al botón derecho al new entonces tenemos que la clase visor del reloj va a tener dos visores de números ¿no? como he dicho uno para las horas y otro para los minutos y la forma de crear nuevos objetos en Java es con la palabra esta new entonces podemos hacer un new visor de números 24 pues esto me haría un nuevo visor de números con el límite que sea 24 lo veremos un poco más adelante ¿qué pasa con lo veis? este sería el parámetro formal el límite máximo y aquí he hecho la llamada y este es el parámetro actual que he puesto 24 que es lo que va a tomar el valor este límite máximo entonces constructores pues ya dijimos que los constructores son como métodos pero bueno que cogen resuelven espacio de memoria inicializan los campos del objeto y hacen pues lo que diga el código no tenemos por qué tener solamente un constructor es decir se puede elegir ¿veis? se puede hacer un new visor de reloj este que empieza a que son las las 12 de la noche ¿no? las 0000 o puede hacer un new visor de reloj que indicando la hora y el minuto en el que quiero que sea para ponerle la hora al reloj ¿no? entonces el java va a distinguir una cosa de la otra fácilmente porque este no tiene parámetros y este pues tiene los parámetros ¿no? así que no hay confusión en cuanto a cuál de los dos constructores quiero llamar pues voy a tener la definición de los dos ¿no? otra cosa ¿cómo llama un una clase como llama a sus a sus campos ¿no? pues lo que llama aquí llamada métodos internos entonces la clase visor del reloj ¿veis? este es el este es el constructor sin parámetros que he dicho antes entonces hace las horas hace un new visor de número 24 y los minutos el límite es 60 y luego llama a actualizar el visor pues bueno para que se para que se vea ¿no? que son las 00 horas y entonces estos métodos este método de aquí actualizar visor es un método de esta misma clase entonces yo lo único que hago es poner el nombre y los paréntesis pero si son métodos externos aquí la clase visor del reloj tiene un método tic tac y vamos a llamar a justamente a los objetos que tiene el otro visor de número entonces el tic tac este es que ha pasado un segundo ¿no? es el minutos que es uno de los visores de número lo que llama incrementar entonces pongo el nombre del objeto punto el nombre del método es lo que llama la anotación del punto el nombre del objeto y el método que quiere llamar pues con esto he incrementado ahí los minutos ¿no? bueno es que ha pasado un minuto no un segundo entonces voy a preguntarle y aquí ha notado lo mismo minutos punto que es valor que me diga qué hora es si es el cero pues es que acabo de acaba de pasar una hora ¿no? porque se ha puesto a cero pues aquí lo pone esto es el comentario ¿no? que las dos las dos barras estas alcanzan el límite pues entonces como ha pasado una hora lo que voy a hacer va a ser incrementar la hora ¿ves? si se cumple que acabo de que al actualizar los minutos están a cero pues es que ha pasado una hora pues llamo a la hora asunto implementado para que suba otra hora y ya llamo a actualizar el visor este para que me ponga la hora que es bueno la idea aquí es la diferencia entre los métodos internos que lo llamo sin poner nada más pongo el nombre del método y ya está y cuando son métodos externos pues tengo que poner el objeto que es el el objeto que es el dueño del método al que quiero llamar ¿no? y ya está otro capítulo más ¿habéis visto que rápido? si vamos a terminar enseguida para no tener dudas ni nada bueno yo os recomiendo carecidamente que hagáis los ejercicios del libro ¿no? entonces ya digo hay alguno como ese de convertir el ejemplo en un reloj de 12 horas con el AM y el PM que bueno es interesante da ahí para pensar ¿no? sí pero es en el libro de profesores pues es la vida del informático tú crees que el programa lo has hecho fenomenal y luego resulta que funciona fatal te dice que que hagas un reloj de 12 horas pues tú lo programas coño y lo pruebas de hecho en el libro hay un capítulo muy interesante dedicado a pruebas y pruebas unitarias y pruebas de conjunto y todo eso y pues lo que sea no está en el temerio una cosa fascinante pero pero así es claro la de las pruebas es siempre hay el el hijo adoptivo ahí, de la programación que nadie nadie le hace caso los programadores no hacen test y los y los profesores pues tampoco quieren saber nada de ello el resultado es que la calidad del software pues es bastante penosa pero bueno sí así es la vida en fin yo os invito a que hagáis los ejercicios y sí no es evidente si cuando está bien hecho el ejercicio o no pero eso hay que vivir con eso cada vez que haces un programa te va a pasar eso menos en la práctica ya te dirán si estás vale entonces capítulo 4 bueno yo de verdad os invito a que leáis el libro eso como mínimo de verdad que intentéis hacer los ejercicios vamos a agrupar objetos porque hasta ahora todo lo que hemos hecho que solo ha sido la máquina de boletos esa la máquina de tickets y el el reloj pues son las cosas un poco tristes porque en fin eran cosas que que había que eran pequeñitas y la los ordenadores no se inventaron para eso los ordenadores se inventaron pues para ordenar un trillón de números y hacer cosas de esas cosas cosas masivas porque luego para sumar cuatro números pues no hace falta inventar ordenadores o sea que aquí de lo que se trata es de meter la mayor tralla posible y para eso justamente hay que agrupar objetos ya no te van los objetos de uno en uno sino que tiene que ser un mogollón de cosas entonces para tratar con un mogollón de cosas vamos a tener algunas estructuras que nos va a dar el lenguaje en este caso Saba y el ejemplo con el que vamos a empezar es el de la agenda personal y es un ejemplo muy bueno porque en la informática como en todo en la vida el marketing es muy importante entonces lo que vamos a hacer va a ser una especie de lista de strings que se pueden listar y se pueden añadir strings y se pueden borrar pero realmente eso que es una guarrería lo vamos a llamar por ejemplo la agenda personal entonces tú dices que es una lista de strings pues eso suena a cosa cutre pero si tú dices que es una agenda personal ya suena guay entonces hay que vender un poco el producto entonces se permite almacenar notas que realmente son strings no hay límite al número de notas que se pueden almacenar muestra las notas de manera individual y se puede saber cuántas notas hay almacenadas bueno esto es una que no hay límite al número de notas que se puedan almacenar es una de las maravillas de la vida moderna porque cuando yo era joven hace muchos muchos años esto no existía entonces cuando tú hacías un array o algo de eso era en suerte de longitud fija y tenías que poner ahí un tope máximo aunque fuera un número muy grande y ya está no había estructuras dinámicas aquí Java le pone un tamaño a la red y si tú el tamaño ese lo sobrepasas pues coge y resuelve más memoria todavía copia lo de antes y borra lo primero pero todo eso lo hace de forma más transparente que tú no te enteras tú simplemente vas añadiendo cosas y la vida es maravillosa pero antiguamente cuando realmente había que programar ahí como casi meneando cables no era tan sencillo bueno entonces vamos a ver la clase ArrayList que va a ser una clase que nos va a servir para meter cosas dentro es una clase contenedor de estas que se llama y además es una clase genérica porque en cierto si veis esto el ArrayList y lo ponemos aquí entre los corchetes estos string que es una clase que va a contener string esto es la genericidad empezado en el Java 5.0 o sea que no no está siempre una de las cosas o problemas que tiene dar un curso o ser experto de Java o lo que sea es que realmente el Java ha evolucionado un montón en todos estos años y entonces esto es como una cosa arqueológica pues en el Java 1 pasaba no sé qué en el Java 2 pasaban no sé cuántos empezaban los números porque el Java 2 realmente era el Java 1.2 entonces lo que pasó en el Java es que empezó siendo horrible el Java 1.1 era horrible era el horror pero había que sacarlo porque había mucha presión y todo eso entonces lo sacaron y la gente dijo pero esto pero esta real mierda ¿qué es? y entonces todo el mundo decía pues que era horrible que era lentísimo no sé qué bueno yo lo recuerdo pues yo lo vi y entonces cuando sacaron el Java 1.2 pues le cambiaron el nombre a Java 2 para que pareciera que había que había cambiado muchísimo la cosa y la gente se olvidaba del Java 1 que era una cosa espantosa entonces bueno en todas esas épocas no había geneticidad luego explicaré las las implicaciones ahí de eso entonces lo primero que tenemos que hacer si queremos utilizar la clase ArrayList está en un programa en Java pues es importarla entonces hay que poner import java.util.arraylist entonces esto de importar clases es para que como en C los incluyes estos que incluyes hay otras cosas y también por ejemplo en vez de ArrayList podríamos haber puesto un asterisco y entonces habríamos importado todo lo que haya en Java útil que hay un montón de cosas pues la diferencia entre ponerlo y no ponerlo a la hora de compilarlo no hay ninguna pero en el en nuestro IDE en nuestro sector en el BlueJ creo que cuando te hace autocompletado si por ejemplo si tú usas el ArrayList te va a mostrar autocompletado relacionado con ArrayList y si pones el asterisco y hay 20.000 clases ahí en Java útil pues te va a hacer un autocompletado así larguísimo de un montón de cosas que probablemente no te van a interesar igual esta forma es mejor bueno entonces los ArrayList estos como dice su nombre se dicen desafortunado nombre pues es es como una lista entonces hay una cosa que va a ser la primera otra cosa que le pongas que va a ser la segunda la tercera la cuarta o sea pues eso una lista de cosas ¿no? entonces los métodos principales son AddGet y Size entonces lo primero tenemos que hacer con un ArrayList como con todas las cosas en Java es crear un objeto y entonces eso lo haríamos con un NewArrayList o de String y esto bueno hay muchos constructores pero de momento lo vamos a llamar sin parámetros que para gente vaga como yo es lo mejor entonces si tú tienes un String por ahí que es una nota que has escrito o lo que sea y quieres añadirla pues llamas al método Add y le añades una nota y luego bueno pues puedes seguir añadiendo notas y hacer cosas si quieres saber el tamaño cuántas llevas pues haces notas.size y eso te dice cuántas notas tienes guardadas por ejemplo si quieres acceder e imprimir una nota concreta pues harías el System.out println este y en notas harías get y en get pues pondrías el número de nota empieza por el cero o sea que la primera nota sería con el get cero y también se pueden quitar entonces con el método ves no sale como método destacado porque borrar madre mía entonces el remove este borraría el número de nota que lo digáis ¿no? el remove es es un poco dolor ya ya veréis que no es exactamente igual que los otros porque quitar cosas siempre siempre es delicado y luego luego veremos por qué bueno sabéis que ha muerto con esta transparencia de galerines ¿no? en realidad el tónico bueno entonces las características del ArrayList son que puede aumentar su capacidad interna tanto como sea necesario que mantiene la cuenta de cuántos objetos tiene y que mantiene el orden de los elementos tal y como han sido agregados aunque pasa una chorrada pues luego vamos a ver todas esas cosas las que no pasan nada de eso entonces será la diferencia será más clara dentro de poco bueno tipos está claro que en esto de la genericidad cuando no había genericidad un ArrayList era un ArrayList entonces te da igual un ArrayList de gatos que un ArrayList de perros en más que ya tenías perros y gatos juntos en la misma lista porque porque no tenía tipo el Array el ArrayList el problema es que como dijo un señor famoso en un libro es que metías perros y sacabas gatos porque cuando metías las cosas las metías y tenían un tipo pero cuando las sacabas ya no sabías de qué tipo eran y eso era un problema muy verde tardaba unos cuantos años en arreglarlo bueno el caso es que si yo tengo una lista de un ArrayList que son de personas por ejemplo sé que me saltaba algún ejemplo del libro porque ya sale la clase persona y no sé qué eso no va a ser lo mismo que un ArrayList de máquina de boletos que hay que decir que los tipos son distintos porque si yo tengo una variable que me la declaro que es de tipo ArrayList de persona no le puedo asignar un ArrayList de máquina de boletos porque me va a decir que los tipos son incompatibles pues los índices permitidos como he dicho empiezan por el 0 y van pues hasta el size menos 1 o sea tiene sentido y si se accede con un índice incorrecto si yo tengo 7 elementos y quiero acceder al elemento 1000 pues me va a dar una excepción que se llama Index Out of Bounds Exception ¿vale? nombre autoexplicativo y lo de las excepciones ya hablaremos bueno eso es justo es el último capítulo es exactamente el último tema pero vamos cuando hacemos algo mal pues se va a producir un error o una excepción y los errores es que el programa pues se ha muerto y ya está y las excepciones pues todavía se puede intentar arreglar algo pero se puede intentar hacer algo pero realmente si te da un Index Out of Bounds Exception ¿qué vas a hacer? eso es que está mal programado el programa no tiene sentido arreglar nada bueno entonces como he dicho nos gusta hacer procesado masivo automatizado de las cosas entonces para procesar una colección completa por ejemplo podríamos estar ahí metiendo notas y tal y nos gustaría hacer un listado de las notas una cosa que me gusta mucho en informática es hacer listados yo trabajé una temporada en empresas de informática en bancos y bueno les gustaban los listados pero era una cosa mala había una gente que se desayunaba ahí unos listados así de gordos y estaban ahí viéndolos y escribiendo muchos listados yo recomendaría evitarlos en la medida de lo posible los bancos ahí por completo pero bueno eso es mi opinión personal entonces bueno una opción para hacer un listado de nuestras notas sería por ejemplo pues sistema println empezamos con la primera pues no target 0 otra línea igual con el 1 y otra línea igual con el 2 y así pues si tenemos mil notas pues tenemos un programa de mil líneas no sé me parece la mejor manera de hacer las cosas o sea de lo cual siempre hay gente que efectivamente le dices que te haga un programa que sume mil números y te hacen un programa de mil líneas que eso lo he visto yo las mil líneas no pero si le dices 100 100 líneas sí que te hacen bueno entonces por eso hay que hacer un bucle ¿no? y por ejemplo aquí tenemos un método maravilloso imprimir notas y lo que vamos a hacer va a ser el bucle un bucle for que este tipo de bucle for se llama for each que es que coge una estructura y la recorre entera es para todos los para todos los miembros digamos de la estructura entonces esto esto es maravilloso esto esto es buenísimo mucho mejor que el for de c y de todo ¿no? entonces ponemos esta variable que va a ser la variable de ciclo que es string nota que va a ser una variable local que con todos los puntos va a recorrer el array list este entonces el cuerpo del bucle se va a ejecutar una vez por cada por cada valor que tenga el array list y ahí lo que vamos a hacer va a ser el sistema de la nota entonces pues nos va a imprimir cada nota en una línea todo va a ser maravilloso y vamos a ser muy felices comparado con el programa de las mil líneas ¿no? entonces ¿qué se podría decir esto? por ejemplo veis aquí el string nota esto es una una variable local entonces ¿veis? se empieza a crear aquí y cuando se acaba el cuerpo del bucle aquí en la en la llave esta ya desaparece ya no existe es decir que si intenta uno acceder a ella fuera del cuerpo del bucle pues se va a producir un error esto también es importante decirlo otro tipo de bucle que tenemos el bucle while otro esto es ahí históricamente ha existido ¿no? ¿veis? que el índice lo vamos a declarar fuera también va a ser una variable local el índice lo ponemos a cero y entonces hacemos el while mientras el índice sea menor que el tamaño de la array list vamos a hacer esto y el esto va a ser imprimir la nota del get índice igual que antes bueno sí bueno lo de antes era mejor porque es que en la nota estaba ya el string voy a tener que imprimir la nota que iba cambiando de valor y aquí lo que tengo que hacer es llamar al get del índice esto es un poco más pesado y después y muy importante tengo que incrementar el índice más más esto significa índice igual a índice más uno ¿no? como sabéis entonces eso hay que declarar e inicializar una variable local esto antes pues solo había que declararla los elementos no se pasan automáticamente a la variable y además tenemos que incrementar la variable índice nosotros mismos esto es bastante menos cómodo que Weedemos incrementar la variable del bucle puede haber un bucle infinito pues efectivamente todo el mundo le ha pasado y si no le ha pasado pues es que no ha programado lo suficiente que se te ha olvidado incrementar y entonces el programa no termina nunca ¿no? podemos acabar cuando queramos no tenemos por qué seguir hasta el final eso también es importante entonces por ejemplo un bucle wild que hace algo distinto que no recorre una colección pues tenemos este empezamos con el número 0 y mientras el número sea menor o igual que 30 imprimimos el número y luego le sumamos 2 pues ¿qué pasa aquí? pues este trozo de código lo único que me va a sacar va a ser los números pares entre 0 y 30 ya está es una cosa distinta procesar una colección ¿no? y también si yo detecto alguna cosa que no me interesa puedo terminar el bucle antes de tiempo bueno eso también se puede hacer con el bucle con el for each ¿no? veis otro ejemplo con un bucle wild es lo que se llama el patrón de búsqueda no es un no es un patrón de estos de objetos de diseño orientado a objetos pero bueno es un patrón de eso como una un fragmento de código que se repite mucho y que es conveniente tenerlo como programado en la cabeza porque esto hay que hacerlo cada vez por tres ¿no? o si no buscarlo en el stack overflow ese ahí lo copias uno y lo pegas ya empiezas a hacerlo el compiler te lo pone no sé vemos como vaya evolucionando esto ¿no? pero vamos queremos buscar una cosa y que si la encontramos pues dejar de buscarla no queremos seguir buscando hasta el final cuando ya la tenemos ¿no? entonces el índice empezaría siendo cero un booleano encontrado digamos que es falso y entonces en el array list este mientras el índice sea menor que el tamaño del array list y no hayamos encontrado lo que estábamos buscando vamos a hacer esto vamos a coger la nota con el get el string y si la nota contiene algo que eso va a ser la cadena a buscar pues si esto es cierto si lo he encontrado pues lo he encontrado lo pongo a cierto y si no pues lo he encontrado pues incremento el índice y cuando llego aquí se vuelve a evaluar la condición del while si ya lo he encontrado pues ya no vuelvo a entrar entonces sería una forma de recorrer un array list buscando un string que contenga una cierta subcadena que a mí me interesa en el momento en que la encuentre pues dejo de recorrerla no tengo que seguir hasta el final porque se queda una ruida de tiempo más o menos me seguís ¿cómo? sí pero bueno con unas condiciones tienen muy rápidas ¿no? ah bueno sí sí claro claro puedes poner centinela pero vamos que pues es un ejemplo más sencillo no no vamos aquí todavía a la eficiencia muerta cualquier hay muchas eficiencias manejada si no mira el minecraft ahí como salió vale otro ejemplo de cómo procesar la selección completa y esto lo hace con iteradores entonces hay otra lo del for está el for each está muy bien el while también está muy bien y está el concepto de iterador que es como mucho más general entonces hay muchísimas estructuras en java que lo que puedes hacer es pedir un iterador y utilizar ese iterador para recorrer el la estructura y esto sí que iterator este sí que es un patrón de diseño orientado a objetos ¿no? entonces como veis es un poco no es muy fácil muy atractivo comparado con el for each para el caso de los arraylist la verdad es que no merece mucha pena pero bueno ahí queda entonces el iterator este primero tenemos que declararlo y al arraylist tenemos que hacer notas.iterator para que nos crea un iterator y esto os hago notar que esta es la primera vez en la que creamos un objeto y no lo hemos hecho haciendo new explícitamente que esto es raro una anomalía ¿no? hay otro método que tienen los iteradores que es el hash next si tienes siguiente esto si has llegado al final o no has llegado al final entonces mientras no hayas llegado al final lo que hace es el iterador llama a un método next que el next lo que te devuelve es el siguiente elemento y además el iterador se incrementa solo y se pasa a lo siguiente entonces pues simplemente llamando next pues nos va a nos da el valor de lo que tiene y además avanza pues como veis aquí no ha quedado muy no ha quedado muy bonito el iterador la verdad comparado con el for each pero para otras cosas sí que es interesante más conceptos que se pueden meter aquí no os preocupéis que esto se vuelve más divertido que veo aquí veo desolación pues no no os habéis enterado mucho hasta ahora o es que es muy aburrido y ya lo sabéis todo y era muy fácil veo muchas caras de poker ¿eh? claro, claro es que hay que aprovechar bien el tiempo esa es la clave pero ya te digo el programming one on one de stanford dan las mismas horas que aquí en las tutorías también va bastante rápido también yo creo que incluso mucho más rápido pero bueno si has pagado 50.000 euros de matrícula pues yo creo que te puedes tomar un café antes, durante y después ahí en la clase a ver más conceptos el nulo y el cortocircuito sí, sí yo comprendo que tal pero en otras universidades creo que las clases te darían más clases a lo largo de las universidades claro se supone que esto a mí cuando empecé con esto me dijeron no, no, esto pues que la gente estudia en su casa un montón y entonces viene a la tutoría y te pregunta sus dudas y dije ah, bueno menos mal que no he tomado clase yo ah, bueno, bueno vine aquí bueno, pues nada a ver que me pregunten dudas la gente y no yo siempre lo pregunto que si tenéis alguna duda si habéis visto algo en el libro que no os encaja que no lo tenéis claro que no sé qué a mí me preguntáis que yo no tengo problema no es que yo estoy aquí para las dudas para mí es irrelevante llegar al final del temario ni nada no tengo ninguna obligación de ese estilo y tampoco voy a corregir la práctica ni el examen o sea que podéis hacer las preguntas más tentadas al mundo que pensáis ay, Dios mío voy a pensar ahí que soy lelo y tal y a mí no me da no me importa porque yo no ya digo que yo no no se lo voy a contar a nadie no voy a llamar al equipo de gente uy, qué chorreo me han preguntado no nada de eso o sea que cuando tengáis alguna duda no tengáis problema ahí en preguntarla que no pasa nada pues eso el costo de circuitos hemos hablado un poco antes y vamos a a seguir he metido aquí otra vez he metido las las clases de las que estoy hablando porque si no efectivamente la verdad que se pierde se pierde una otro ejemplo que hay pues ya somos expertos en la senda personal esta es de una casa de subastas entonces la casa de subastas pues eso pues tiene lotes para subastar y los lotes tienen un número el lote 1 el lote 2 el lote 3 y también tienen una descripción que es un string para saber de qué lote estamos hablando entonces cuando queremos hacer las subastas pues vamos a buscar pues pujas ahí por la por cada lote ¿no? entonces las las subastas las ofertas ¿no? entonces pues hay una clase que se llama lote y la clase principal se llama subasta y la verdad es que me pasa un montón pero bueno no os preocupéis que luego cuando acabe con el temario en unos minutos luego ya pasamos a la parte práctica la parte práctica no sé me gustaría pensar que se entiende mejor no sé oye pero es práctica vale entonces oferta para ¿veis esto? esto sería una porquería de de nombre de método oferta para ¿para qué? o sea una de las cosas que he tenido que aprender es ahí a ponerle nombres que tengan sentido a las variables y a los métodos y tal a mí la oferta para este pues no no sé para mí no tiene mucho sentido pero bueno nos pasan un objeto de tipo oferta y y vamos a ver aquí nos dice que buscamos la oferta máxima menos mal porque ahora mismo hasta ahora esto era como el cuarto milenio y entonces si la oferta cada lote tiene un campo que es la oferta máxima pero al principio cuando todavía nadie ha hecho ninguna oferta pues no hay oferta entonces tiene el valor especial nul los objetos a ver los objetos no son nul las referencias a objeto cuando tú declaras una variable como pues la oferta máxima esta si tú no le asignas el valor de la referencia a un objeto pues no tiene valor ¿vale? entonces es nul que es que no apunta a nada entonces la oferta máxima es que se crea ahí cuando empieza a ejecutarse pues el el objeto pues tiene el valor nul pues significa que no tiene nada que está apuntando a ningún sitio ¿no? entonces nos preguntan si la oferta máxima está vacía está nul porque no tiene nada o sí que tenemos una oferta y vemos el valor pero el valor de esto es ¿vale? la oferta que nos han hecho ahora su valor es mayor que el de la oferta máxima pues eso tenemos una la nueva la oferta esta tiene que ser la nueva oferta máxima porque o no había ninguna o nos ofrecen más de lo que teníamos antes entonces hacemos oferta máxima igual a oferta entonces aquí el el cortocircuito ese que he dicho antes lo del O es importante porque la oferta máxima es nul que no hay ningún objeto pues yo voy aquí graciosamente le le meto un objeto a esa referencia variable si no estuviera cortocircuito y oferta máxima es nul y tuviera solo un palito aquí tendría que evaluar también la otra parte y entonces al llegar aquí a oferta máxima al punto de getValor pues me daría un null pointer exception porque estoy llamando a un método de un objeto cuando realmente no hay objeto porque la referencia es nul entonces el cortocircuito hace que esto funcione esto sin cortocircuito no funciona aun así tampoco es una cosa muy que pase así a todas horas no es un concepto ahí de que esté uno continuamente haciéndolo otro concepto que hay en el capítulo también son los los objetos anónimos a ver si es que tenía que haber dicho que lo llegase el capítulo a antes yo creo que eso ha sido el fallo también ayer la semana pasada también habría dicho pues leéis ahí los capítulos 3 y 4 y tal no pasa nada hasta la semana que viene leéis ahí los 5 y 6 y así ya venís con dudas y con todo ¿no? vale entonces la subasta era la clase principal la que utiliza la clase lote entonces esta tiene un método para ingresar lote y y el lote bueno como he dicho que tenía un número de lote eso ya lo gestionamos nosotros eso nos ha sido guay pero la descripción pues lógicamente me la tienen que pasar como parámetro y entonces tengo una array list que se llama lotes muy imaginativo y entonces añado un new lote con número de lote siguiente y la misma descripción que me han pasado pues la paso aquí y el número de lote siguiente pues lo lo incremento más o menos ¿se entiende? más o menos bueno lo interesante aquí es que he hecho el new lote este con el new este he creado un nuevo objeto de tipo lote y lo he añadido al array list ¿y qué pasa? pues que no me he creado primero una una variable aquí para decir que eso contiene el new lote y no sé qué tal y cual para luego meterlo entonces en la siguiente transparencia lo tengo hecho sin objeto anónimo sin objeto anónimo habría hecho eso lote nuevo lote igual a new lote de bla bla bla todo eso y entonces aquí habría añadido en el array list el nuevo lote y lo he incrementado el número de lote siguiente entonces si veis lo comparáis con esto pues aquí hay una una línea menos y no hay un nuevo lote y no sé qué simplemente he hecho ahí los cuatro como más apretado y ese sería un objeto anónimo que no tiene una variable que apunte hacia él pero bueno sí que en cuanto yo lo meto en el array list digamos que está ya metido en el sistema que nadie lo va a borrar ni nada porque se puede acceder a él a través del array list no se ha perdido vale entonces los array list tenían unas características que ya se nos han olvidado a todos pero estaban en clara contraposición con los arrays estos estos los llaman matrices no sé como digo el libro ha cambiado mucho de traducciones traducción ahí anglocéntrica argentinocéntrica hispanocéntrica entonces en argentino son grillas o algo así no sé no son no sé en español antes eran matrices y y en inglés eran arrays y en argentino yo creo que sí lo de la grilla esa me suena pero no estoy seguro entonces los arrays estos son estos sí que son como que es antigua esto sí que viene tal cual del C y entonces aquí no hay no hay un tamaño variable los arrays tienen un tamaño fijo que tú cuando creas el array dices el tamaño que tiene y no puedes meter más cosas de las que que tiene porque ahí no sé eso no cambia automáticamente en el tamaño ni nada si te pasas pues te da array entonces el acceso a los elementos del array es más eficiente pues bueno pues si aceptamos aquí pulso como animal de compañía si usted lo dice será verdad los arrays pueden almacenar objetos o valores de tipos primitivos eso es los valores de tipos primitivos como yo serán los numerillos y bueno los booleanos que también son numerillos y los caracteres que también son números y las colecciones no entonces como diría yo esto en sábado es verdad y es mentira porque hubo una época en que no se podían hacer cosas y luego hay otra época en la que sí se pueden hacer pues al principio de los tiempos en un array list no podían meter números pero ahora sí entonces esta afirmación pues si preguntan las preguntas de test la respuesta correcta sería pues de qué versión estamos hablando porque en algunas sí en otras no entonces supuestamente las colecciones como los array list uno le puede meter un entero o un número un coma flotante o lo que sea pero bueno al final sí porque hay una cosa que es el autoboxing ese que te crea un objeto con un número dentro y lo mete en la colección o sea que tampoco hay que preocuparse mucho por eso ya lo veremos o sea las ventajas frente al al array list de los arrays pues es que supuestamente no es eficiente y y que supuestamente pueden almacenar tipos primitivos pues la realidad es que lo otro también o sea que las ventajas son son durezas durezas cuanto menos las desventajas son las sintaxis de C pues efectivamente las sintaxis pues son un poco absurdas y poco coherente con el resto del Java pero bueno eso es así el Java nunca ha sido un prodigio de la coherencia a ver me han preguntado nada por aquí parece que no está hasta aquí en el chat vamos a ver cómo se declaran pues por ejemplo yo quiero tener un array de enteros ya hemos pasado a otro ejemplo más para que veáis que aquí no no tenemos piedad tenemos un servidor web y queremos saber cuándo cuántas cuántas visitas nos hacen por hora entonces esa como hay 24 horas pues ese pedazo de información la vamos a guardar en un array de 24 de tamaño 24 que sería pues desde el 0 hasta el 23 ¿no? entonces es el array está muy bien porque no está previsto que haya días de horas variables así que podemos asumir que van a seguir teniendo 24 horas los días así que es un tamaño fijo y podemos usar una array ¿no? entonces para declarar lo pondría pues el int y pondría los corchetes estos marcianos y luego el nombre la creación pues luego haría un new int de 24 pondría aquí ya el tamaño que quiero del del array y ya veis que se hace con corchetes que no se hace con paréntesis que es como se hace con las otras cosas porque esto es ahí como la sintaxis hay es como si te pones a decir cosas en latín ahí en español es una cosa que has traído de otro idioma que no pega mucho pero pero es así y luego pues nada una cosa que a mí me llama la atención cuando empecé a ver con el Java por ejemplo mira esta en esta línea declara y crea un array de strings de tamaño 10 pues no sé yo pensaba lo he puesto aquí crea el array pero no crea 10 cadenas detecto crea 10 referencias a null o sea que está creado el el tamaño para 10 cadenas pues las cadenas no están luego tienes que ir en cada hueco creando un objeto de tipo string y asignándolo ahí solo se ha creado el hueco ¿no? y el uso bueno el uso gracias a Dios no es muy complicado se trata de como igual que antes teníamos un get y un número para acceder a una posición aquí lo que tenemos es el corchete con ese corchete pues la la séptima posición ¿no? porque empieza en el 0 pues sería la 6 la primera pues con el 0 puedo aquí hacer todo tipo de expresiones aritméticas x más 10 menos 6 lo que sea que se vaya a convertir en un número cuando yo lo evalúe lo puedo poner como índice de la red ¿no? aquí voy a hacer etiqueta 5 igual a salir pues perfecto le asigno también puedo asignar cosas en vez del el add y el get pues aquí directamente es poner siempre el índice y eso lo puedo utilizar como valor o lo puedo utilizar para asignarle cosas ¿no? también como valor aquí lectura de 0 partido por 2 lo que sea ¿no? gente de 3 punto get nombre máquinas pero igual ni una máquina de boletos 500 quiero tener ahí una red de máquinas de etiqueta eso sería como el uso ¿no? como curiosidad el primer año había que hacer un tetris en la en la práctica o sea que luego nos quejéis cuando hagáis lo del hospital porque lo del tetris eso fue fue duro y hablé con uno de los profesores uno de los del equipo docente que iba a corregir ahí las prácticas y me dijo bueno no las piezas del tetris no pueden estar en una array list eso tiene que estar en una array porque son cuatro cuadrados soy yo el que me ponga un array list yo lo suspendo directamente y ahí como bueno aquí como como reparto ¿no? yo no no tengo las opiniones ahí tan tan estrictas me imagino que cambiaré la opinión porque si no no creo que aprobar a nadie aquel año pero bueno pues los arrays son pues principalmente para cosas de longitud fija que ya sabemos la longitud que van a tener y los arrays pues para cosas que pueden crecer un montón ¿no? los arrays son más prácticos y lo de que la eficiencia es menor pues no sé no no tengo claro pero para nada de nada además eso ya depende de la implementación de la máquina virtual dejada y de un montón de cosas ¿no? bueno entonces aquí volvemos a el asuntillo de los de los bucles los bucles son muy importantes porque como queremos hacer procesamiento masivo de la información pues eso solo se puede hacer haciendo bucles ahí a chorro ¿no? entonces el bucle for tiene este es el clásico de c ¿no? es el for each tiene la pinta esta tiene tres campos aquí separados por puntos y que más que es la inicialización que normalmente es un int i igual a cero o algo así ¿no? un contador que vamos a utilizar una condición que sea i menor que el tamaño de no sé qué que mientras se cumpla la condición se va a seguir ejecutando en el cuerpo del bucle y la modificación ¿veis? aquí que es normalmente es incrementar el índice aquí tenemos un ejemplo ¿veis? ahora la pongo a cero creo esta variable aquí que es cero mientras la hora sea menor que los contadores por hora punto length eso es otra otra cosa los arrays tenían el get size ese no size size que te decía el tamaño y aquí tenemos el length este esto y sin y sin paréntesis además que te dice el tamaño del array ¿por qué es así esto? pues pues no lo sé porque esto como no tiene paréntesis no es una llamada size claramente es un método que hay una clase que se puede que la clase de array list existe y tiene un método que se llama size ¿qué es arrays? pues son el invento del demonio tiene una cosa que se llama length que no hay paréntesis con lo cual no es un método tiene que ser un campo pero que es un campo que te vas a leerlo pero no te vas a escribirlo porque si yo me declaro un yo hago el blue j y me hago aquí int que es el code path este es buenísimo para este tipo de cosas yo hago aquí este tipo de cosas este rollo y yo hago siempre que haya alguna cosa rara que no sabéis si funciona o no pues os podéis venir aquí al code path este y lo ponéis voy a preguntarles asa de cero por ejemplo pues cero me ha inicializado el entero a cero los números se inicializan a cero siempre y si yo quiero hacer por ejemplo aquí asa.length a ver donde hay esto pues me dice siete porque lo he declarado de siete y entonces voy a poner claro que pasa si yo digo ahora asa.length pues igual a diez porque quiero cambiar el tamaño a cero bruto error cannot assign a value to a final variable length vale pues pues eso es que el campo length este es es final o sea que lo veremos después que es constante si no es constante primero puedo cambiar el valor pero bueno sirvo aquí como ejemplo de cosas raras que se ven ir haciendo entonces con el ejemplo este de la izquierda serviría para lo de los contadores por hora estos y con un bucle while pues podría también conseguir un efecto muy similar la inicialización la pongo fuera la condición la pongo en el while y la modificación la pongo aquí al final y mientras aquí las sentencias han repetido están aquí o sea esto sería lo mismo hecho con con un bucle while o sea los bucles while son digamos equivalentes en potencia sirven para lo mismo es cuestión de gustos utilizar un for o utilizar un while uy uy no no es que el capítulo 5 justamente es el testing y eso como no como no lo vamos a dar pues se ve que no es importante no pasa nada hay que hacer ahí concentrarse mucho y hacer los programas bien a la primera y ya está no no es importante y el 6 que va del comportamiento más sofisticado sí vale sí yo creo que no no merece la pena empezar ahí con el capítulo 6 todavía pero bueno que hay 14 por ahí no os preocupéis y el 13 tampoco está que es el de las interfaces gráficas de usuario tampoco está en el temario y eso sería más largo y es más chungo entonces que ¿cómo cómo lo veis esto? ¿os vais a poner a estudiar a hacer ejercicios ahí a lo loco? porque el 5 porque el 5 no está en el temario pues yo yo pero hay capítulos difíciles también pero eso en el 5 no es la cifra sí sí pues normalmente vemos preguntas de test es una cosa que me interesa mucho por algún motivo sí sí exactamente cosas de los exámenes y eso normalmente test pero bueno si tenéis interés ahí en algún ejercicio práctico pues pasa que normalmente el ejercicio práctico está relacionado con la práctica de la asignatura pero bueno yo tengo más visto con los test que ya te digo que por lo que sea la gente me interesa mucho bueno es una bueno es una idea pensaré en ello a ver si a ver si nos ponemos a ver me había preguntado algo en el chat el tema de race no aparece en el libro sí que viene hombre sí que viene no pasa que lo han cambiado de capítulo la metió la entrega en otro capítulo más adelante pero yo lo he mantenido así por dos razones la primera pues soy un vago ya tenías todas las transparencias y la segunda es que porque así se entiende la diferencia que hay entre array y array list porque si no te saca el array list y no te hasta dos capítulos después no te habla de los arrays y tú dices y esto por qué no ya se te ha olvidado aquí es importante saber que una cosa es como el el gemelo el gemelo malo de la otra bueno bueno no me miréis con esa cara que yo también me he asustado ya si no tenéis más dudas o sugerencias o contestaciones ahí lo podemos dejar para la semana que viene la práctica está la denunciada ya está sigue siendo no lo han puesto ya desde el principio del hospital universitario claro te tienes que apuntar a un grupo para venir el día ese que te toques y disfrutar ahí de tres horas de tutorial de la práctica ese en prácticas punto uned punto cuando se hagan grupos vamos si salgan en algún momento dado y normalmente los ponen con cuantagotas porque hacer grupos pues cuesta dinero porque hay que pagar la alese y normalmente no quieren poner muchos sino que hasta que no se llena uno pues no no ponen otro ¿no? hombre idealmente tú tienes que empezar a practicar en tu casa para que el día de la práctica ya estés ahí a tope que cuando el tutor ahí diga lo que hay que hacer no sé qué tú ya tengas ahí un bueno él os va a explicar cosas y a lo mejor vais uno por uno viendo ahí cómo lo lleváis y eso y luego como he dicho tenéis como un mes de tiempo para terminarlo sí es un laboratorio total totalmente de hecho creo que es un laboratorio lo que pasa que como hay más sitios que ordenadores pues como mucha gente se trae portátil y no se puede no sé qué creo que que no hay ordenadores para todos es que eso es porque la semana pasada no funcionaba el Inteka y entonces no funcionaba el team ni pudimos grabar nada ni nada entonces pues se ha quedado ahí la del año pasado pero bueno como es igual pues tampoco tampoco hace daño este año sí cambiaré el enlace y todo para que se vea que está todo nuevo y mejorado sí sí en el en el Academos hay una parte de como de calendario de no sé qué ahí lo pongo y también en el Ágora en el apartado en la parte que es el libro del tutor o no sé qué pues ya ahí también lo pongo sí sí pues bueno pues nada los que estáis en casa la donde hay que pulsar práctica de laboratorio si va a ser muy bueno hasta luego chicas