Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 6-02-24 - 1 - 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:
ayer habíamos terminado diciendo
00:00:00
que
00:00:03
en Java siempre hay una jerarquía
00:00:04
una jerarquía de herencia
00:00:07
aunque nosotros no la hagamos específicamente
00:00:09
aquí en este ejercicio
00:00:11
si habíamos hecho una jerarquía específica
00:00:13
que era animal
00:00:15
y de animal heredan ave, perro
00:00:16
y pez
00:00:19
pero aunque no hagamos ninguna jerarquía
00:00:19
siempre hay una implícita
00:00:25
porque existe una clase object
00:00:26
una clase object que nos la aporta
00:00:29
la máquina virtual
00:00:31
junto con otras mil
00:00:32
string, scanner, buffer,
00:00:34
reader, bla bla bla
00:00:37
pues existe una clase object
00:00:38
con muy poquitas cosas
00:00:41
de la que todas las clases
00:00:42
heredan si es que
00:00:45
no especificamos que hereden de alguna otra
00:00:47
entonces este sería
00:00:49
el caso de animal
00:00:51
esta clase no hereda de ninguna
00:00:51
pero no es
00:00:54
eh
00:00:56
la parte alta de la jerarquía
00:00:57
no, porque no heredar de ninguna
00:01:01
significa que en realidad
00:01:02
es como si hiciéramos esto
00:01:04
como si heredara de object
00:01:06
vale
00:01:09
entonces no heredar de
00:01:10
no poner nada
00:01:11
es lo mismo que poner esto
00:01:13
entonces todas las clases
00:01:15
todas las clases que hagamos
00:01:17
heredan
00:01:18
de verdad que rabia lo de no tener rotulador
00:01:19
porque
00:01:22
a ver si me compro uno una vez
00:01:23
vale
00:01:25
entonces todas las clases que hagamos
00:01:27
todas las clases en realidad
00:01:27
todas heredan de esta
00:01:28
todas
00:01:41
si no se pone nada
00:01:42
entonces en nuestro ejemplo pues teníamos animal
00:01:45
que
00:01:47
hereda de object
00:01:57
animal hereda de object
00:01:59
porque al no haber puesto
00:02:01
que hereda de ninguna
00:02:03
es como haber puesto esto
00:02:05
hereda de object
00:02:06
entonces ya sabemos lo que significa heredar
00:02:07
heredar significa
00:02:09
que todo lo que haya en object
00:02:11
es como si estuviera aquí también escrito
00:02:13
tanto propiedades como métodos
00:02:15
todo
00:02:17
exceptuando los constructores
00:02:18
los constructores hay que hacerlos específicamente
00:02:20
y ya vimos ayer como
00:02:23
la forma habitual de hacer un proyecto es hacer una propiedad y hacer un objeto
00:02:25
la forma habitual de hacer un constructor en una subclase
00:02:26
suele ser apoyándose
00:02:28
en constructores
00:02:30
que ya hay hechos en la superior
00:02:32
llamándolos con super etcétera
00:02:34
vale entonces animal vale dar todo lo de object que es muy poca cosa
00:02:36
y luego además nosotros
00:02:38
en nuestra aplicación habíamos hecho
00:02:40
pues una clase
00:02:42
ave, perro
00:02:44
de todo y
00:02:46
pues esa clase ave
00:02:56
heredaba de animal
00:02:58
y también teníamos
00:03:04
la clase perro
00:03:20
hereda de animal y así todas
00:03:22
entonces
00:03:24
niveles de jerarquía
00:03:26
puede haber
00:03:28
hasta el infinito
00:03:30
lo que pasa es que hombre
00:03:32
la idea es que cuando uno hace un diseño de clases
00:03:34
sirva para ayudar
00:03:36
para representar la situación
00:03:38
que quiere gestionar y para hacer una especie
00:03:40
pues de pintura
00:03:42
de foto de ella que sea útil
00:03:44
entonces si una jerarquía ya es demasiado grande
00:03:46
seguramente ese diseño que hemos hecho
00:03:48
pues ya empieza a ser confuso
00:03:50
porque que pasa en una jerarquía? ave
00:03:52
ave va a tener
00:03:54
lo que hemos escrito en ella específicamente
00:03:56
eso está claro pero además ave va a tener
00:03:58
aunque nosotros no lo veamos va a tener todo lo que hay en animal
00:04:00
salvo los constructores
00:04:02
pero es que además
00:04:04
ave va a tener todo lo que hay en object
00:04:06
porque lo hereda a través de animal
00:04:08
lo hereda entonces ave va a tener
00:04:10
todo lo que hay en animal excepto constructores
00:04:12
y todo lo que hay en object excepto constructores
00:04:14
entonces si la jerarquía ya empezamos
00:04:16
a hacerla demasiado grande y hacemos clases
00:04:18
que hereden y a su vez que hereden
00:04:20
el lío de clases que se nos queda
00:04:22
pues es muy confuso porque llega un momento
00:04:24
en que ya no sabemos lo que hay dentro de esta clase
00:04:26
tiene tantas cosas que podemos perder
00:04:28
un poquito el control
00:04:30
entonces como todas las herramientas
00:04:32
como todas
00:04:34
hay que usarlas de manera que ayude
00:04:36
que hagan aplicaciones claras
00:04:38
que representen lo que queremos
00:04:40
entonces en la realidad rara vez
00:04:42
hay situaciones que exijan una jerarquía
00:04:44
demasiado profunda
00:04:46
rara vez vale
00:04:48
lo normal es que con dos niveles ya
00:04:50
representen todo lo que queremos
00:04:52
porque más allá de dos niveles se va a complicar
00:04:54
entonces
00:04:56
no olvidemos que todas las clases
00:04:58
de Java heredan de object
00:05:00
todas las que hagamos
00:05:02
si es que no ponemos nada y luego además
00:05:04
de cada una de esas clases
00:05:06
si queremos pues pueden heredar otras
00:05:08
y así vamos haciendo un arbolito
00:05:10
de clases
00:05:12
que
00:05:14
como ya hemos dicho otras veces
00:05:16
se queda un poco pobre
00:05:18
porque
00:05:20
las clases solo pueden heredar de una
00:05:22
solo puede heredar de una
00:05:24
a lo mejor aquí podría haber
00:05:26
otra clase que fuera mamífero
00:05:28
otra clase que fuera mamífero
00:05:30
porque esta aplicación nuestra
00:05:32
pues trabaja con conceptos relacionados con animales
00:05:34
con conceptos relacionados con mamíferos
00:05:36
con lo que sea
00:05:38
bueno en este caso parece que mamífero podría heredar de animal
00:05:40
pero bueno imaginaos que tenemos aquí una clase mamífero
00:05:42
que
00:05:44
va por libre
00:05:46
entonces a lo mejor tendría sentido hacer
00:05:48
que perro
00:05:50
cogiera todo lo de animal
00:05:52
que perro cogiera todo lo de mamífero
00:05:54
porque tiene
00:05:56
la doble personalidad
00:05:58
pues no se puede hay que elegir
00:06:00
o heredo de uno o heredo de otro
00:06:02
entonces eso
00:06:04
nos resta posibilidades
00:06:06
para diseñar nuestras clases
00:06:08
sería más bonito
00:06:10
que una clase pudiera
00:06:12
cogerlo de varias a través de la herencia
00:06:14
pues no puede
00:06:16
entonces como no puede y efectivamente
00:06:18
eso es una limitación un poco fea
00:06:20
un poco fea porque no tiene sentido en la vida real
00:06:22
uno puede tener doble personalidad
00:06:24
y triple y lo que quiera
00:06:26
pues como es una limitación un poco fea
00:06:28
pues entonces se hace
00:06:30
otra cosa más que es lo siguiente
00:06:32
que veremos vale
00:06:34
que son las interfaces y su implementación
00:06:36
pero eso es lo siguiente que veremos
00:06:38
son la misma idea que la herencia
00:06:40
pero incluye unos pequeños matices nada más
00:06:42
bueno pues entonces
00:06:44
como todas heredan de object
00:06:46
que es lo que nos quedamos diciendo ayer
00:06:48
todas tienen cosas ahí
00:06:50
que no estamos viendo
00:06:52
y en particular
00:06:54
hay dos métodos
00:06:56
que toda clase tiene
00:06:58
por el hecho de heredar de object
00:07:00
que sí que son muy útiles
00:07:02
y que se usan continuamente
00:07:04
y que no los hemos programado nosotros
00:07:06
los estamos usando sin haberlos programado
00:07:08
y los está heredando de object
00:07:10
vale vamos a ver eso
00:07:12
y ya dejaríamos medio cerrado
00:07:14
lo de la herencia
00:07:16
vale
00:07:18
bueno pues entonces
00:07:20
vamos a hacernos otra clase
00:07:22
para no volver a
00:07:24
tocar esta ya
00:07:26
habíamos dejado que esta era abstracta
00:07:28
porque tenía un método
00:07:30
que habíamos decidido que fuera abstracto
00:07:32
porque este método
00:07:34
realizar acción del animal
00:07:36
no podíamos definirlo en este punto
00:07:38
en la clase animal no podíamos definirlo
00:07:40
realizar acción del animal
00:07:42
que acción depende
00:07:44
que acción realiza el animal no lo sé
00:07:46
entonces como aquí habíamos decidido
00:07:48
que este método
00:07:50
no podíamos todavía definirlo
00:07:52
entonces pegaba
00:07:54
quedaba más bonito si lo hacíamos abstracto
00:07:56
en lugar de dejarle un cuerpo vacío
00:07:58
y entonces la clase se convertía en abstracta
00:08:00
y ya veíamos las implicaciones que teníamos
00:08:02
que todo lo que heredara de una clase abstracta
00:08:04
estaba obligada
00:08:06
a darle cuerpo a este método
00:08:08
entonces vamos a hacer otra clase
00:08:10
para ver estos métodos que os digo de object
00:08:12
y así no retocamos por enésima vez esta
00:08:14
bueno
00:08:16
pues vamos a hacernos otro animalillo
00:08:18
por ahí
00:08:20
otra clase
00:08:22
no pero que no herede de animal
00:08:24
otra clase cualquiera
00:08:28
clase cuidador yo que sé
00:08:32
por poner algo
00:08:34
vale
00:08:38
cuidador no hereda de animal
00:08:40
un cuidador en la mayoría de los casos
00:08:42
no es un animal
00:08:44
entonces es otra entidad
00:08:46
de mi aplicación esta de animales
00:08:48
de zoológico de lo que sea
00:08:50
es otra entidad cualquiera que hago aparte
00:08:52
vale
00:08:54
esta no la hago heredar de ninguna
00:08:56
no la hago heredar de ninguna
00:08:58
si no la hago heredar de ninguna
00:09:00
significa
00:09:02
que entonces
00:09:04
tiene una herencia implícita
00:09:06
que es de la clase object
00:09:08
vale que es de la clase object
00:09:10
y la clase object
00:09:12
para tenerla aquí al ladito abierta
00:09:14
pues vamos a
00:09:20
a ver
00:09:22
recordad que
00:09:30
aquí la JRE
00:09:32
tiene tropecientos mil paquetes
00:09:34
con tropecientos mil
00:09:36
clases pero tropecientos
00:09:38
por ejemplo tiene aquí en el paquete
00:09:44
java lang en este
00:09:46
tiene tropecientas mil cosas
00:09:48
aquí
00:09:50
bueno pues yo en particular
00:09:52
lógicamente las que tiene
00:09:56
la máquina virtual son las compiladas
00:09:58
las punto clas
00:10:00
porque son las que la máquina virtual
00:10:02
necesita
00:10:04
a ver Moisés te traigo otra vez con Adrián
00:10:06
o traigo
00:10:08
a María me da lo mismo
00:10:10
digo yo
00:10:12
vale aquí está el punto clas
00:10:14
porque el punto clas es la que la máquina virtual
00:10:16
necesita obviamente
00:10:18
pero están
00:10:20
incorporados el Eclipse me incorpora
00:10:22
los fuentes para que yo me facilite
00:10:24
el desarrollo me lo facilite
00:10:26
entonces si yo pincho aquí
00:10:28
no es que se me abra el punto clas porque el punto clas
00:10:30
estaría en un idioma que yo no entiendo
00:10:32
no se me abre el punto clas que es el compilado
00:10:34
lo que hace el Eclipse es buscar
00:10:36
el código fuente que generó ese clas
00:10:38
y me abre ese código fuente
00:10:40
vale pero realmente los ficheros
00:10:42
que están en la máquina virtual que son los que tienen que estar
00:10:44
porque son los que necesita
00:10:46
luego para la ejecución
00:10:48
son los clas obviamente pero bueno
00:10:50
el Eclipse afortunadamente
00:10:52
las últimas versiones desde hace ya tiempo
00:10:54
me incorporan el fuente
00:10:56
entonces si pincháis en cualquiera de ellas
00:10:58
se van a buscar el fuente y te lo abren
00:11:00
entonces en particular
00:11:02
esta
00:11:04
vale vamos a
00:11:06
abrir object
00:11:10
vale
00:11:12
entonces repito
00:11:16
aunque aquí ponga object punto clas
00:11:18
esto no es
00:11:20
object punto clas
00:11:22
object punto clas es un código ya compilado
00:11:24
el bytecode de toda la vida que decíamos
00:11:26
un código que no podíamos nunca jamás
00:11:28
ver en un fichero de texto
00:11:30
nunca jamás podríamos porque no es código fuente
00:11:32
pero ese
00:11:34
punto clas se corresponde
00:11:36
con este código fuente
00:11:38
que está aquí
00:11:40
y en este código fuente hay un montón de cosas
00:11:42
que está heredando
00:11:44
la aplicación
00:11:46
por ejemplo
00:11:48
hay un constructor vacío
00:11:50
hay un constructor vacío
00:11:52
entonces cuando nosotros en cuidador
00:11:54
imaginaos que generamos un constructor
00:11:56
sin parámetros
00:11:58
con el Eclipse
00:12:00
que hacíamos esto
00:12:02
genero un constructor
00:12:04
entonces como no tiene campos
00:12:08
no me deja
00:12:10
no tengo opción de
00:12:12
generarlo de otra manera
00:12:14
si así
00:12:16
vale
00:12:18
cuando generamos el constructor
00:12:20
nosotros directamente con el Eclipse
00:12:22
recordáis que nos aparecía siempre esto
00:12:24
en la primera línea y yo decía
00:12:26
esto que este o no este
00:12:28
es que da exactamente igual
00:12:30
ahora ya entendemos que da exactamente igual
00:12:32
porque que hace esta llamada
00:12:34
llama al constructor de la clase padre
00:12:36
el constructor de la clase
00:12:38
padre cual es
00:12:40
es decir llama al constructor
00:12:42
sin parámetros de la clase padre
00:12:44
que es este
00:12:46
y este constructor que hace nada vacío
00:12:48
por eso ese super
00:12:50
que nos ponía
00:12:52
entre que este y no este nada
00:12:54
no hace absolutamente nada
00:12:56
vale y por eso lo quitábamos
00:12:58
bueno
00:13:00
pues entonces
00:13:02
la clase object tiene ese constructor
00:13:04
que no hace nada
00:13:06
y tiene otras cosas de las cuales dos
00:13:08
si que nos interesan
00:13:10
bueno pues vamos a
00:13:12
a verlo
00:13:14
vamos a ponerle propiedades al cuidador
00:13:16
para poder hacer algo
00:13:18
a ver le ponemos
00:13:20
que el cuidador va a tener
00:13:22
un código
00:13:24
y va a tener un nombre
00:13:30
para no perder
00:13:34
mucho tiempo en propiedades
00:13:36
va a tener
00:13:40
un código y un nombre
00:13:42
entonces en condiciones normales pues siempre hacemos
00:13:44
en las entidades siempre hacemos
00:13:46
constructor con y sin parámetros
00:13:48
y luego getter y setter
00:13:50
vale pues es lo que
00:13:52
vamos a hacer aquí
00:13:54
constructor
00:13:56
con parámetros
00:14:00
y get y set
00:14:04
pues nada
00:14:16
esta es mi entidad normal y corriente
00:14:18
propiedades, constructor
00:14:20
y get y setter
00:14:22
no hereda de nadie
00:14:24
osea no he puesto ningún extens
00:14:26
luego hereda de hoy
00:14:28
vale vamos ahora en un main a hacer cosas con cuidadores
00:14:30
en un main a hacer cosas con cuidadores
00:14:32
pues venga
00:14:38
nos vamos a
00:14:40
a nuestro main
00:14:44
en el que hacíamos las pruebas estas
00:14:50
con los animales
00:14:52
hicimos todas las pruebas
00:14:54
para verle el polimorfismo como funcionaba
00:14:56
etc etc
00:14:58
y para que nos servía
00:15:00
vale
00:15:02
y
00:15:04
vamos a añadir este main
00:15:06
algunas cositas
00:15:08
con el cuidador
00:15:10
le voy a poner aquí
00:15:12
para
00:15:14
indicar que ya estamos
00:15:16
vale vamos a hacer algunas cositas con el cuidador bueno pues vamos a
00:15:18
crear dos cuidadores
00:15:20
por ejemplo dos cuidadores
00:15:22
distintos
00:15:24
un cuidador c1
00:15:28
que sea un cuidador de código 1
00:15:32
y nombre
00:15:34
pues este
00:15:36
ala
00:15:38
ya tenemos un cuidador creado
00:15:40
y ahora vamos a hacer otro
00:15:46
vale tenemos dos cuidadores
00:15:50
con estos cuidadores yo ahora
00:16:08
no puedo hacer nada en realidad
00:16:10
ahora mismo no puedo hacer nada con ellos
00:16:12
porque la clase cuidador
00:16:14
es que no tiene nada
00:16:16
no le he puesto ningún método como para que haga cosas
00:16:18
pues añadirle no se que
00:16:20
asignarle animales
00:16:22
no tiene nada este cuidador no tiene nada
00:16:24
vale
00:16:26
pero por el hecho de
00:16:28
heredar de object
00:16:30
tiene métodos de la clase object que puede usar
00:16:32
y que de hecho usamos
00:16:34
continuamente y que tenemos que entender
00:16:36
muy bien como están funcionando
00:16:38
porque los usamos continuamente
00:16:40
y me refiero en particular a equals
00:16:42
y a toString
00:16:44
vale a equals y a toString
00:16:46
vale vamos con el primer
00:16:48
de ellos
00:16:50
nos vamos a nuestro main
00:16:52
y vamos a poner aquí
00:16:56
la clase cuidador
00:17:00
hereda
00:17:02
el método
00:17:04
toString
00:17:08
de la clase object
00:17:10
lo hereda
00:17:14
yo no tengo ningún toString metido aquí en cuidador
00:17:16
no tengo ninguno
00:17:18
pero sin embargo
00:17:20
pero sin embargo
00:17:22
yo si que puedo aquí
00:17:24
hacer que el objeto
00:17:26
c1
00:17:28
llame al método toString
00:17:30
puedo perfectamente
00:17:32
c1 está llamando al método toString
00:17:34
pero este método
00:17:36
yo no lo he hecho en la clase cuidador
00:17:38
no lo he hecho
00:17:40
pero lo puede llamar porque toString es un método
00:17:42
que está en object
00:17:44
todos los métodos y propiedades salvo constructores
00:17:46
de una superclase
00:17:48
se heredan en la subclase
00:17:50
bueno pues toString es tan obvio
00:17:52
ahora la pregunta sería
00:17:54
y para que me sirve ese método
00:17:56
tiene sentido que yo lo use alguna vez
00:17:58
hombre pues si
00:18:00
pues es un método que si que se usa
00:18:02
a menudo
00:18:04
para que hemos convenido todos
00:18:06
para que convenimos todos
00:18:08
los que
00:18:10
el programa manejaba
00:18:12
para que se use
00:18:14
bueno pues para dar información sobre él
00:18:16
esa es la idea de este método
00:18:18
dar información sobre este objeto
00:18:20
recordad que c1
00:18:22
en realidad es una dirección de memoria
00:18:24
eso es lo que es
00:18:26
es una dirección de memoria
00:18:28
que apunta a un espacio donde ya están las propiedades de c1
00:18:30
en este caso código y nombre
00:18:32
entonces
00:18:34
si yo quiero información sobre ese objeto
00:18:36
pues podría yo construirla
00:18:38
accediendo a c1 punto código
00:18:40
c1 punto nombre
00:18:42
y mostrarlo todo
00:18:44
vale
00:18:46
podríamos hacer eso
00:18:48
pero se ha llegado
00:18:50
de alguna manera al convenio
00:18:52
que este método toString
00:18:54
lo que haga sea
00:18:56
devolver un string
00:18:58
con información sobre el objeto al que
00:19:00
apunta c1
00:19:02
es el convenio al que se llega
00:19:04
que este método sea
00:19:06
el que devuelve un string
00:19:08
con valor de retorno, devuelve un string
00:19:10
con información sobre ese objeto
00:19:12
entonces como devuelve con valor de retorno
00:19:14
un string
00:19:16
de hecho si nos vamos aquí a ver el toString
00:19:18
efectivamente devuelve un string
00:19:20
ese es el toString de object
00:19:22
el que estamos heredando
00:19:24
esto ahora no lo diréis
00:19:26
el toString de object como devuelve un string
00:19:28
pues hombre si quiero yo ver
00:19:30
el efecto
00:19:32
de la llamada
00:19:34
pues hombre
00:19:36
voy a pasárselo a un system.out para mostrarlo
00:19:38
sino no lo voy a poder mostrar
00:19:40
vale pues para eso se conviene
00:19:46
para eso se ha convenido que se use toString
00:19:52
para que devuelva un string
00:19:54
con información de c1
00:19:56
pero claro yo aquí
00:19:58
no es sobre escrito
00:20:00
el método toString en cuidador
00:20:02
no lo es sobre escrito
00:20:04
entonces está tirando del que está en object
00:20:06
está tirando del que está en object
00:20:08
no lo es sobre escrito
00:20:10
y el método que está en object
00:20:12
es un método genérico
00:20:14
que lo que te muestra es una basurilla
00:20:16
el método toString de object
00:20:18
te devuelve
00:20:20
el nombre de la clase
00:20:22
porque getClash te da el nombre de la clase
00:20:24
todo esto
00:20:26
el nombre de la clase
00:20:28
un arroba
00:20:30
y luego un código
00:20:32
un código hash
00:20:34
que ya veremos cuando veamos conjuntos
00:20:36
y tablas hash
00:20:38
que es un código hash
00:20:40
es un código
00:20:42
asociado
00:20:44
si, pero que normalmente tiene un uso
00:20:46
que es tratar de
00:20:48
me sale clasterizar
00:20:50
pero no
00:20:52
se usa para encriptar
00:20:54
es uno de los usos de los códigos hash
00:20:56
pero en general es cuando tienes una diversidad
00:20:58
de objetos muy grande
00:21:00
y los quieres identificar fácilmente
00:21:02
pues les asocias efectivamente un identificador
00:21:04
y ese identificador es el código hash
00:21:06
pero claro
00:21:08
si la idea de ese código hash
00:21:10
es que
00:21:12
te reduzca
00:21:14
la variabilidad de toda esa bolsa de cosas
00:21:16
entonces hay varios objetos
00:21:18
que te pueden llegar al mismo código hash
00:21:20
bueno, ya volveremos sobre ello
00:21:22
pero si, en resumen
00:21:24
el código hash es normalmente una forma sencilla
00:21:26
de identificar a cualquier cosa
00:21:28
en nuestro caso a un objeto
00:21:30
pero puede ser a cualquier cosa
00:21:32
es una forma sencilla de identificar a cualquier cosa
00:21:34
que luego tiene muchos usos
00:21:36
lo tiene en encriptación
00:21:38
lo tiene en almacenamiento
00:21:40
lo tiene en muchas partes
00:21:42
pero en general es un número para identificar una cosa
00:21:44
y luego en función de como lo generes
00:21:46
las reglas de generación
00:21:48
que pueden ser muchas
00:21:50
lo puedes usar para unas cosas o para otras
00:21:52
pero por definición es
00:21:54
un numerito para identificar una cosa
00:21:56
bueno, pues a lo que vamos
00:21:58
el toString este
00:22:00
de object dice, pues yo que sé
00:22:02
yo aquí que hago, un object
00:22:04
pues te doy el nombre de la clase
00:22:06
un arroba y te doy un identificador
00:22:08
un identificador que genero
00:22:10
según una regla
00:22:12
que ahora tiene muy básica
00:22:14
porque es que ni siquiera la tenemos
00:22:16
una regla que tiene muy básica
00:22:18
¿eso nos vale para algo?
00:22:20
pues vaya descripción del objeto más fea
00:22:22
o sea si esa nos gusta
00:22:24
pues venga vamos a ver efectivamente que nos sale
00:22:26
pues esta es
00:22:36
la salida del toString
00:22:38
de object
00:22:40
el nombre de la clase efectivamente
00:22:42
como veis
00:22:44
el nombre de la clase es todo
00:22:46
no os miento, el nombre de la clase no es esto
00:22:48
el nombre de la clase es todo con el paquete
00:22:50
el nombre de la clase un arrobita
00:22:52
y la traducción a código esadecimal
00:22:54
del identificador de hash
00:22:56
hombre pues como salida del método toString
00:22:58
vaya mierda de descripción
00:23:00
de cuidador
00:23:02
no nos vale para nada
00:23:04
entonces ¿qué se suele hacer?
00:23:06
se suele sobreescribir en cada clase
00:23:08
el método toString de object
00:23:10
y es una de las cosas que se suele hacer
00:23:12
por sistema
00:23:14
igual que los constructores
00:23:16
los get y los set
00:23:18
pues igual que los constructores
00:23:20
los get y los set
00:23:22
digamos que en plan churro
00:23:24
como todo de carrerilla
00:23:26
también se sobreescribe toString
00:23:28
para que cada clase de la explicación
00:23:30
que le apetece dar
00:23:32
y no de la de object
00:23:34
que es una basurilla de explicación
00:23:36
entonces
00:23:38
¿cómo sobreescribiríamos toString?
00:23:40
pues para sobreescribir un método
00:23:42
porque hay que respetar la cabecera
00:23:44
tal cual
00:23:46
este es el que yo quiero sobreescribir
00:23:48
de object
00:23:50
pues venga lo voy a sobreescribir aquí
00:23:52
y aquí ya
00:23:56
pongo la descripción que a mi me de la gana
00:23:58
y la descripción que a mi me de la gana
00:24:00
puede ser
00:24:02
código
00:24:06
y lo concateno
00:24:08
con el código que sea
00:24:10
más
00:24:12
nombre
00:24:14
y lo concateno
00:24:16
con el nombre del cuidador
00:24:18
por ejemplo
00:24:20
me puede dar a mi la gana
00:24:22
que este sea el toString
00:24:24
de cuidador
00:24:26
vale este lo describe
00:24:28
pues entonces ahora ya
00:24:30
he pisado
00:24:32
a ver uno de los dos
00:24:34
no es eso uno de los dos
00:24:36
que elija venga
00:24:38
no de verdad
00:24:40
te lo juro lo siento
00:24:42
de verdad es que lo he dicho
00:24:44
me pone muy nerviosa
00:24:46
y si es contigo en todo el brazo
00:24:48
lo siento
00:24:50
y es que además aunque no te lo parezca
00:24:52
soy yo la que te lo deduco
00:24:54
venga quien elige
00:24:56
y aparte que
00:25:04
es estupendo que te explique las cosas
00:25:06
pero fuera de horario
00:25:08
vale
00:25:14
vale
00:25:16
vale
00:25:18
vale
00:25:20
vale
00:25:42
, si nos hemos equivocado
00:27:14
y aquí hemos puesto
00:27:16
en lugar de toString
00:27:18
pues lo hemos llamado de otra manera
00:27:20
y lo hemos llamado así
00:27:22
pues vale estupendo
00:27:24
habremos hecho otro método
00:27:26
habremos hecho otro
00:27:28
pero no estará sobre escribiendo
00:27:30
el toString de object
00:27:32
el que tiene aquí su mayúscula
00:27:34
y el resto del mundo cuando busque nuestra descripción
00:27:36
la va a buscar con el nombre estándar
00:27:38
con el nombre bueno que es el tu con la s mayúscula
00:27:40
entonces tenemos que adaptarnos a eso
00:27:42
y de hecho
00:27:44
es tan importante
00:27:46
que existe una cosa que se llama
00:27:48
anotaciones
00:27:50
para verificar muchas cosas en general
00:27:52
y una de ellas es para verificar
00:27:54
que este método realmente
00:27:56
sobreescribe el de arriba
00:27:58
o es uno que me he inventado
00:28:00
y esa anotación ahora si es el momento de meterla
00:28:02
es esta
00:28:04
arroba
00:28:10
overwrite
00:28:12
que es una anotación en general en java
00:28:14
una anotación en general
00:28:18
es algo que empieza
00:28:20
con la arroba
00:28:22
y tiene un término
00:28:24
que existe una sintaxis
00:28:26
no es comentario
00:28:28
porque los comentarios es algo
00:28:30
que para java no existen
00:28:32
los comentarios son para nosotros
00:28:34
para el programador que está leyendo el código
00:28:36
para java no existen
00:28:38
entonces no es comentario
00:28:40
pero tampoco es código
00:28:42
que se ejecute
00:28:44
es información sobre el código
00:28:46
que la máquina virtual
00:28:48
si tiene en cuenta
00:28:50
eso es en general el concepto de anotación
00:28:52
entonces configura partes del código
00:28:54
y hace muchas cosas
00:28:56
ahora mismo este año no vamos a tener la necesidad
00:28:58
de incorporar anotaciones en nuestros códigos
00:29:00
pero en segundo continuamente
00:29:02
habrá que incorporar anotaciones
00:29:04
para identificar bien esos códigos
00:29:06
bueno pues esta si es importante ahora
00:29:08
ya que la metamos
00:29:10
¿qué significa?
00:29:12
ojo que el método que viene después
00:29:14
sobre escribe uno de la clase
00:29:16
de la que heredas
00:29:18
¿no? de hecho
00:29:20
te lo está diciendo sobre escritura
00:29:22
te lo está diciendo
00:29:24
ojo que este método sobre escribe el de arriba
00:29:26
entonces no es obligatoria
00:29:28
podemos ponerla o no podemos ponerla
00:29:30
yo puedo no ponerla
00:29:32
puedo no ponerla
00:29:36
y simplemente
00:29:38
el hecho de que esta cabecera
00:29:40
sea idéntica calcada
00:29:42
a la cabecera de object
00:29:44
a esta
00:29:46
el hecho de que sea calcada
00:29:48
ya eso implica que está sobre escribiendo
00:29:50
ya eso implica
00:29:52
que está sobre escribiendo
00:29:54
no hace falta ponerla
00:29:56
pero ponerla es útil
00:29:58
¿por qué?
00:30:00
si yo la pongo en todos los métodos
00:30:02
que quiero que mi intención es que sean sobre escritos
00:30:04
la pongo y luego resulta que me equivoco
00:30:06
y lo escribo mal
00:30:08
automáticamente
00:30:10
el compilador va a detectar que hay un problema
00:30:12
te dice uy me dices que este sobre escrito
00:30:14
pues yo no lo conozco
00:30:16
en la clase padre no está
00:30:18
algo falla
00:30:20
entonces es muy útil ponerla
00:30:22
porque te avisa no vaya a ser que te hayas equivocado
00:30:24
a la hora de poner la cabecera
00:30:26
y no estés sobre escribiendo sino que estás haciendo otro
00:30:28
no estás haciendo otro distinto
00:30:30
entonces te permite detectar eso
00:30:32
por eso es útil
00:30:34
esta anotación
00:30:36
¿vale?
00:30:38
si yo tengo una anotación puesta
00:30:40
y lo escribo mal
00:30:42
a lo mejor me creo que estoy sobre escribiendo
00:30:44
el método toString
00:30:46
y no lo estás sobre escribiendo
00:30:48
estás haciendo otro distinto
00:30:50
y entonces ya vas a tener los dos coexistiendo
00:30:52
heredado de object que no ves
00:30:54
y el nuevo que has hecho
00:30:56
y eso es un problema
00:30:58
porque el resto de clases van a estar llamando al heredado que no ves
00:31:00
este es como si no existiera
00:31:02
¿vale?
00:31:04
pues la utilidad de la anotación es esa
00:31:06
¿vale?
00:31:08
vale pues entonces
00:31:10
si yo sobre escribo toString y decido así
00:31:12
pues hala estupendo
00:31:14
ahora yo cuando en mi main
00:31:16
haga un system.out.println de c1
00:31:18
en lugar de salirme esa cosa rara
00:31:20
me llamará
00:31:22
me llamará al toString de c1
00:31:24
y ya no llamará al toString de object
00:31:26
llamará al suyo propio que ha sobre escrito
00:31:28
y entonces ahora ya si
00:31:30
que nos saldrá algo pues más bonito
00:31:32
¿vale?
00:31:34
nos saldrá la descripción
00:31:36
anda ahora si que me salen las tildes
00:31:38
ah bueno es que siempre me han salido aquí
00:31:40
bueno da igual
00:31:42
entonces nos da una descripción más bonita
00:31:44
¿vale?
00:31:46
bueno pues entonces el método toString es un método
00:31:48
que vais a ver continuamente
00:31:50
que se incorpora en las entidades
00:31:52
porque ofrece
00:31:54
ofrece una
00:31:56
manera de
00:31:58
obtener una descripción mediante texto
00:32:00
de un objeto mediante texto
00:32:02
y a ese método toString
00:32:04
puede que recurran
00:32:06
hay muchas clases por ahí
00:32:08
puede que recurran
00:32:10
entonces vamos a sobre escribirlo bien
00:32:12
vamos a sobre escribirlo
00:32:14
y así esas clases que recurran a él
00:32:16
no van a tirar del de object del heredado
00:32:18
que saca una información muy extraña
00:32:20
¿vale?
00:32:22
bueno tanto es así lo de la utilidad de toString
00:32:28
que de hecho
00:32:30
el propio clipse
00:32:32
me ofrece generarlo automáticamente
00:32:34
voy a comentar
00:32:36
el nuestro
00:32:38
voy a comentar este
00:32:40
¿vale? entonces
00:32:42
si nos vamos de nuevo al
00:32:44
botón derecho para ver lo que me ofrece
00:32:46
la pestaña source este
00:32:48
pues una de las cosas que ofrece es
00:32:50
genera automáticamente un toString
00:32:52
genera uno
00:32:54
le damos
00:32:56
y te dice a ver
00:32:58
¿qué campus quieres que se incluya en la descripción?
00:33:00
pues quiero que se incluya
00:33:02
código y nombre solamente
00:33:04
métodos ninguno porque te genera automáticamente
00:33:06
unas descripciones muy extrañas
00:33:08
vale pues ya está
00:33:10
te lo crea
00:33:12
te dice venga ¿te gusta este toString?
00:33:14
que te devuelve este texto tan chulo
00:33:16
pues si y te pone el override
00:33:18
claro y te lo deja ya muy bien
00:33:20
¿te gusta este toString?
00:33:22
bueno pues puede ser
00:33:24
vamos a volver a probar en nuestro main
00:33:26
a ver si nos gusta
00:33:28
pues este
00:33:30
este es el toString que te genera el clipse
00:33:32
bueno
00:33:34
pues es cómodo
00:33:36
vale entonces es una buena práctica
00:33:38
que todas nuestras clases tengan toString
00:33:40
porque nunca sabemos cuando alguien
00:33:42
va a llamarlo
00:33:44
entonces para ofrecerle un arroba
00:33:46
un código hash o no se que
00:33:48
pues para eso le ofrecemos un mensajito
00:33:50
un poco más
00:33:52
más bonito
00:33:54
vale pues esto en cuanto al toString
00:33:58
de nuevo nos está sirviendo para ver
00:34:00
un ejemplo de
00:34:02
Mario
00:34:04
sobrescritura de métodos
00:34:06
vale
00:34:08
y recordad
00:34:10
que la sobrescritura
00:34:12
implica automáticamente
00:34:14
un polimorfismo el método toString
00:34:16
es el más polimorfo del mundo
00:34:18
si al toString lo llama un objeto cuidador
00:34:20
mostrará la descripción del cuidador
00:34:22
pero si al toString lo llama un objeto
00:34:24
no se que mostrará al toString de ese objeto
00:34:26
vale que eso era el polimorfismo
00:34:28
dependiendo del objeto
00:34:30
que lo llame ese método con
00:34:32
ese mismo nombre hace cosas distintas
00:34:34
bueno pues hala eso en cuanto al toString
00:34:40
y el segundo
00:34:42
que nos interesa heredado de
00:34:44
object que se usa continuamente
00:34:46
segundo que nos interesa
00:34:48
y que cuando veamos las colecciones
00:34:50
es imprescindible
00:34:52
manejarlo con soltura
00:34:54
el equals
00:34:56
vale pues entonces yo aquí ahora
00:34:58
en cuidador tengo los get los set
00:35:00
y el toString
00:35:02
son los que tengo
00:35:04
la versión que queráis
00:35:06
la que genera el eclipse la nuestra la que queráis
00:35:08
vale
00:35:10
y ya no tengo más
00:35:12
pero efectivamente en mi main
00:35:14
yo si puedo seguir llamando a métodos
00:35:16
que yo no he hecho
00:35:18
porque los he heredado con toString
00:35:20
por ejemplo hay un método que hemos usado
00:35:22
con la clase string sin entenderlo
00:35:24
en realidad
00:35:26
que es el método equals
00:35:28
vale
00:35:30
el método equals
00:35:32
es un método
00:35:36
que hasta ahora lo hemos
00:35:38
usado asociado
00:35:40
a un objeto string
00:35:42
y pasándole como parámetro otro
00:35:44
objeto string
00:35:46
pero eso no significa que solamente
00:35:48
los objetos
00:35:50
string puedan llamar a equals
00:35:52
a equals lo puede llamar cualquier objeto
00:35:54
del mundo cualquiera
00:35:56
y porque lo puede llamar cualquier objeto del mundo
00:35:58
pues porque
00:36:00
equals está en la clase object
00:36:02
es este
00:36:04
está en la clase object
00:36:06
vale
00:36:08
y el método equals de la clase object
00:36:10
te dice tu pasame
00:36:12
cualquier cosa que sea un object
00:36:14
y de nuevo
00:36:16
ya sabemos que en una referencia
00:36:18
caben objetos de esa clase
00:36:20
y de todas las herederas
00:36:22
entonces como todas las clases que uno dejaba
00:36:24
todas cualquiera todas van a heredar de object
00:36:26
en última instancia todas
00:36:28
pues a equals se le puede pasar
00:36:30
cualquier tipo de objeto cualquiera
00:36:32
a equals se le puede pasar cualquier objeto
00:36:34
cualquiera
00:36:36
vale y que devuelve el método
00:36:38
equals de object
00:36:40
un boolean
00:36:42
vale un boolean
00:36:44
entonces y que hace este método
00:36:46
equals en object que hace este método
00:36:48
equals te devuelve true
00:36:50
si la dirección
00:36:52
de memoria de este objeto
00:36:54
es la misma dirección de memoria
00:36:56
del objeto que llame al método
00:36:58
eso es lo que te devuelve
00:37:00
el equals de object
00:37:02
nos interesa esa versión de equals
00:37:04
nos interesa esa versión de equals
00:37:06
puede que nos interese
00:37:08
puede que no normalmente no
00:37:10
porque no tiene mucho sentido
00:37:12
realista y práctico
00:37:14
vamos a verlo
00:37:16
a ver entendemos que al haber aquí un doble igual
00:37:18
esto significa el contenido
00:37:20
de este variable objeto
00:37:22
y el contenido del variable objeto
00:37:24
es la dirección de memoria eso lo tenemos clarísimo
00:37:26
y esto significa el contenido
00:37:28
de esta variable no a lo que apunta
00:37:30
el contenido es su dirección
00:37:32
entonces el método equals
00:37:34
de object va a devolver true
00:37:36
si las dos direcciones de memoria
00:37:38
del que llama equals
00:37:40
y el pasado son la misma idéntica
00:37:42
y va a devolver el false si no
00:37:44
vale
00:37:46
lo tenemos claro que eso es lo que hace
00:37:48
el método equals tal cual
00:37:50
bueno pues entonces
00:37:52
con eso si yo llamo
00:37:54
equals
00:37:56
si yo llamo al método equals
00:38:02
de object lo llama el objeto c1
00:38:12
y le paso como parámetro
00:38:14
c2
00:38:16
que va a hacer el if o el else
00:38:18
el if o el else
00:38:22
el else porque c1 es un objeto
00:38:24
apuntado por su dirección de memoria
00:38:26
y c2 es otro
00:38:28
eso está claro ¿no?
00:38:30
vale
00:38:32
si yo tengo aquí
00:38:38
c1 pues nada
00:38:44
c1
00:38:46
es
00:38:48
c1 es en realidad
00:38:52
la dirección de memoria
00:38:54
de un espacio
00:38:56
en memoria
00:38:58
para contener ya las propiedades de código
00:39:00
vale y c2 que es
00:39:02
c2 es
00:39:08
otra dirección de memoria
00:39:16
otra distinta
00:39:18
que está ahí para contener las propiedades
00:39:22
de otro objeto
00:39:24
esto es lo que tenemos
00:39:26
luego c1 no es igual a c2
00:39:28
está claro c1 es una dirección de memoria
00:39:30
una dirección que lleva aquí
00:39:32
y c2 es una dirección que lleva aquí
00:39:34
c1 es igual a c2
00:39:36
vale
00:39:38
pues vamos a comprobarlo
00:39:40
entonces si ejecutamos esto
00:39:42
pues me dice que distintos
00:39:48
vale
00:39:50
vale y nosotros podríamos tirar
00:39:52
con ese sentido de equals
00:39:54
pero ese sentido de equals
00:39:56
no es el sentido real
00:39:58
en una aplicación
00:40:00
en una aplicación
00:40:02
para que las cosas tengan sentido
00:40:04
el criterio de igualdad no es ese
00:40:06
el criterio de igualdad siempre es
00:40:08
que las claves primarias sean la misma
00:40:10
por ejemplo si yo tengo dos personas
00:40:12
y las dos tienen el mismo nif
00:40:14
para mi aplicación
00:40:16
tienen que ser iguales
00:40:18
porque si no pierde el sentido la aplicación
00:40:20
no
00:40:22
si tengo
00:40:24
osea cada entidad
00:40:26
tendrá su código primario su clave principal
00:40:28
si estoy trabajando con clientes
00:40:30
cada cliente tiene un código
00:40:32
o con pedidos y cada pedido tiene un código
00:40:34
o con facturas que ahí se ve más claro
00:40:36
cada factura tiene un número de factura
00:40:38
entonces si mi aplicación ve
00:40:40
dos facturas que tienen
00:40:42
el mismo número de factura
00:40:44
a todos los efectos
00:40:46
para la aplicación tienen que ser la misma
00:40:48
porque si no pierde su sentido
00:40:50
entonces para que las aplicaciones sean coherentes
00:40:52
objetos
00:40:54
que tienen la misma clave primaria
00:40:56
que tienen el mismo identificador único
00:40:58
tienen que ser el mismo
00:41:00
tienen que ser el mismo
00:41:02
lo que pasa es que a lo mejor han aparecido duplicados
00:41:04
o lo que sea
00:41:06
pero los efectos de trabajo tienen que ser considerados
00:41:08
como el mismo y como iguales
00:41:10
luego el criterio de igualdad real
00:41:12
que es el que tiene que reproducir la aplicación
00:41:14
el real
00:41:16
no es este
00:41:18
no es que estén en posiciones de memoria distintas
00:41:20
ese no es el criterio de igualdad real
00:41:22
y operativo
00:41:24
el criterio de igualdad
00:41:26
tiene que ser
00:41:28
el mismo
00:41:30
entonces a lo mejor físicamente en memoria
00:41:32
tengo ahí esas dos referencias
00:41:34
porque las he generado dos veces
00:41:36
pero son la misma cosa
00:41:38
y las tengo que tratar igual
00:41:40
entonces el ver que son iguales
00:41:42
me permitiría a lo mejor olvidarme de uno
00:41:44
y empezar a trabajar con el otro
00:41:46
entonces el criterio de igualdad real en la vida
00:41:48
y por tanto en la aplicación
00:41:50
es que lo que identifica de forma única
00:41:52
a dos objetos
00:41:54
es igual, es el mismo, es el criterio real
00:41:56
este no tiene ninguna utilidad
00:41:58
bueno pues entonces
00:42:00
que es lo que tenemos que hacer
00:42:02
sobre escribir el equals
00:42:04
en nuestras clases para decir
00:42:06
oye si hay otro objeto
00:42:08
con este mismo código
00:42:10
o con este mismo nif
00:42:12
o con este mismo lo que sea
00:42:14
entonces es el mismo
00:42:16
aunque este alojado en posiciones de memoria distintas
00:42:18
ese es el uso
00:42:20
que tendría sentido
00:42:22
entonces
00:42:24
de hecho
00:42:26
el eclipse te ofrece
00:42:28
la posibilidad de sobre escribir el método equals
00:42:30
sobre escribirlo
00:42:32
pero vamos no hace falta que usemos el eclipse
00:42:34
para todo
00:42:36
podríamos sobre escribirlo nosotros
00:42:38
y hacer esto
00:42:40
lo voy a sobre escribir
00:42:42
en cuidador
00:42:44
voy a asegurarme
00:42:46
de que he puesto bien la
00:42:48
el este
00:42:50
poniendo el override
00:42:52
bueno vamos a hacerlo primero
00:42:54
porque si no me va a aparecer en rojo todo el rato
00:42:56
vale pues aquí uno ya tiene que decidir
00:42:58
acorde al sentido de su aplicación
00:43:00
recordad que una aplicación tiene que reproducir
00:43:02
lo que está pasando
00:43:04
tiene que pensar a ver para mi
00:43:06
que va a hacer que un cuidador sea igual a otro
00:43:08
que sean el mismo
00:43:10
que va a hacer que sean el mismo
00:43:12
pues miraría uno su modelo su descripción
00:43:14
y según el modelo de datos
00:43:20
el análisis que ha hecho todo lo que ha estudiado
00:43:22
diría hombre
00:43:24
pues dos cuidadores con el mismo código son el mismo
00:43:26
mi aplicación tiene que tratar
00:43:28
igual tiene que considerar que son lo mismo
00:43:30
que son el mismo
00:43:32
dos cuidadores con el mismo código
00:43:34
mi modelo de datos mi realidad no concibe
00:43:36
que en misológico haya dos cuidadores con código
00:43:38
distinto no lo concibe
00:43:40
los cuidadores
00:43:42
distintos códigos distintos
00:43:44
pues entonces tendría sentido
00:43:46
hacer un equals que te devuelva true
00:43:48
si los códigos del que llama el método
00:43:50
y el parámetro son iguales
00:43:52
y false en caso contrario
00:43:54
recordad que todo lo que programamos
00:43:56
todo lo que declaramos en las clases todo lo que hacemos
00:43:58
tiene que reproducir
00:44:00
la situación real
00:44:02
tiene que estar al servicio
00:44:04
de esa situación
00:44:06
bueno pues aquí podríamos hacer nuestro object
00:44:08
que fuera venga vamos a ver
00:44:10
vamos a hacerlo largo o sea escrito en varias
00:44:12
líneas para no liarnos
00:44:14
pues vamos a hacer un
00:44:16
bueno no que igual así os es más claro
00:44:20
pues venga vamos a hacer si
00:44:22
si
00:44:24
la propiedad código del
00:44:26
objeto que llame al equals
00:44:28
que es un entero con lo cual lo puedo
00:44:30
es igual
00:44:32
que la propiedad código del objeto
00:44:34
que le paso por parámetro
00:44:36
vale aquí nos viene de nuevo
00:44:40
objeto
00:44:42
está declarado como object
00:44:44
no tiene
00:44:46
una propiedad código verdad no la tiene
00:44:48
el compilador no me va a
00:44:50
decir dejar poner aquí
00:44:52
objeto punto código
00:44:54
porque yo querría
00:44:56
poner esto si los códigos
00:44:58
son iguales entonces
00:45:00
return true
00:45:02
else
00:45:04
return
00:45:06
false este sería la
00:45:08
idea de mi equals verdad sería esta
00:45:10
esta sería la idea de mi equals
00:45:14
si los códigos del que llama el método
00:45:16
y el pasado por parámetros son iguales
00:45:18
los códigos devuelve true
00:45:20
para indicar que esos objetos son el mismo
00:45:22
si no devuelve false
00:45:26
pero bueno no podemos ponerlo así no
00:45:28
por el mismo problema que nos surgió ayer
00:45:30
etcétera etcétera
00:45:32
porque obj está declarado como la clase
00:45:34
genérica object
00:45:36
por tanto el compilador no ve en esa clase
00:45:38
genérica code
00:45:40
que solución podemos poner
00:45:42
para eso
00:45:44
hacer un
00:45:48
hacer un casting efectivamente yo sé que lo que
00:45:50
le voy a pasar es un objeto cuidador
00:45:52
sé que le voy a pasar un cuidador pero voy a
00:45:54
comparar un cuidador con otro
00:45:56
tranquilidad
00:45:58
te haces un casting
00:46:00
de este
00:46:04
objeto de aquí
00:46:06
te haces un casting a cuidador
00:46:08
y listo
00:46:10
ala
00:46:12
ya tenemos un equals ya con sentido real
00:46:14
con sentido práctico
00:46:16
si además somos ya
00:46:18
perfectos
00:46:20
vamos a
00:46:22
anotarlo con overwrite
00:46:24
para asegurar
00:46:26
de que hemos escrito
00:46:28
bien la cabecera no vaya a ser que estemos
00:46:30
haciendo otro método que no es el equals
00:46:32
estándar que se usa
00:46:34
siempre sino otro añadido que nos hemos
00:46:36
inventado porque se nos ha olvidado
00:46:38
porque hemos puesto dos s en vez de una
00:46:40
si encima nos acordamos de poner el overwrite
00:46:42
estupendo
00:46:44
así sabemos que estamos sobre escribiendo
00:46:46
el de object
00:46:48
porque pueden venir otras clases por ahí
00:46:50
que quieran hacer igualdades entre cuidadores
00:46:52
y van a llamar al equals de
00:46:54
en su nombre real
00:46:56
van a llamar al equals de su nombre real
00:46:58
entonces vamos a sobre escribirlo
00:47:00
con su nombre real
00:47:02
vale pues entonces con el
00:47:06
equals sobre escrito
00:47:08
ahora ya si que nos pasaría
00:47:10
vamos a por ejemplo
00:47:12
vamos a
00:47:14
cambiar esto
00:47:16
y ya ejecutamos esto
00:47:18
y ya si que paramos
00:47:20
voy a quitar para que lo veamos
00:47:22
primero nuestra sobre escritura
00:47:24
de esta de aquí
00:47:26
entonces resulta que mi aplicación
00:47:28
tiene
00:47:30
dos cuidadores
00:47:32
ha introducido
00:47:34
donde estamos el main
00:47:36
ha introducido cuidadores
00:47:38
y
00:47:40
se le da a lo mejor
00:47:42
esta situación
00:47:44
pues que en una parte
00:47:46
un gestor lo introdujo
00:47:48
con el nombre de luis y el otro
00:47:50
le puso el nombre completo luis maria
00:47:52
pero en realidad son el mismo
00:47:54
son el mismo cuidador
00:47:56
y cuando hay que subir el sueldo
00:47:58
hay que subírselo a ese único
00:48:00
no hay dos cuidadores
00:48:02
hay uno que tiene su código uno
00:48:04
lo que pasa es que en la aplicación
00:48:06
por la razón que sea
00:48:08
pueden haberse instanciado dos objetos distintos
00:48:10
pero son el mismo cuidador
00:48:12
y a efectos del resto de funcionalidades
00:48:14
pues hay que trabajar con el único cuidador
00:48:16
que haya
00:48:18
entonces sin haber sobre escrito
00:48:20
el método equals
00:48:22
ejecutando esto
00:48:24
nos va a decir distintos ¿verdad?
00:48:26
nos va a decir distintos
00:48:28
y esto no tiene sentido
00:48:30
no tiene sentido
00:48:32
en el contexto de nuestra aplicación
00:48:34
no lo tiene
00:48:36
pero una vez que hayamos sobre escrito
00:48:38
el equals
00:48:40
según el sentido de nuestra aplicación
00:48:42
y el sentido es que
00:48:44
códigos iguales, cuidadores iguales
00:48:46
que todo esto viene
00:48:48
de haber hecho un buen análisis
00:48:50
claro, de ahí la importancia de los análisis
00:48:52
de entender la situación
00:48:54
de entender la aplicación
00:48:56
si hemos hecho un buen análisis
00:48:58
hemos llegado a la conclusión
00:49:00
es que en mi aplicación
00:49:02
los cuidadores tienen que tener códigos distintos
00:49:04
pues si yo después de haber hecho ese buen análisis
00:49:06
he llegado a que esa conclusión es así
00:49:08
pues entonces habré sobre escrito un equals así
00:49:10
y ahora ya cuando ejecutemos este main
00:49:12
pues lógicamente
00:49:14
ahora ya me va a decir que son iguales
00:49:16
me va a decir que los cuidadores son el mismo
00:49:20
y lo son
00:49:22
que son dos objetos distintos
00:49:24
con dos objetos distintos
00:49:26
me refiero
00:49:28
está este y está este otro
00:49:30
apuntado por ediciones distintas
00:49:32
pues sí, porque eventualmente la aplicación ha generado dos instancias
00:49:34
pero lo que importa
00:49:36
es el funcionamiento de la aplicación
00:49:38
¿vale?
00:49:40
y para que ese funcionamiento sea coherente
00:49:42
y consistente
00:49:44
pues hombre, tengo yo que incluir los criterios de igualdad
00:49:46
para poder usarlos cuando hagan falta
00:49:48
tengo que incluirlos
00:49:50
y aquí efectivamente estos dos cuidadores
00:49:52
pues según mi criterio de igualdad
00:49:54
son el mismo
00:49:56
y sobre escribir este método
00:50:00
es de vital importancia
00:50:02
para que luego todas las colecciones
00:50:04
todas las clases que nos van a usar
00:50:06
funcionen bien y tengan sentido lo que hacen
00:50:08
porque si no van a hacer cosas
00:50:10
sin errores
00:50:12
pero no van a tener sentido
00:50:14
¿vale?
00:50:16
bueno, ahora sí que vamos a parar aquí un momentito
00:50:18
se hace muy largo esto
00:50:20
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 8
- Fecha:
- 8 de febrero de 2024 - 12:44
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 50′ 22″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 209.25 MBytes