20241212 POO-Clases-Ejer_2 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
A ver, habéis arrancado esto, como de costumbre, leyéndolo todo entero, haciéndonos una visión global de para qué sirve esta aplicación.
00:00:00
Si uno después de leer un enunciado, algo que le han planteado, no entiende qué utilidad tiene eso,
00:00:11
entonces o el enunciado está mal explicado o uno tiene que volverse a leer, porque una aplicación tiene que ser útil,
00:00:16
tiene que trabajar, tiene que servir para algo.
00:00:23
Entonces, bueno
00:00:25
Esto en particular
00:00:28
Se supone que es una aplicación
00:00:30
Para tener tú los datos de tus amigos guardaditos
00:00:35
Entonces, cuando tú quieres información sobre algún colega
00:00:40
Pues le das a un botoncito
00:00:44
Y te da la información de ese colega
00:00:46
Lo que sea que tenga
00:00:48
Que en este caso es el nombre, la edad y la dirección
00:00:51
Bueno, pues ya está. Esos tres datos son los que parece ser que te interesan, ¿vale? Entonces, para que esa aplicación sea útil, pues tú además tienes que poder incorporar amigos nuevos o eliminarlos cuando ya no son tus amiguitos, ¿vale? Pues ya está, simplemente para eso, para guardar información de personas, de amigos, de compañeros, de lo que sea, y tener ahí esa información guardada para cuando quieres visualizarla.
00:00:54
Vale, pues entonces
00:01:17
Para eso, esta aplicación
00:01:19
Tiene dos entidades solo
00:01:21
¿Con qué trabaja?
00:01:23
Con personas, pues ya está, una entidad
00:01:25
Persona, y luego
00:01:27
Lo que guarda
00:01:29
La información es una libreta
00:01:31
Una libreta que tiene un montón de personas
00:01:33
Pues entonces hay otra entidad
00:01:35
La libreta que tiene la información
00:01:37
Y la persona
00:01:39
Pues dos entidades, pues ya está
00:01:41
Pues entonces empezamos con
00:01:43
Persona, y ahora
00:01:45
como fruto del análisis y del diseño
00:01:58
nos tiene que haber quedado claro
00:02:01
qué atributos nos interesan
00:02:02
de la persona
00:02:05
pues en este caso pone ahí
00:02:06
nombre, edad y dirección, pues ya está
00:02:08
pues entonces decidimos el tipo de datos
00:02:10
y ya
00:02:13
nos sale
00:02:15
de corrido, porque es
00:02:17
lo habitual, que las propiedades
00:02:18
sean privadas
00:02:21
¿vale? y luego yo según el curso
00:02:22
de la aplicación
00:02:25
pues decido si los get y los set
00:02:26
son necesarios los dos o solo uno
00:02:29
porque solo son propiedades de lectura
00:02:30
entonces quito el set
00:02:32
entonces
00:02:33
en nombre como dirección también es
00:02:35
string y edad
00:02:41
privadas
00:02:47
entonces si son privadas
00:02:51
para que otras clases
00:02:53
puedan recuperar sus valores
00:02:55
o puedan cambiar
00:02:57
sus valores si es que yo quiero dar permiso
00:02:59
vamos a necesitar los get y los set
00:03:01
Porque con el modificador privado
00:03:03
Nadie fuera de la clase
00:03:05
Va a poder acceder al punto nombre
00:03:07
Punto dirección, punto edad
00:03:09
Entonces o los escribimos a mano
00:03:10
Porque tecleamos muy rápido
00:03:12
O hacemos generar getter and setters
00:03:14
Seleccionamos todos
00:03:17
Pues lo que hice el otro día
00:03:19
¿No lo habéis visto en la grabación 20 veces?
00:03:24
Source
00:03:27
O vosotros sois muy lentos
00:03:28
Una de dos
00:03:36
Source
00:03:38
Generate Getter Sunsetters
00:03:41
Con mi inglés
00:03:44
A ver, yo hablo mejor inglés de lo que parece
00:03:45
Pero aquí
00:03:48
Lo leo así para que no quede duda
00:03:49
De la opción que queremos
00:03:51
¿Ya está?
00:03:52
Pues ya está
00:03:58
Entonces, todos entendemos ya estos métodos, lo que son, para qué sirven, que tenemos que seguir un convenio de nombres para que se llamen de esta manera, GET, SET con la propiedad en mayúscula, con la inicial de la propiedad en mayúscula, que son métodos public porque se van a usar desde cualquier sitio para acceder a las propiedades, etc.
00:03:59
Vale, ¿qué más hacemos siempre por sistema en una clase?
00:04:19
Ahora crear los constructores.
00:04:24
Los constructores.
00:04:25
Uno vacío y otro...
00:04:27
Claro, porque si no, tengo yo siempre
00:04:28
que instanciar el objeto y luego con los set
00:04:30
irle dando valores, que muchas
00:04:32
veces lo hacemos así, creamos el objeto
00:04:34
y luego con los set le damos valores, pero
00:04:36
si hacemos un constructor con parámetros,
00:04:38
pues puedo
00:04:43
a la vez que instancio una persona
00:04:44
en concreto, a la vez que la instancio,
00:04:46
pues puedo ya darle unos valores
00:04:49
iniciales. El super
00:04:50
sí que lo quito, porque el super sí que seguimos
00:04:52
sin tener ni idea de lo que significa.
00:04:54
Vale, entonces,
00:04:57
desde el momento en que
00:04:58
he sobrescrito el constructor que está
00:04:59
por defecto por debajo sin yo verlo
00:05:02
que es el sin parámetros
00:05:04
desde que lo he sobrescrito con esto
00:05:05
ese sin parámetros me ha desaparecido
00:05:07
pues una pena, porque seguramente
00:05:09
hay gente que quiere crear personas
00:05:12
sin darle valores todavía
00:05:13
pues entonces vamos a ponerle también
00:05:15
el constructor sin parámetros
00:05:18
ay, que sueño
00:05:19
vale
00:05:26
y
00:05:32
Perdón
00:05:37
Que super
00:05:45
Ah, sí, sí, sí
00:05:46
Este es super
00:05:48
Vale, voy a ir haciendo en paralelo
00:05:50
Un main para ir viendo
00:05:53
Ciertas cosas, ¿vale? Aunque no sea el main
00:05:55
De mi aplicación
00:05:57
El main de mi aplicación ya pues
00:05:58
No sé si me dice aquí que haga un main con un menú
00:06:00
O con tonterías
00:06:02
No, bueno, pues podemos hacer un main
00:06:04
Con un menú
00:06:07
Para probar las funcionalidades
00:06:09
De esto
00:06:12
Y así lo vamos entendiendo mejor
00:06:12
Vale
00:06:18
Bueno, lo que pasa es que antes de
00:06:22
Arrancar con el main, vamos a hacer la otra entidad
00:06:26
La libreta de direcciones, porque el main tendrá que
00:06:28
Crear una libreta
00:06:30
¿Vale? Y ya con esa libreta trabajar
00:06:31
Metiendo personas o no
00:06:34
Bueno, pues entonces
00:06:35
La clase persona por ahora está, ya no necesita nada más
00:06:38
Porque la clase persona
00:06:40
No tiene métodos
00:06:44
La libreta es la que va a tener
00:06:46
Los métodos para hacer las cosas
00:06:48
Para meter una persona nueva, para quitarla
00:06:50
En la libreta es donde están las personas dentro
00:06:52
Y la libreta
00:06:54
Es la que va a tener las funcionalidades
00:06:56
De incorporar persona, quitarla
00:06:58
Porque es la que tiene las personas dentro
00:07:00
Esta no tiene funcionalidades
00:07:02
Esta sirve solo para
00:07:06
Guardar el objeto
00:07:07
¿Vale?
00:07:09
Pues venga, hacemos la
00:07:11
Otra entidad
00:07:12
Vale, pues la libreta, ¿por qué se va a caracterizar?
00:07:15
Única y exclusivamente
00:07:26
Por los contactos que tiene dentro
00:07:27
Ya está, se va a caracterizar por los contactos
00:07:29
Que tiene dentro
00:07:31
¿Cuántos contactos va a tener? Muchos
00:07:32
Entonces, si va a tener muchos
00:07:35
La propiedad va a tener que ser
00:07:37
Un array, ¿vale?
00:07:39
Porque ese es el tipo de dato
00:07:41
Para guardar muchos de algo
00:07:43
Hasta ahora
00:07:45
Que no hemos incorporado ningún otro
00:07:47
Bueno, pues muchos de qué
00:07:48
de
00:07:50
persona
00:07:53
lo voy a llamar contactos
00:07:55
que queda más bonito que persona
00:07:59
vale, pues esta es
00:08:00
la propiedad
00:08:02
persona, perdón
00:08:03
la propiedad contactos, que caracteriza
00:08:06
la libreta, que es toda su colección de
00:08:08
contactos, y como son muchos
00:08:10
pues tiene que ser array, porque son muchos
00:08:12
ahora, si yo le doy el privado
00:08:14
pues lo mismo, tengo que ofrecer
00:08:17
un get y un set
00:08:18
De esta única propiedad
00:08:19
Y vamos a ponerle
00:08:24
Constructor con y sin parámetros
00:08:29
Ya casi como rutina
00:08:32
No te confíes
00:08:35
Vale
00:08:51
Pues desde el momento en que ya hemos decidido
00:08:58
Que la libreta
00:09:00
Solo se caracteriza por eso
00:09:02
Es lo único
00:09:04
La libreta se caracteriza por los lazos que tiene dentro
00:09:05
A la aplicación no le interesa
00:09:07
Ni el color de la libreta
00:09:09
ni en qué sitio está guardada
00:09:11
no le interesa nada más, solo esto
00:09:14
pues del momento en que me he llegado a esa conclusión
00:09:15
esta parte de aquí ya
00:09:17
prohibida, ahí ya no se
00:09:19
escribe absolutamente nada más
00:09:21
no se escribe nada más, porque cualquier
00:09:23
cosa que se escribiera ahí
00:09:25
sería algo que caracteriza la libreta
00:09:27
y no necesitamos nada más
00:09:30
para caracterizarla, solo los contactos
00:09:32
que tiene dentro, luego esa zona ya está
00:09:33
prohibida, ahí ya no se mete nada
00:09:36
si yo necesito algo para operar con mis métodos
00:09:37
Pues serán variables locales del método
00:09:40
O parámetros que pasó desde fuera
00:09:42
En la llamada, lo que sea
00:09:44
Pero ahí ya nada, esa zona ya
00:09:45
Está protegida
00:09:47
Vale, pues entonces
00:09:49
Ahora ya esta aplicación tiene funcionalidades
00:09:53
Lógicamente, que son
00:09:56
Meter una persona
00:09:57
Aquí, en la libreta
00:09:59
Sacar una persona de la libreta
00:10:02
Verla, ver
00:10:03
Las personas que hay
00:10:05
Buscarla por nombre, etc
00:10:08
Ya tiene funcionalidades. ¿Esas funcionalidades de qué son? De la libreta. Pues entonces tiene sentido que lo pongamos como métodos aquí, no aquí. Yo hacer un método con una, no, aquí. Bueno, pues ¿cuáles me han pedido? Pues vamos a meter una persona en la lista. Agregar persona, contacto, como lo queráis llamar.
00:10:10
Vale, pues este método
00:10:30
Voy a poner public
00:10:32
Porque en principio
00:10:35
Esto lo podría usar
00:10:36
Desde cualquier otro paquete
00:10:38
Una vez que yo tengo ya esta libreta hecha
00:10:40
Pues la puedo distribuir
00:10:43
Y cualquier otra aplicación puede usarla
00:10:44
Bueno, pues entonces
00:10:46
El método
00:10:50
Que va a devolver
00:10:53
El método este de
00:10:54
Pero
00:10:55
De verdad estáis diciendo todos un estriño
00:11:03
Si estáis quedando tan anchos
00:11:05
¿de verdad estáis diciendo
00:11:06
todo eso? a ver, esto no es tan trivial
00:11:16
claro, esto os permito que lo digáis
00:11:17
sin enfadarme
00:11:19
a ver
00:11:21
agregar persona, vale
00:11:23
pregunta
00:11:25
¿me tiene que devolver algo este método?
00:11:26
ah, vale, es que como he dicho me tiene que devolver un array
00:11:31
ya me estabais asustando
00:11:33
no, porque el efecto
00:11:35
de este método
00:11:37
se hace ya aquí
00:11:38
en esta variable
00:11:40
es decir, este método accede directamente
00:11:41
a la variable esta, accede a esta variable
00:11:45
entonces no hay que pasársela
00:11:46
y el efecto del método
00:11:48
el efecto va a ser modificar esta variable
00:11:50
el efecto va a ser ese, hacer que sea
00:11:53
raíz ya más grande, entonces el efecto
00:11:55
de este método ya se registra
00:11:56
aquí
00:11:58
otra cosa es que a veces se hace
00:11:59
que no lo vamos a incorporar, porque en este caso
00:12:02
pues hacerle que devuelve un boolean
00:12:04
y que el método devuelva true
00:12:07
si ha funcionado correctamente y false si no
00:12:09
y así es una manera de controlar desde fuera
00:12:11
el que lo llame, pero eso es cuando ese
00:12:13
método interacciona con bases de datos, con cosas
00:12:15
que pueden fallar, pero aquí
00:12:17
no estamos interaccionando con nadie, entonces que el método
00:12:18
falle si lo probamos bien es imposible
00:12:21
porque está todo en variables locales
00:12:23
pues entonces un void, vale
00:12:25
efectivamente
00:12:27
¿qué necesita este para
00:12:29
trabajar?
00:12:31
Que le pasemos la persona
00:12:32
Si no, no la va a poder agregar nunca
00:12:34
Vale, pues venga
00:12:35
Y ahora ya está
00:12:38
Ahora ya hacer este método
00:12:40
Pues como es meter una nueva en el array
00:12:41
Array auxiliar, patatín, patatán, etc
00:12:43
Entonces
00:12:46
Hacemos un array
00:12:47
Auxiliar
00:12:50
De personas
00:12:51
Que tenga una posición
00:12:54
Más
00:13:00
Que el array que quiero modificar
00:13:01
contactos
00:13:04
vale
00:13:08
pues hacemos una raya auxiliar con una
00:13:14
posición más
00:13:16
copiamos el
00:13:17
antiguo en el nuevo
00:13:20
aux de i
00:13:22
igual a
00:13:41
contactos
00:13:43
de i
00:13:47
cuando ya hemos copiado
00:13:48
todos excepto la última
00:13:51
posición extra que hemos hecho en aux
00:13:53
pues esa última
00:13:55
posición extra, que es esta
00:13:56
que es
00:13:58
aux.length
00:14:00
menos uno, esta es la última
00:14:03
posición de length, la última
00:14:04
que se ha quedado por ahora vacía
00:14:06
bueno, puede ser contactos.length
00:14:08
pero así se ve claro
00:14:13
que estás accediendo a la última
00:14:14
posición de aux
00:14:17
se ve más claro
00:14:18
vale, esta va a ser la persona
00:14:19
nueva que me han pasado
00:14:23
Y ya este aux es el bueno
00:14:24
El array bueno
00:14:27
Pues entonces
00:14:28
El array antiguo
00:14:30
Este, al que tengo
00:14:33
Jolín con personas
00:14:34
Al que tengo acceso directo a este
00:14:35
Ya le sustituyo por este otro
00:14:38
Y agregar
00:14:42
Joder, aux
00:14:45
No, aquí viene dentro del bucle
00:14:47
Ya
00:14:52
¿Hasta cuándo?
00:14:53
¿Hasta cuándo va a ser lo de la llave?
00:14:55
Vale, pues ya está
00:14:57
Agregar persona está
00:15:07
¿Verdad?
00:15:08
Entonces, aquí por supuesto
00:15:10
Me da igual poner el dis
00:15:12
Que no ponerlo, porque me estoy
00:15:15
Refiriendo a lo mismo
00:15:17
Aquí yo podría arrastrar el dis todo el rato
00:15:18
Si quisiera, pero
00:15:20
No hace falta, ¿por qué?
00:15:24
Porque no hay confusión, no hay ninguna
00:15:26
Otra variable aquí dentro que se llame contactos
00:15:28
No hay una variable local contactos
00:15:31
Si yo a este auxiliar
00:15:32
Le hubiera llamado contactos
00:15:34
Entonces ya
00:15:36
Distinguiría discontactos
00:15:39
El viejo
00:15:41
Y contactos sin más el nuevo
00:15:42
¿Vale?
00:15:44
Pero como lo he llamado aux
00:15:46
Pues no hay ninguna duda sobre quién es contactos
00:15:47
Es el de arriba
00:15:50
No hace falta que ponga el dis
00:15:50
Si no quiero ponerlo
00:15:52
¿Vale?
00:15:54
Si hubieran dos que se llamaran
00:15:57
contactos, uno de ellos
00:16:00
por ejemplo, este que me acabo de crear
00:16:02
que lo hubiera llamado contactos en vez de
00:16:04
aus, ahí ya hay ambigüedad
00:16:05
dis.contactos para referirse
00:16:07
al de arriba y contactos a palo
00:16:10
seco para referirse a este
00:16:12
vale
00:16:13
bueno
00:16:15
pues ya está este método
00:16:16
vale, vamos a hacer una
00:16:19
libreta de direcciones y agregarla a una primera
00:16:24
persona, ahora este es mi main
00:16:26
mi main trabaja con una libreta de direcciones
00:16:28
para hacer cosas, pues tengo
00:16:30
Que instanciarla, aquí ya es donde aparecen los objetos
00:16:32
Mi libreta de direcciones
00:16:34
Esta, vale
00:16:37
Y ahora vamos a hacer rápidamente
00:16:48
Un
00:16:50
Menú, un coso
00:16:51
Con las opciones
00:16:55
Que vayamos poniendo
00:16:57
Vamos a poner ya la de salir
00:16:58
Y ahora leemos la opción
00:17:13
Estoy ya deseando
00:17:18
Que veamos lo del escáner
00:17:25
Para olvidarnos
00:17:26
Uy del escáner, del static
00:17:27
Para hacernos nuestra propia librería
00:17:28
De entrada y salida
00:17:31
Y olvidarnos del scanner y del next line
00:17:32
Y de las tontas esas
00:17:35
Poco a poco no
00:17:37
Ya mismo
00:17:39
Vale, pues
00:17:40
Voy hijo
00:17:43
Por favor, estaba en ello
00:17:47
Está fatal
00:17:49
Pues mi criatura
00:17:51
me ha salido fatal, voy a tener que eliminarla
00:17:58
a ver
00:18:00
¿hasta qué edad es legal abortarles?
00:18:01
hasta los 57 años
00:18:06
yo creo
00:18:08
a ver
00:18:08
scan.nextline.charat
00:18:11
no pongo
00:18:20
el next in a propósito
00:18:21
para no andar arrastrando el problema
00:18:24
de la esa
00:18:26
Vale, y ahora ya sí que viene el switch up.
00:18:30
Y ahora, en el caso de que me hayan dado el char cero.
00:18:38
Char, lo estoy leyendo como...
00:18:45
A ver, espera, voy a cambiarlo así para que no haya...
00:18:47
Pero bueno, vale.
00:18:50
En caso de que el char este que me han dado sea el cero.
00:18:51
Vale, pues entonces pedimos los tres datos y se acabó.
00:18:56
Vamos a poner un solo mensaje
00:18:59
Para que introduzca en el mismo orden
00:19:01
Introduzca nombre
00:19:03
Dirección
00:19:09
Y edad
00:19:11
Vale, pues uno
00:19:12
Ya está
00:19:17
Mira, ya está, que difícil
00:19:18
Vale
00:19:25
String nombre
00:19:28
Igual a scan.nextline
00:19:31
Y lo mismo
00:19:38
Nombre, dirección
00:19:42
Y la verdad es que lo podríamos haber metido en el constructor directamente
00:19:50
¿Vale?
00:19:55
Pero bueno, por si
00:19:58
Así vamos a usar las variables
00:19:59
Y edad, scan.nextint
00:20:02
Si metes en el constructor no te paras por comas
00:20:06
Claro, claro
00:20:08
Y así nos ahorramos líneas de código
00:20:09
Pero bueno, como queda así muy larga y no se ve en la pizarra
00:20:11
Vale, pues ya está
00:20:13
Hacemos la persona
00:20:15
Y gracias a que tenemos el constructor
00:20:17
Cuidado en el mismo orden
00:20:20
Que en el
00:20:22
Constructor nuestro
00:20:24
Persona
00:20:26
Si yo le pongo ahí
00:20:31
Nombre, dirección y edad
00:20:32
Es el nombre en el que lo he puesto
00:20:36
Si apoyáis el cursor sobre el S
00:20:37
Igual ya os habéis dado cuenta
00:20:40
Os dice el eclipse
00:20:41
La declaración, vale, pues entonces
00:20:43
En nombre, dirección y edad es el orden en el que
00:20:45
Lo tenemos que meter
00:20:48
Y ahora ya que tenemos la persona
00:20:49
Pues vamos a usar
00:20:58
El método de la libreta
00:21:00
Agregar persona
00:21:02
Que coge ese objeto persona
00:21:06
Y lo mete en el array
00:21:08
Y ahora hacemos aquí un break
00:21:10
Vale, entonces esto ha acabado
00:21:12
El switch, esto acaba el while
00:21:16
mientras la opción
00:21:19
sea distinta
00:21:20
y ahora, antes de ejecutarla
00:21:22
que nadie la ejecute
00:21:25
decidme, ¿qué va a salir?
00:21:26
un error
00:21:31
yo creo que va a salir un error
00:21:31
¿por qué lo has ejecutado?
00:21:33
no, ni lo he ejecutado
00:21:36
ya sé lo que sale
00:21:38
¿qué tipo de error?
00:21:39
el error en la línea 27
00:21:42
no, si va a salir un error
00:21:43
no, pero no sé
00:21:46
pero va a salir un error
00:21:49
no sabéis que
00:21:50
una excepción, empecemos a hablar
00:21:52
con propiedad, no sabéis
00:21:54
que excepción va a salir, no lo intuís
00:21:56
así lejanamente
00:21:58
la excepción
00:21:59
¿eh?
00:22:01
pero esa
00:22:05
¿cómo se llama?
00:22:06
no va a salir esa
00:22:10
esa sale cuando accedes
00:22:12
a una posición
00:22:16
que no
00:22:16
Que no está dentro del rango
00:22:18
De posiciones habilitadas para la RAI
00:22:22
A ver
00:22:24
Vamos a ver
00:22:26
Bueno, input mismatch
00:22:27
Si hay algo que
00:22:28
Pero yo creo que ahora mismo
00:22:29
Con lo que tenemos
00:22:29
Vale, a ver
00:22:30
Bueno, vamos a ejecutarlo
00:22:34
Vamos a ejecutarlo
00:22:35
Vamos a agregar una persona
00:22:39
Introduzca nombre
00:22:41
Dirección
00:22:43
Y edad
00:22:45
Vale
00:22:47
esta es la que yo
00:22:48
esperaba que me dijerais
00:22:51
null pointer exception
00:22:53
esta es la eterna excepción
00:22:54
del mundo mundial de Java
00:22:57
de hecho hay una clase
00:22:58
que ya os contaré en el futuro
00:23:00
que es la clase optional
00:23:02
que se ha hecho solo para evitar
00:23:05
los null pointer exception
00:23:07
la clase optional se ha hecho para
00:23:08
envolver a un objeto
00:23:10
e incorporar la opción de que el objeto
00:23:12
esté ausente o esté presente
00:23:14
Entonces, si el objeto está ausente
00:23:17
No te da un
00:23:21
Es null, no te da un null pointer exception
00:23:22
Lo que te dice es un opcional vacío
00:23:24
Pero bueno, esto es otro rollo
00:23:26
Y es muy útil lo del opcional
00:23:28
Pero bueno, para
00:23:30
Ha salido un null pointer exception
00:23:31
¿Y por qué?
00:23:33
Era
00:23:36
Podíamos preverlo
00:23:36
Vamos a mirar a
00:23:39
Agregar persona
00:23:42
¿Qué ha hecho agregar persona?
00:23:43
pues se ha hecho ahí un
00:23:45
contactos.length
00:23:47
y contactos
00:23:49
que es, la primera vez
00:23:52
que arranca, cuando instanciamos
00:23:54
el objeto libreta direcciones
00:23:56
aquí hay un pedazo de
00:23:57
array null
00:23:59
claro, entonces cuando creamos
00:24:00
la libreta, creemos ya
00:24:04
directamente una libreta con
00:24:06
cero posiciones, que eso no es
00:24:07
null, no es lo mismo una libreta
00:24:10
un array con cero posiciones que un array null
00:24:12
entonces, o bien lo hacemos
00:24:14
aquí en el constructor, o ya como
00:24:17
cuando declaramos una propiedad
00:24:19
podemos ya, en el momento de declarar las propiedades
00:24:20
de un objeto, darle un valor
00:24:23
y eso significa, cuando
00:24:25
instancia es un objeto
00:24:27
va a recibir este primer valor
00:24:28
luego ya se llama el constructor, si el constructor
00:24:31
lo modificara, se quedaría modificado
00:24:35
pero si aquí añadimos un valor en cualquier propiedad
00:24:36
aquí también, en estas
00:24:39
si aquí pusiéramos unos valores
00:24:40
cuando el objeto se instancia
00:24:42
esas propiedades reciben ese
00:24:44
valor por defecto al principio
00:24:46
ese valor por defecto
00:24:48
vale, pues nosotros
00:24:50
todas las libretas de direcciones que se instancien
00:24:52
todas, queremos que se instancien
00:24:54
ya con un array
00:24:56
a cero
00:24:58
posiciones, todas
00:25:00
aquí no tiene sentido
00:25:02
porque yo cuando creo una persona
00:25:04
cada persona tendrá un nombre, una dirección
00:25:06
pues pasaselo por aquí y ya está
00:25:08
pero aquí
00:25:10
Sea cual sea la libreta que tú crees
00:25:11
Sea cual sea, vas a querer que se cree
00:25:14
Con un array vacío ahí
00:25:16
¿Vale?
00:25:17
Entonces ahora si hacemos esto
00:25:20
Bueno, ahora vamos a ver
00:25:22
¿Qué error sale?
00:25:24
Introduzca nombre
00:25:29
Dos años
00:25:30
Vale, pero esto es otro error
00:25:33
¿Vale? Este ya es otra cosa
00:25:35
El index 0 de
00:25:37
sí, pero esto es por el
00:25:39
escáner que cuando leo las opciones
00:25:42
me ha cogido, pero que vamos a revisar esos
00:25:44
vamos a revisar esa
00:25:46
es que a ver si llevamos el static de una vez y cambiamos
00:25:47
esto
00:25:50
eh?
00:25:51
sí, o sea, es que yo no lo he
00:25:55
revisado, lo he dicho, bueno, aquí habrá que
00:25:56
poner el next line donde toque
00:25:58
y vale, entonces aquí
00:25:59
eh
00:26:02
el problema ha sido, obviamente, que después del
00:26:03
next line se queda el salto de línea, este
00:26:06
Next line, coge el salto de línea, char a cero
00:26:08
El salto de línea, strain in, desbound
00:26:10
¿Vale? Entonces, aquí
00:26:12
Después de este next int, nos falta el
00:26:14
Scan punto
00:26:16
Next line
00:26:18
¿Vale?
00:26:19
Sí, a ver, si yo hubiera leído esto
00:26:24
Con next int
00:26:26
Pues después de este next int
00:26:27
No habría problema, porque, pero
00:26:30
El problema es leer una cadena
00:26:31
Después de un número
00:26:34
Eso, cuando viene un line
00:26:35
Después, porque si viene un next
00:26:38
In o un next double, el salto de línea lo elimina
00:26:40
Pero es el next line el que lo coge
00:26:42
Como válido
00:26:44
Entonces
00:26:44
Ahora ya sí
00:26:46
Vale
00:26:49
A ver
00:26:52
Confiamos en que lo ha agregado
00:26:54
A lo mejor no lo ha agregado
00:26:57
Vamos a hacer desde ya el método
00:26:58
De mostrar la persona para ver si realmente
00:27:00
La ha mostrado
00:27:03
Venga, agregar persona
00:27:04
Vamos a hacer el método, obtener información
00:27:07
De todas las que hay
00:27:09
Ya está
00:27:11
Ni siquiera buscamos por nombre ni nada
00:27:13
Tendría más sentido buscar la información por nombre
00:27:14
Pero bueno
00:27:17
Vale, pues como lo vamos a hacer
00:27:17
Directamente
00:27:21
Como es un montón de cosas las que hay que mostrar
00:27:23
Que ya te haga el system out dentro
00:27:25
Porque como te devuelva todo en un stream
00:27:27
Te va a devolver un pedazo de stream
00:27:29
Te podría ir
00:27:30
Formando un stream, concatenando
00:27:33
Con toda la información y devolverte el stream
00:27:35
para que luego tú la muestres donde te dé la gana.
00:27:37
Pero bueno, que directamente lo muestre el método dentro
00:27:40
y se acabó.
00:27:43
Vale, mostrar información, ¿necesita algún dato de fuera?
00:27:49
Pues no, porque va a mostrar la de todas.
00:27:53
Vale, entonces, toda la información que necesita
00:27:58
está aquí en este array.
00:28:01
Luego no necesita nada desde fuera.
00:28:03
Vale, pues entonces ahora ya este será un bucle.
00:28:05
Aquí sí que podemos hacer un
00:28:08
For each, ¿vale?
00:28:13
Porque vamos a consultar solamente
00:28:15
Y si no
00:28:17
Pues estarás restringiendo
00:28:19
Tus opciones de aprendizaje
00:28:21
Te estarás limitando a ti mismo
00:28:23
Si no lo usas nunca
00:28:29
Bueno, como en colecciones
00:28:31
Lo usamos todo el rato en conjuntos
00:28:37
Vale, entonces
00:28:38
Esto ya, como, a ver
00:28:40
el forEach cuando elegimos usarlo.
00:28:42
Cuando vamos a recorrer un array
00:28:44
entero de principio a fin.
00:28:46
Entero de principio a fin. Y cuando
00:28:48
solamente vamos a consultar
00:28:50
información. Ahí el forEach es muy
00:28:52
cómodo, porque ya sabemos lo que significa.
00:28:54
Va recorriendo este array
00:28:56
de principio a fin. No tengo opción
00:28:58
de salirme a la mitad, a menos que haga un break
00:29:00
ahí porque me dé la gana. Lo recorre de principio
00:29:02
a fin. Y en cada iteración
00:29:04
esta cosa P
00:29:06
es cada uno de los
00:29:08
objetos del array contactos.
00:29:10
sí, pero para mostrar
00:29:12
me da igual mostrar a través de la copia
00:29:16
que de sí mismo
00:29:18
vale, entonces vamos a
00:29:18
aprender un poquito más
00:29:21
una chorradita pero útil, imprescindible
00:29:24
vale, entonces
00:29:25
nosotros queremos mostrar
00:29:27
todos los datos de la persona
00:29:29
menudo rollo es poner aquí
00:29:31
p.get
00:29:34
nombre
00:29:35
más
00:29:36
p.get dirección
00:29:39
Dirección más p.get edad.
00:29:47
¿Qué es lo que tengo que usar para mostrarlo?
00:29:56
Porque el p.nombre sin más no podemos porque p es privado.
00:29:58
Perdón, nombre es privado.
00:30:02
p.dirección no podemos porque dirección es privado.
00:30:03
Con lo cual, para acceder, obtener esas propiedades, obtenerlas,
00:30:06
tengo que hacerlo a través del get.
00:30:11
No hay otra.
00:30:12
Vale, pues hombre, menudo rollo.
00:30:14
Vaya sistema más largo.
00:30:16
Bueno, vamos a probarlo antes de intentar modificarlo
00:30:16
A ver si nos ha
00:30:19
Agregamos a una persona
00:30:20
Ala
00:30:25
Que
00:30:26
Bueno, si no he puesto la opción
00:30:28
De mostrar información, es muy complicado
00:30:34
Que pueda mostrar la información
00:30:36
A ver
00:30:37
Vamos a
00:30:39
Poner la opción
00:30:42
De mostrar información
00:30:44
Vale, case2
00:30:53
Venga, vamos a hacer el case2
00:30:55
Y ahora, aquí lo único que habrá que hacer es
00:30:59
Pues esto, llamar al método
00:31:05
Libreta.mostrarInformación.break
00:31:07
Ya está
00:31:10
No hay que pedir datos de entrada al usuario
00:31:11
No hay que pedir nada porque no hay que pasar nada al método
00:31:14
Pues venga, vamos a probarlo
00:31:17
Agregamos a 1
00:31:21
Y ahora vamos a ver si ese se ha agregado
00:31:24
Pues sí, está aquí agregado
00:31:29
Vale
00:31:32
Pero cómo no va
00:31:33
Los que no vais hoy, vosotros
00:31:38
Él está haciendo exactamente lo que tú le has mandado
00:31:39
Si lo has mandado mal
00:31:42
No
00:31:43
Algo tienes que tener distinto
00:31:45
No, sí, sí, tranquilo
00:31:49
Bueno, estamos
00:31:51
No hace falta descansar, ¿no?
00:31:57
Un poquito
00:32:03
dime
00:32:04
al método este
00:32:08
es un system out
00:32:11
con las tres propiedades
00:32:15
sacadas a través del get
00:32:17
¿qué error te da?
00:32:18
que no me lo muestra
00:32:23
a ver, a lo mejor
00:32:24
el que tienes mal es al agregar que no te lo agrega
00:32:29
mostrarte lo está haciendo bien
00:32:31
pero no lo estás agregando
00:32:33
a lo mejor tienes mal el otro método
00:32:34
hay veces
00:32:36
algo no funciona y buscamos en el sitio
00:32:37
incorrecto, muy bien
00:32:40
me alegro mucho y eso
00:32:44
te convierte en mejor persona
00:32:46
bueno
00:32:48
vale, está claro
00:32:58
no, bueno sí pero no
00:33:01
venga pues entonces
00:33:04
menudo rollo ha sido este system out
00:33:07
Poner
00:33:11
Todo esto de aquí
00:33:13
¿Verdad?
00:33:15
Vale
00:33:17
Claro
00:33:18
Entonces, ojalá, si nosotros queremos mostrar
00:33:20
La persona enterita
00:33:23
¿Por qué no podemos hacer esto?
00:33:24
Ese
00:33:32
El famoso tu stream
00:33:32
No, si queremos mostrar la persona entera
00:33:34
¿Por qué no podemos hacer esto?
00:33:37
¿Por qué no podemos hacerlo?
00:33:40
Muestro la persona
00:33:42
hombre, porque si lo hacemos, mirad lo que nos sale
00:33:43
no, no nos sale
00:33:45
ningún error, ¿qué es lo que nos sale?
00:33:47
tres
00:33:54
y ahora
00:33:55
muestro información
00:33:56
me sale una información
00:33:57
que está relacionada con la persona
00:34:00
pero no es la que yo quiero
00:34:02
¿vale? me sale una información
00:34:04
vale
00:34:06
entonces, ¿por qué nos sale esta cosa rara?
00:34:07
¿cómo funciona
00:34:11
el system out este de aquí?
00:34:12
este sistema, tú le pasas algo
00:34:16
y él
00:34:18
como tiene que mostrarlo por consola
00:34:20
fuerza su conversión a string
00:34:22
entonces para
00:34:24
forzar la conversión de string a algo
00:34:26
tiene que llamar a
00:34:28
un método que tienen
00:34:30
todas, todas, todas las
00:34:32
entidades, aunque nosotros no lo hayamos
00:34:34
hecho, todas las entidades tienen un método que
00:34:36
se llama toString
00:34:38
que lo que hace dentro es
00:34:39
convertir a string ese
00:34:42
objeto, y ese método está
00:34:44
oculto, ya entenderemos por qué está oculto cuando
00:34:46
hablemos de la herencia, es como cuando yo os decía
00:34:48
cuando hacéis una entidad
00:34:50
siempre hay un constructor sin
00:34:51
parámetros que está ahí oculto aunque no lo veáis
00:34:54
pues aunque no lo veáis
00:34:56
ahí hay un método toString
00:34:58
oculto que sirve
00:35:00
para convertir a cadena el
00:35:02
objeto, pero claro, ese método
00:35:04
toString hace lo que le da
00:35:06
la gana, bueno, más que lo que le da la gana
00:35:08
lo que tiene programado debajo, ya veamos
00:35:10
ya veremos, y lo que tiene programado
00:35:12
es hacer esto
00:35:14
y es que
00:35:16
esto no nos interesa lo más mínimo
00:35:18
entonces, vamos
00:35:19
a hacernos nosotros en nuestra clase
00:35:22
profesor, nuestro propio
00:35:24
nuestro propio método toString
00:35:26
que sustituya a ese oculto
00:35:28
que no nos ha gustado
00:35:30
vamos a hacerlo
00:35:31
eh
00:35:32
perdón
00:35:33
persona
00:35:41
vale, a ver, hablar
00:35:42
y pensar a la vez
00:35:45
de lo que creéis
00:35:47
vale, pues vamos a hacernos en persona
00:35:48
nuestro propio método toString
00:35:51
para que no funcione
00:35:53
como con la versión
00:35:56
del oculto, que es esta versión
00:35:57
y sino que funcione como la versión que nos demos
00:35:59
nosotros, y ese método
00:36:01
toString tiene que
00:36:03
tener, para que el system.out.println
00:36:05
lo encuentre
00:36:07
tiene que tener una cabecera específica
00:36:08
podemos escribirle
00:36:12
y recordarla, pero sobre todo
00:36:13
esto va a ser interesante cuando hagamos herencia
00:36:15
entonces, para no tener que escribir y recordarla
00:36:17
pues de nuevo tenemos el botón derecho
00:36:19
el source
00:36:21
y en el source, ¿no veis aquí
00:36:22
un generate to stream?
00:36:25
pues
00:36:28
él te genera, dices, vale, te dice
00:36:29
en el to stream, ¿qué quieres
00:36:31
convertir a stream? ¿qué campos
00:36:32
quieres convertir a tu stream? venga
00:36:35
los tres, que en el to stream me aparezca todo
00:36:37
y él te ofrece esto, te hace
00:36:39
un método, esta anotación si queréis
00:36:41
la podéis quitar, yo la voy
00:36:43
a quitar por ahora, porque como no sabemos lo que significa
00:36:45
la quito
00:36:47
¿vale? y él te ofrece
00:36:47
eso, te dice, vale, pues voy a convertir
00:36:51
a string este objeto, devolviéndome un string
00:36:53
y ese string
00:36:55
tiene esta forma
00:36:57
¿te gusta esta?
00:36:58
si no te gusta, la cambias, hombre, a mí me gusta
00:37:00
nombre igual al
00:37:03
valor de nombre, dirección igual
00:37:05
al valor de dirección, edad igual
00:37:07
al valor de edad, hombre, pues me gusta este tu string
00:37:09
que no me gusta, pues lo cambio
00:37:11
vale, entonces ahora ya
00:37:12
si volvemos a ejecutar esto
00:37:14
pues hombre
00:37:16
me sale ya la información de la persona
00:37:24
más bonita
00:37:27
y no hemos tenido que
00:37:27
en nuestro
00:37:30
mostrar información, no hemos tenido que sacarla
00:37:32
nosotros una por una, p.get, no hombre
00:37:35
p.no se que
00:37:37
le hemos puesto el objeto entero
00:37:38
y ya el system out se ocupa
00:37:40
de llamar al toString
00:37:43
coge el string
00:37:44
correspondiente que le ha dado el toString
00:37:46
que es todo esto
00:37:48
y ese toString es el que nos muestra
00:37:49
entonces esto nos va a ser muy cómodo
00:37:52
para mostrar contenido de objetos
00:37:54
sin tener que irlo separando
00:37:56
propiedad por propiedad
00:37:58
entonces es algo que se suele hacer
00:37:59
por defecto
00:38:02
cuando uno hace una entidad
00:38:04
pues hace los get, los set
00:38:07
los constructores y suele poner un toString
00:38:09
para si pasa ese objeto
00:38:11
en un system out
00:38:14
pues que se muestre
00:38:15
con algo inteligible
00:38:16
¿verdad?
00:38:19
vale, pues mostrar
00:38:20
información, obtener información, ya lo tenemos
00:38:34
entonces
00:38:37
obtener conteo, este método
00:38:38
no hace falta ni hacerle, es
00:38:40
retuncontactos.led
00:38:42
ya está
00:38:45
¿cuántas personas hay? retuncontactos.led
00:38:46
eliminar persona
00:38:49
vamos a hacer eliminar persona
00:38:51
vale, obtener
00:38:52
información, lo que pasa es que aquí dice
00:38:55
que te lo muestre en una
00:38:56
cadena así, pues hombre, podríamos
00:38:59
a adaptarlo a esta cadena. Poner la libreta de direcciones
00:39:00
contiene tres personas. Ir
00:39:02
construyendo esto nosotros. Pero bueno, eso es
00:39:04
lo de menos, ¿no?
00:39:06
Que yo aquí me he limitado en mi obtener información.
00:39:08
Me he limitado a
00:39:11
mostrar la lista
00:39:12
de personas tal cual. Pero podríamos
00:39:14
haber puesto aquí un system out.
00:39:16
La libreta tiene, no sé nombre,
00:39:18
get patatín. Podríamos haber construido
00:39:20
todo ese string y ya está. Para que se adaptara
00:39:22
a esto. Pero bueno, es lo de menos.
00:39:24
Obtener conteo. No hace
00:39:27
falta hacerlo. Es return el array.
00:39:28
Vamos a hacer eliminar personas
00:39:30
Eso sí
00:39:31
Espera, porque no queremos largas
00:39:32
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 23
- Fecha:
- 13 de diciembre de 2024 - 18:06
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 39′ 37″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 180.07 MBytes