20260116 Herencia_Object - 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:
Vale, a ver, entonces, con lo que hemos visto de herencia hasta ahora, ya sabemos que las clases Java de una aplicación
00:00:00
pueden relacionarse con relaciones de herencia construyendo una jerarquía, ¿vale?
00:00:07
La idea no es que en los diseños aparezcan jerarquías complejas, porque ya se pierde un poquito la perspectiva del asunto,
00:00:16
pero sí que haya relaciones de herencia entre clases puntualmente, sí que facilita bastante las cosas.
00:00:24
En cualquier caso, como la herencia en Java como tal es simple, es lo que se llama herencia simple,
00:00:32
¿y qué significa simple? Que cada clase sólo puede heredar de otra, sólo, o sea, esto no existe, esto no se puede dar,
00:00:38
cada clase sólo puede heredar de otra, pues la estructura que tenemos siempre son árboles de este tipo.
00:00:46
Vale, y de hecho tanto es así que si yo tengo una clase cualquiera, una clase cualquiera, si no pongo que herede, por ejemplo, imaginaos que tenéis una aplicación con tres clases que no están relacionadas entre sí, esta es una clase C1, clase C2, clase C3, cliente, producto, pedido, no tienen relaciones de herencia entre sí, ¿vale?
00:00:54
Bueno, pues las clases que no tienen ninguna superclase, que no tienen ninguna, Java supone que por defecto heredan de otra clase que existe, que ahora la abriremos y la veremos, que ya existe, que está hecha, que se llama Objeto.
00:01:18
Entonces, todas las clases
00:01:41
Si no heredan de ninguna
00:01:45
Es decir, si aquí no hay un
00:01:47
Extents de lo que sea
00:01:48
Si no heredan de ninguna, heredan por defecto
00:01:50
De esta clase
00:01:53
Que ya existe, es una clase pequeñita
00:01:54
Que en realidad tiene muy poca cosa dentro
00:01:57
Pero si yo tengo
00:01:58
Estas tres clases en mi aplicación
00:02:00
Las tres
00:02:02
Heredan de object sí o sí
00:02:04
Y luego otra cosa es que además haga más clases
00:02:06
Que hereden de estas
00:02:09
Bueno, pues si las he hecho
00:02:10
ya tengo el arbolito
00:02:13
ya tengo el árbol
00:02:17
siempre, siempre hay un
00:02:18
nodo único raíz de todo
00:02:21
siempre, que es la clase
00:02:23
object, siempre es el nodo
00:02:26
único raíz de cualquier
00:02:27
estructura de clases y todas
00:02:29
aquellas que no tengan un extens
00:02:31
específico, todas las que no lo tengan
00:02:33
heredan de object
00:02:36
entonces object es una clase que se puede
00:02:36
instanciar, lo que pasa es que tiene muy
00:02:40
poco dentro
00:02:41
uno puede hacer un new object
00:02:42
e instanciar
00:02:45
una clase object
00:02:49
esto se puede hacer
00:02:50
entonces estamos instanciando un objeto
00:02:53
de esta clase que ya existe en Java
00:02:55
que está en toda la librería
00:02:56
que nos ofrece la JRE
00:02:59
pero que tipo de objeto es este
00:03:00
es un objeto muy básico
00:03:02
que no tiene espacio
00:03:04
para nada dentro en realidad
00:03:06
pero representa la idea de objeto
00:03:08
esa idea la representa
00:03:10
porque es una referencia
00:03:12
o es una referencia
00:03:14
que me apuntaría a un espacio en memoria
00:03:16
entonces bueno
00:03:18
le da cierta semántica
00:03:20
cierto significado a todo esto
00:03:21
porque cualquier cosa
00:03:23
al heredar de object es como decir
00:03:24
cualquier cosa es un objeto en realidad
00:03:27
¿vale?
00:03:29
entonces ¿de qué nos sirve?
00:03:32
además ¿de qué nos sirve?
00:03:33
que todas las clases hereden de object
00:03:35
bueno porque object
00:03:38
nos ofrece unos métodos
00:03:40
Que ahora los veremos
00:03:41
Que nosotros ya podríamos usarlos tal cual
00:03:43
Si queremos
00:03:45
Es decir, cuando nosotros hacemos una clase nuestra
00:03:46
Clase 1
00:03:49
Sin más
00:03:52
Una clase normal, sin ningún extensa aquí
00:03:53
Sin ninguno
00:03:55
En realidad esta clase ya tiene muchas cosas
00:03:56
Aunque aquí esté vacío, aunque aquí no haya nada
00:03:59
Ya tiene muchas cosas
00:04:01
Porque esto
00:04:03
Implícitamente
00:04:05
Hereda de object
00:04:06
Aunque no esté puesto
00:04:09
implícitamente hereda, aunque no esté puesto
00:04:10
entonces una clase que hagamos
00:04:13
con llavecitas y sin más
00:04:14
ya tiene cosas dentro
00:04:17
aunque nosotros no lo veamos
00:04:18
¿y qué tiene dentro? lo que tiene object
00:04:20
que son algunos métodos
00:04:22
de los cuales el que nos puede sonar ahora
00:04:24
y que más nos importa
00:04:26
es el método toString
00:04:28
ahora lo vemos
00:04:30
entonces
00:04:34
todos los objetos
00:04:36
pueden llamar a toString, aunque no lo hayamos puesto
00:04:38
aquí, ¿por qué?
00:04:41
Porque lo han heredado de object.
00:04:42
Lo que pasa es que la versión del toString heredado
00:04:45
es una versión que te pone nada.
00:04:48
Una cosa muy fea.
00:04:50
Por eso lo que solemos hacer es sobrescribirlo.
00:04:51
El heredado.
00:04:54
¿Vale?
00:04:55
Y como toString algún método más.
00:04:56
Entonces, si lo...
00:05:00
Vemos aquí.
00:05:03
Ahora.
00:05:07
Por ejemplo,
00:05:10
En nuestra clase está
00:05:21
A ver
00:05:23
Voy a abrir herencia ejemplos
00:05:25
Por ejemplo
00:05:28
Teníamos aquí el cliente normal
00:05:29
Cliente yo no he puesto
00:05:31
Que herede de nadie
00:05:35
Entonces no ponerlo
00:05:36
Es equivalente a todos los efectos
00:05:39
Equivalente
00:05:42
A poner esto
00:05:42
¿Vale?
00:05:45
Es decir, cualquier cosa
00:05:49
Hereda de object
00:05:51
Si es que no hereda de ninguna otra
00:05:52
que a su vez heredará de object
00:05:55
si es que no le da ninguna otra
00:05:56
entonces esto está siempre por defecto
00:05:58
no tenemos que ponerlo
00:06:01
está siempre por defecto
00:06:02
entonces al heredar de object
00:06:04
ya esta clase se llena
00:06:05
de las cosas que tiene object
00:06:07
además de las que le hagamos específicamente
00:06:09
¿y qué cosas tiene object?
00:06:12
vamos a buscar esta clase
00:06:14
porque nosotros cuando
00:06:15
hacemos un proyecto
00:06:18
aparte de las clases nuestras
00:06:20
ya hay un montón más de clases hechas
00:06:23
que podemos usar
00:06:25
que son las que están aquí
00:06:26
¿veis? o sea este es mi proyecto
00:06:28
mi proyecto de aquí
00:06:33
el de herencia ejemplos, vale
00:06:36
mi proyecto tendrá
00:06:38
las clases
00:06:40
que yo he hecho
00:06:42
que son estas, estas tres porque las he hecho yo
00:06:43
pero es que además de estas clases
00:06:47
tiene todas las que están
00:06:49
en estos hard
00:06:51
de aquí
00:06:52
En estos paquetes
00:06:54
¿Vale? Esto es como si se hiciera
00:06:58
Un agregar
00:07:01
JAR externo
00:07:03
Como lo hicimos nosotros para la clase teclado
00:07:04
Pues en realidad cuando se crea un proyecto
00:07:06
Es como si se agregaran tropecientos mil
00:07:09
JAR externos
00:07:11
Que están aquí en la máquina virtual
00:07:12
Que están aquí
00:07:14
En la JRE
00:07:15
¿Vale? Es decir, cuando uno tiene
00:07:17
Instalado en su ordenador
00:07:20
La máquina virtual de Java
00:07:22
No hablo del JDK
00:07:24
con el que tú desarrollas, escribes código
00:07:26
y compilas, no hablo de eso
00:07:28
ni de Eclipse, cuando tú tienes
00:07:30
la máquina virtual de Java
00:07:32
que es la que es capaz de ejecutar
00:07:34
código Java, la máquina virtual de Java
00:07:36
además del propio
00:07:38
proceso que se lanza
00:07:40
para ejecutar el código Java, además de eso
00:07:42
tienes un montón de clases
00:07:44
que cualquier aplicación necesita
00:07:46
y que por tanto no las hacemos
00:07:48
nosotros, vale
00:07:50
como la clase System.out que es una clase
00:07:52
que llama al método println
00:07:54
la clase scanner
00:07:56
que cualquier la necesita
00:07:57
o sea, estamos usando
00:07:59
en cualquier aplicación nuestra
00:08:00
usamos un montón de clases
00:08:02
que no hemos hecho
00:08:04
nosotros y todo el mundo
00:08:05
¿vale?
00:08:06
como ejemplo, repito
00:08:08
veamos, scanner
00:08:09
entonces
00:08:10
cuando yo doy mi aplicación
00:08:11
a cualquiera
00:08:13
ese cualquiera lo ejecuta
00:08:14
en su máquina virtual
00:08:16
y le funciona
00:08:17
¿por qué?
00:08:18
porque la máquina virtual
00:08:19
entrega esas clases
00:08:20
que mi aplicación usa
00:08:22
que son comunes
00:08:24
para todo el mundo
00:08:25
Bueno, pues esas clases están aquí
00:08:25
¿Vale? Esas clases
00:08:28
Están aquí, no las he hecho yo
00:08:30
Están aquí metidas en mi ordenador
00:08:32
Y el Eclipse las agrega
00:08:34
Como Hards exactamente
00:08:36
Igual que nosotros agregamos nuestro Hard
00:08:38
Teclado cuando hicimos la prueba
00:08:40
Pues cuando hacemos un proyecto Eclipse
00:08:41
Él automáticamente
00:08:44
Agrega todos estos
00:08:46
Hards que tienen todos estos paquetes
00:08:48
¿Veis? Esto es un Hard
00:08:50
Este botecito de aquí es un Hard
00:08:51
Que tiene todos esos paquetes dentro
00:08:54
Y así tengo para aburrir
00:08:55
Tengo la leche
00:08:58
¿Vale?
00:08:59
Todo esto de aquí
00:09:03
Que cuelga de
00:09:04
Aquí, todos son hard
00:09:08
Todo, todo, que están en mi
00:09:10
Ordenador, y dentro de esos
00:09:12
Hard tengo clases, que son las
00:09:14
Que se supone que usamos todos
00:09:16
Básicas para programar
00:09:17
Que no las tenemos que hacer
00:09:19
Porque ya las da la máquina virtual
00:09:21
¿Vale?
00:09:23
Bueno, pues en todos estos hard
00:09:24
Que dentro tienen un montón de paquetes con clases
00:09:26
Repito, tenemos escáner, tenemos de todo
00:09:28
Entre ellas tenemos la clase
00:09:31
Object, ¿vale?
00:09:33
Por ejemplo, la clase object si la buscamos
00:09:34
A mano, la clase object
00:09:36
Estará
00:09:38
En java lang casi seguro
00:09:40
Aquí, object, ¿vale?
00:09:43
O sea, esta es la clase object
00:09:50
De la que hereda cualquier
00:09:51
Clase que yo no le ponga específicamente
00:09:53
Una super clase
00:09:56
Y ahora esta clase si la abrimos para ver qué es lo que entrega el resto del mundo, pues entrega muy poca cosa, ¿vale?
00:09:56
Entrega un constructor sin parámetros que nos hereda, pero que podemos utilizar nosotros con super sin parámetros, que en realidad explícitamente se asume que se pone, aunque no lo pongamos nosotros.
00:10:06
entrega este método
00:10:20
que ahora mismo nos sería relativamente complicado
00:10:23
entender, en segundo lo entenderemos
00:10:25
¿vale? porque implica
00:10:27
genéricos y demás rollos
00:10:29
entrega este
00:10:30
que este sí que vamos a
00:10:33
explicar por qué es interesante
00:10:35
que esté aquí, porque está relacionado
00:10:37
con los códigos de hash de las
00:10:39
estructuras
00:10:41
el hash set, que es así que las tenemos que ver
00:10:42
claro
00:10:45
¿Qué más métodos entrega?
00:10:45
Lo que es native
00:10:51
¿Eh?
00:10:51
Nativo
00:10:53
Que tira del software de tu equipo
00:10:53
Para generar el código hash
00:10:59
El código nativo en general
00:11:01
Es código que necesita ejecutar
00:11:02
Código máquina de tu sistema operativo
00:11:05
¿Vale?
00:11:08
Que no es independiente de tu sistema operativo
00:11:08
Sería el nativo
00:11:10
El que trae tu sistema operativo
00:11:12
Entonces
00:11:13
Eso significa que tiene que hacer una llamada
00:11:13
a tu sistema operativo
00:11:15
para ejecutar código propio de tu equipo
00:11:17
en este caso para generar ese
00:11:19
hash, ese código de hash
00:11:21
el código
00:11:23
no nativo es el código que está
00:11:26
hecho en un lenguaje de programación que es independiente
00:11:27
de la máquina, que no tiene que llamar a
00:11:29
funciones propias de la máquina
00:11:31
más o menos
00:11:33
¿Para hacer un método de pillar
00:11:34
MIT o así?
00:11:37
¿Utilizaría el MIT?
00:11:38
Si hiciera un método
00:11:41
A ver, es la idea
00:11:42
En este ejemplo que me pones exactamente
00:11:45
No creo, porque lo harías
00:11:47
A través de otra cosa, de un socket
00:11:49
Pero bueno, más o menos es la idea
00:11:51
Quédate con que código nativo
00:11:53
Es lo que está hecho
00:11:55
Específicamente para tu máquina
00:11:57
Y el no nativo
00:11:59
Quédate más o menos con esa idea
00:12:01
Vale
00:12:02
Entonces
00:12:04
¿Qué ofrece?
00:12:06
Bueno, el equals
00:12:09
vamos a clonar
00:12:10
no nos interesa por ahora, estábamos buscando
00:12:15
el toString, este
00:12:18
¿qué ofrece? ofrece un método
00:12:19
toString, eso es lo que
00:12:22
ofrece object, ofrece
00:12:24
un método toString, pero
00:12:26
el método toString lo que te devuelve
00:12:27
es un
00:12:29
getClaseName que os digo ahora
00:12:31
porque este método no lo podemos entender todavía
00:12:34
que te da el nombre de la clase
00:12:35
una arroba y luego
00:12:37
después de la arroba te ofrece
00:12:39
un numerito entero
00:12:42
sacado del código hash
00:12:43
o sea un toString que en realidad
00:12:46
no te da ninguna información sobre el objeto
00:12:48
no te dice nada interesante este toString
00:12:49
entonces yo podría
00:12:52
utilizar este toString directamente
00:12:54
desde cliente si es que no tengo uno específico
00:12:56
aquí por ejemplo en cliente
00:12:58
no tengo ningún
00:13:00
toString, pero yo puedo usar
00:13:02
la llamada toString si me da la gana
00:13:04
porque la ha heredado de object
00:13:06
entonces vamos a hacernos un
00:13:07
main aparte solamente para
00:13:09
pruebas con esta cosita
00:13:12
de object
00:13:14
porque otras clases lo van a necesitar
00:13:14
entonces
00:13:22
alguna versión tiene que tener, ahora volvemos con eso
00:13:22
vale, entonces
00:13:25
me voy a hacer aquí un main2
00:13:27
cualquiera
00:13:32
entonces yo me voy a instanciar aquí
00:13:32
un objeto cliente
00:13:35
un objeto cliente c
00:13:36
igual a new
00:13:42
cliente, vale
00:13:44
Como está en otro paquete, pues tengo que hacer el import
00:13:47
O poner el nombre completo
00:13:49
A elección
00:13:51
Vale, ahora
00:13:53
Cliente, tal y como yo lo he hecho
00:13:54
Este stents como
00:13:57
Lo quito porque que esté y que no esté
00:13:58
Es lo mismo
00:14:01
Esta clase cliente no tiene
00:14:01
Ningún método toString, no lo tiene
00:14:05
Yo no se lo he hecho, no lo tiene
00:14:07
Pero como lo hereda de object
00:14:08
Que object sí que lo tiene
00:14:11
Pues lógicamente c
00:14:12
Puede llamar a toString
00:14:15
Y no pasa nada
00:14:16
Voy a mostrar
00:14:18
Aquí el resultado de tu string
00:14:21
Lo hago en una línea separada
00:14:23
Para que se vea más claro
00:14:25
Y ahora puedo mostrar aquí
00:14:26
Vale, entonces, ¿por qué me hayan dejado
00:14:28
Llamar a un método tu string
00:14:35
Si cliente, cliente
00:14:36
No tiene ese método?
00:14:38
Porque cliente hereda de object
00:14:40
Y object lo tiene
00:14:42
Pero claro, object tiene una versión de tu string
00:14:44
Que
00:14:46
Que lógicamente
00:14:48
No sabe nada del objeto
00:14:50
Tiene una versión de toString muy random
00:14:52
Y además random nunca mejor dicho
00:14:54
Porque el hashCode
00:14:57
Utiliza una semilla aleatoria además
00:14:58
Así que
00:15:01
Entonces si yo ejecuto este main2
00:15:02
Pues me saca esto
00:15:04
Que esto es la salida
00:15:15
Del toString de object
00:15:17
El nombre de la clase
00:15:18
Una arrobita y un número random
00:15:20
Porque eso es lo que tiene el toString de object
00:15:23
el nombre de la clase
00:15:25
una arrobita
00:15:27
y un número aquí random
00:15:28
pues esto es lo que me saca
00:15:30
claro, nosotros
00:15:33
nos gusta este toString
00:15:35
pues no nos gusta, entonces por eso
00:15:36
lo que solemos hacer es
00:15:39
sobreescribirlo en la clase cliente
00:15:40
entonces
00:15:43
nosotros podemos hacer toString
00:15:45
que además este por ser un método
00:15:46
importante nos lo hacía solo el Eclipse
00:15:49
si queremos
00:15:51
y ala, ya tengo el toString
00:15:52
sobrescrito. Y como veis
00:15:57
el Eclipse, como le gusta que
00:16:00
programemos bien, me ha
00:16:02
metido la anotación overwrite
00:16:04
para
00:16:05
permitirme validar que eso es un
00:16:07
método sobrescrito. ¿Qué es
00:16:10
obligatoria la anotación? No es obligatoria
00:16:11
la anotación. La anotación me
00:16:14
vale como aviso de que es un
00:16:16
método sobrescrito de la superclase.
00:16:18
No es obligatoria.
00:16:20
Pero es muy buena práctica
00:16:22
por lo que dijimos el miércoles.
00:16:23
Esto no.
00:16:26
mantener la
00:16:27
anotación
00:16:30
porque así
00:16:32
si yo me equivoco y se me va aquí el dedo
00:16:34
y se me va el dedo
00:16:36
ahí y me equivoco
00:16:38
el que exista la anotación
00:16:39
hace que el compilador diga
00:16:41
cuidado que este método es imposible
00:16:43
que sea sobrescrito porque no existe
00:16:46
arriba, no existe
00:16:48
si yo no tuviera puesta la anotación
00:16:49
traga con todo
00:16:52
ah, que haces un método tu string, jijir
00:16:56
vale, pues toString jiji
00:16:58
pero no queremos hacer un método
00:16:59
toString jiji, sino que queremos sobreescribir
00:17:02
el de arriba
00:17:04
entonces, por eso, si nuestra intención
00:17:04
es sobreescribir
00:17:08
mantengamos la anotación
00:17:09
si nuestra intención es sobreescribir
00:17:11
vale, entonces ahora
00:17:13
respondiendo a tu pregunta
00:17:16
¿y por qué
00:17:20
object te ofrece ya un toString?
00:17:22
¿qué sentido tiene que te ofrezca un toString?
00:17:24
si lo que te ofrece es un código
00:17:26
tan feo que tú lo vas a
00:17:29
tener que sobreescribir
00:17:31
bueno, porque
00:17:32
el método toString es un método
00:17:35
que llaman muchísimas clases
00:17:37
de Java para hacer cosas
00:17:39
por ejemplo, la clase System.out
00:17:43
la clase System.out
00:17:45
cuando le pasamos un objeto
00:17:48
si yo le paso c
00:17:50
yo le paso un objeto
00:17:52
pues este es un ejemplo
00:17:53
en el cual System.out
00:17:56
¿qué hace?
00:17:58
si entráramos en el código de System.out
00:17:59
que este es el método estático
00:18:01
println de la clase System.out
00:18:03
ahora ya podemos entender esto
00:18:06
es la llamada al método println de esta clase
00:18:07
que tiene este nombre raro porque es especial
00:18:10
pero bueno
00:18:11
entonces, si entramos en el código de este método
00:18:12
veremos que lo que hace es
00:18:15
coge esto que hay aquí
00:18:16
si es una variable primitiva la muestra tal cual
00:18:18
si es una variable objeto
00:18:21
llama a tu string
00:18:23
entonces, hombre
00:18:24
vamos a meter un mecanismo
00:18:26
para asegurarnos de que todo el mundo
00:18:29
del mundo mundial
00:18:31
haga la clase que haga, la va a hacer con un
00:18:32
tuestrin, vamos a asegurarnos
00:18:35
porque el tuestrin lo va a llamar
00:18:37
mucha gente, entonces es una
00:18:39
herramienta, es una
00:18:40
forma de asegurarnos de que todo
00:18:42
el mundo va a incluir el tuestrin en sus clases
00:18:45
pues la forma de asegurarnos
00:18:47
de que todo el mundo va a incluir un tuestrin en sus clases
00:18:49
aunque tú no lo pongas
00:18:51
es ponerlo en object y decir, a mí me da igual
00:18:52
cómo programe la gente, sé que cualquier objeto
00:18:55
del mundo, cualquiera va a tener
00:18:57
tu stream. Otra cosa es que lo tenga
00:18:59
con código feo, pero lo va a tener.
00:19:01
¿Vale?
00:19:04
Ok, o sea, es un método
00:19:05
tan usado.
00:19:07
Claro, que ya desde la
00:19:08
superclase lo entregas
00:19:11
para que todos lo tengan en la versión
00:19:12
básica que puede hacer Object, que es nada.
00:19:14
Pero al menos no te va a
00:19:17
dar error
00:19:19
en el desarrollo, porque todo el mundo
00:19:19
tiene ese método.
00:19:23
La idea es acomodar ciertos patrones de diseño que todos
00:19:25
sigamos.
00:19:28
Pues, todos son toString porque lo llamamos todos.
00:19:28
Pues, entonces, en object, ¿vale?
00:19:31
Entonces, si yo no tengo aquí este método,
00:19:40
no tengo el toString en cliente, no lo tengo,
00:19:45
aquí no hay ningún problema.
00:19:49
Este va a seguir llamando al toString.
00:19:51
System.out va a llamar a toString.
00:19:55
Ningún problema porque lo tiene.
00:19:57
Pero me muestra
00:19:58
Pues esta cosa rara
00:20:00
¿Vale? Porque ha llamado al toString de object
00:20:03
Pero si yo sí que tuviera
00:20:05
Un toString sobrescrito en cliente
00:20:07
Ahora este código main
00:20:11
Pues ya me hace algo más bonito
00:20:13
¿Vale?
00:20:16
Claro, en este caso sería un error ya de compilación de partida
00:20:35
Porque te diría
00:20:38
Oye, que cliente no tiene toString
00:20:39
Aquí el compilador no te puede decir eso
00:20:41
porque te dice, a ver,
00:20:43
C es cliente, pero también es object.
00:20:45
Con lo cual, tú no lo tienes, pero está heredado.
00:20:47
O sea, sí que lo tienes en realidad.
00:20:49
Sí que lo tienes, aunque no lo veas.
00:20:51
Y también hay otro método,
00:20:59
es el segundo con el que nos...
00:21:00
El único, segundo y último,
00:21:02
en el que por ahora nos metemos de object,
00:21:04
que es este de aquí que acabamos de ver
00:21:06
que nos ha gustado
00:21:08
porque lo usamos todo el rato en realidad.
00:21:10
Este.
00:21:14
El equals nos suena,
00:21:16
que sí, es un método que estamos usando
00:21:18
a menudo, pero nunca jamás
00:21:20
hemos nosotros programado
00:21:22
un equals
00:21:24
¿vale? claro, no lo hemos programado
00:21:24
porque lo heredamos de object
00:21:28
entonces
00:21:29
a ver, esto es importante
00:21:30
vamos a intentar
00:21:33
ir despacio y entenderlo
00:21:34
¿vale? venga, vamos a ponerlo aquí
00:21:38
bueno, pues
00:21:40
la igualdad de objetos
00:21:46
sigue los mismos criterios
00:21:48
que la igualdad de
00:21:50
Cadenas string
00:21:51
Que ya la vimos en su momento
00:21:53
Porque los string son cadenas
00:21:55
Entonces recordad
00:21:57
Recordáis que nosotros decíamos
00:21:58
Pues yo tengo una cadena
00:22:00
String S1
00:22:03
Igual a hola
00:22:08
¿Vale?
00:22:11
Tengo
00:22:12
String S2
00:22:13
Igual a
00:22:15
Adiós
00:22:17
¿Vale?
00:22:19
Entonces
00:22:20
Ahora si muestro aquí
00:22:21
Igual
00:22:24
Para comparar cadenas
00:22:27
Las comparamos así, ¿verdad?
00:22:31
Las comparamos
00:22:36
S1 igual a S2, perdón
00:22:36
Las comparamos así
00:22:38
Entonces, esto me dará
00:22:41
False, ¿vale?
00:22:43
Ahora
00:22:49
Voy a cambiar a S2
00:22:49
Y le voy a poner a hola
00:22:53
Y ahora, uy, ahora esto me dará true, ¿verdad?
00:22:58
Vale.
00:23:14
Y así es como comparamos cadenas, ¿verdad?
00:23:15
Porque si las comparáramos así, ¿vale?
00:23:20
Es que él usa un buffer, es que estaba buscando un ejemplo en el que hasta 1024 cadenas,
00:23:33
él cuando ve dos cadenas iguales las pone bajo la misma referencia.
00:23:39
Pero eso solo aplica en los casos en los que no lo estás pasando como parámetro.
00:23:43
entonces, vamos a instanciarlas
00:23:46
las cadenas bien para que esto no ocurra
00:23:49
vale
00:23:51
vale, entonces
00:23:53
a ver
00:23:56
vale, entonces
00:24:01
lo que he retocado aquí
00:24:09
lo que he retocado aquí
00:24:11
es la forma real
00:24:13
lo que hace Java en la forma real
00:24:15
en la cual uno instancia un objeto
00:24:17
lo que pasa es que Java nos permite
00:24:20
lógicamente
00:24:21
nos permite
00:24:22
esto
00:24:24
esto de aquí
00:24:26
por comodidad
00:24:31
como los string
00:24:31
los usamos tantísimo
00:24:32
pues java
00:24:33
nos permite
00:24:35
el atajo
00:24:35
de instanciar
00:24:37
un objeto
00:24:38
de la clase string
00:24:39
de instanciarlo
00:24:40
poniendo ahí
00:24:41
lo que sea
00:24:42
con comillas
00:24:42
¿vale?
00:24:43
nos permite este atajo
00:24:44
pero realmente
00:24:45
lo que está haciendo
00:24:46
es instanciar
00:24:47
un objeto
00:24:48
de la clase string
00:24:48
entonces lo que realmente
00:24:49
está haciendo
00:24:51
es esto
00:24:51
entonces yo lo puedo hacer
00:24:52
específicamente
00:24:54
si quiero
00:24:54
lo puedo hacer
00:24:55
específicamente
00:24:56
¿Vale? Con esto estoy instanciando
00:24:56
Un objeto de la clase string
00:24:59
Y al constructor de string
00:25:00
Ya le paso la propiedad
00:25:03
De ese objeto que es esto
00:25:05
Y en mi instanción string con ese valor de
00:25:07
¿Vale? Pero repito
00:25:08
Esto es lo que se abrevia
00:25:11
Si yo hago así
00:25:13
O se abrevia
00:25:14
Si yo hago así ¿Vale?
00:25:16
Por eso normalmente lo hacemos abreviado
00:25:20
No usamos todo esto
00:25:22
Lo que pasa es que yo lo voy a hacer específicamente
00:25:23
Para que se escape de un buffer
00:25:26
Y lo veamos más claro
00:25:29
A ver, dejadme probar un segundito
00:25:30
Vale, ahora ya sé
00:25:35
Vale, entonces
00:25:37
Yo tengo aquí mis dos cadenas
00:25:39
Está claro que aquí me va a dar
00:25:43
S1 equals S2
00:25:46
Falso
00:25:47
Perdón
00:25:48
Vale, tengo estas dos cadenas
00:25:50
Hola y adiós
00:25:53
Me da falso, lógicamente
00:25:55
Ahora, S2
00:25:56
Le asigno hola
00:25:58
Le cambio su valor, le asigno hola
00:26:01
A este objeto S2 que yo tengo aquí instanciado
00:26:02
Le asigno hola
00:26:04
Voy a compararlos ahora, S1 con S2
00:26:05
¿Vale?
00:26:08
Y voy a compararlos de estas dos maneras
00:26:10
De la buena
00:26:12
Con el equals
00:26:13
Y de la mala que uno podría hacer
00:26:15
Si escribe muy rápido
00:26:17
Y mete la pata
00:26:18
Que es S1 es igual a S2
00:26:21
bueno, pues si ejecutamos esto
00:26:24
lógicamente
00:26:27
de la manera buena
00:26:29
me ha salido true, porque aquí
00:26:30
¿qué está comparando? el equals compara
00:26:33
que el contenido que tiene
00:26:35
S1 sea igual que
00:26:37
el contenido que tiene S2
00:26:39
¿pero qué comparamos con esto?
00:26:41
la dirección de memoria
00:26:43
en la que está la cadena S1 es igual
00:26:45
que la dirección de memoria en la que está la cadena S2
00:26:47
no, S1 es un objeto
00:26:49
y S2 es otro objeto
00:26:52
entonces esto es
00:26:54
falso, porque son dos objetos distintos
00:26:57
otra cosa es que su contenido
00:26:59
sea el mismo, su contenido
00:27:01
lo es, porque
00:27:03
lo que mira es el contenido
00:27:05
esto es lo que hemos visto
00:27:07
con string, con lo que hemos
00:27:09
dicho de toda la vida
00:27:11
pues con cualquier otro
00:27:13
objeto sería igual
00:27:15
entonces, vámonos ahora a nuestro cliente
00:27:16
resulta que mi
00:27:20
aplicación
00:27:21
Pues, normalmente a las aplicaciones les ponemos un criterio de igualdad entre entidades, ¿vale? Es decir, una clave primaria. El concepto de clave primaria en las bases de datos es natural porque lo usáis y es imprescindible, no es imprescindible, pero recomendable.
00:27:22
El concepto de clave primaria como tal
00:27:39
En los lenguajes de programación no está
00:27:43
Pero es una idea que yo tengo que poner
00:27:45
Desde fuera, de alguna manera
00:27:47
Por ejemplo, aquí
00:27:49
Sería lo normal asumir
00:27:50
Que dos clientes del mismo NIF
00:27:53
Son el mismo
00:27:55
Tendría sentido, ¿vale?
00:27:56
Por significado real de mi aplicación
00:27:59
Todo por significado, no es que Java
00:28:01
Me obligue
00:28:02
Tendría sentido, ¿vale?
00:28:04
No tendría sentido pensar
00:28:07
que dos clientes con el mismo nombre son el mismo.
00:28:09
No, se pueden llamar igual.
00:28:11
Pero que dos clientes con el mismo
00:28:13
NIF son el mismo, sí.
00:28:15
Lo que pasa es que puede ser que el cliente
00:28:18
a lo mejor se haya registrado
00:28:19
dos veces con nombres
00:28:20
distintos y podría
00:28:23
haber dos objetos con el
00:28:25
mismo NIF y nombres distintos.
00:28:27
Entonces,
00:28:31
hombre, sería interesante que mi aplicación
00:28:31
de alguna manera
00:28:33
fuera capaz de ver si un
00:28:34
objeto es el mismo que el otro,
00:28:37
es igual que el otro, porque si lo es
00:28:39
yo interpreto ya que es una dúplica
00:28:41
ignoro uno o lo que sea
00:28:43
vale, pues entonces
00:28:44
desde el momento en que yo
00:28:46
asumo un criterio
00:28:49
de igualdad
00:28:51
en mis entidades
00:28:52
lo tengo que reflejar de alguna manera
00:28:54
porque si no, ¿cómo sé
00:28:57
si un objeto es igual a otro?
00:28:59
por ejemplo, vamos a hacer aquí en mi main2
00:29:01
vamos a hacer
00:29:03
dos clientes
00:29:05
Igualdad de objetos
00:29:09
Vamos a hacernos aquí dos clientes
00:29:13
Entonces aquí aparece un cliente porque uno se ha registrado
00:29:16
Cliente C1 se ha registrado
00:29:18
Y este cliente C1 se ha registrado
00:29:21
Con el nombre
00:29:26
Se ha registrado, pues con el nombre Luis
00:29:28
Y este cliente C1 se ha registrado
00:29:34
Con el NIF
00:29:40
1, 2, 3, 4
00:29:42
ahora esta aplicación
00:29:46
que es una aplicación distribuida
00:29:49
que se ejecuta en cualquier momento
00:29:51
pues
00:29:53
ha permitido
00:29:54
lo que fuera, pues que haya otro cliente
00:29:57
en la aplicación C2
00:29:59
que resulta que es el mismo
00:30:00
entonces este cliente C2
00:30:02
pues se ha registrado con nombre
00:30:09
Luisito
00:30:11
pues porque
00:30:14
se registró hace muchos años
00:30:16
entonces se llamaba Luisito
00:30:18
pero es Luis
00:30:19
que ha crecido
00:30:21
bueno, pues en la aplicación se puede dar esta situación
00:30:23
se puede dar que yo tenga
00:30:28
dos objetos instanciados
00:30:30
pero a nivel de
00:30:32
interpretación real de lo que está ocurriendo ahí
00:30:35
a nivel de lo que está pasando
00:30:38
se refieren a la misma
00:30:39
persona, a la misma persona
00:30:42
pero son dos objetos distintos, está claro
00:30:43
entonces yo tengo que de alguna manera
00:30:45
pues habilitar
00:30:48
poner la posibilidad de distinguirse
00:30:49
si un objeto se corresponde al mismo cliente que el otro.
00:30:51
Si un objeto y el otro, estas son dúplicas en realidad,
00:30:56
aunque sean objetos distintos.
00:30:59
Tengo que tener alguna manera de decir,
00:31:01
oye, este no será una dúplica,
00:31:02
porque si es una dúplica voy a eliminar uno de los dos,
00:31:04
porque si no voy a tener aquí una raíz de clientes,
00:31:07
cuando a lo mejor cuatro son el mismo,
00:31:09
otros cinco son el mismo, me va a funcionar mal.
00:31:13
Cuando agrego un pedido, ¿a quién se lo agrego?
00:31:15
Si tengo varios NIF juntos.
00:31:17
entonces debería poner de alguna manera
00:31:19
una forma de detectar
00:31:22
si diferentes instancias
00:31:23
son el mismo
00:31:25
la misma persona
00:31:27
son duplicados que no quiero, que me sobran
00:31:28
pues ¿cómo?
00:31:31
pues ahora mismo
00:31:33
tal y como lo tenemos
00:31:34
si mi criterio de igualdad es cliente
00:31:36
tendría que hacerlo
00:31:40
haciendo la propiedad
00:31:41
si c2.getNive
00:31:42
vale, vamos a ponerlo aquí
00:31:46
Ver si los
00:31:49
Dos objetos
00:31:56
Son el mismo
00:31:58
Cliente
00:32:03
Vale
00:32:05
Antes de ponerlo como lo tendríamos que hacer
00:32:07
Lógicamente
00:32:09
Uno
00:32:10
Jamás lo compararía así
00:32:11
Así no los compararía porque esto
00:32:14
Le va a dar
00:32:26
Lógicamente que no son el mismo
00:32:28
Porque ahí compara
00:32:29
Aquí compara la dirección de memoria
00:32:34
De la que cuelga cada objeto
00:32:38
Son dos objetos distintos colgando
00:32:40
Direcciones de memoria distintas
00:32:42
Lo que pasa es que el nif es igual, uno es copia del otro
00:32:44
Pero son dos objetos distintos
00:32:47
Colgando direcciones de memoria distintas
00:32:48
Entonces, si yo
00:32:50
Hago esto, me va a decir que
00:32:52
No son el mismo, ¿verdad?
00:32:54
No son el mismo
00:32:59
Vale, entonces yo podría decir
00:33:00
Oye, voy a hacer el truco
00:33:03
Del string, voy a hacerlo
00:33:05
Con el equals
00:33:07
Vale, entonces yo
00:33:08
Vamos a hacer otro intento
00:33:11
En lugar de comparar así
00:33:12
Vamos a comparar
00:33:14
Que ya tenemos la pista de que con las cadenas
00:33:17
Esto no funciona, pues las direcciones de memoria
00:33:19
Vamos a comparar así
00:33:21
¿Vale?
00:33:26
Y ahora, la pregunta que haríais sería
00:33:30
¿Podemos completar esto
00:33:33
O preferís parar?
00:33:35
¿Eh? ¿Qué habéis dicho?
00:33:37
¿Sigo?
00:33:40
Vale, pues nada
00:33:42
5 minutos, o por ahí
00:33:42
Bueno, siempre digo 5 y luego son 6, pero...
00:33:44
Vale, entonces, primera pregunta que os hacéis.
00:33:47
Decís, pero bueno, ¿cómo que C1.equals?
00:33:50
¿Desde cuándo he hecho yo en mi clase cliente un método
00:33:55
equals?
00:33:59
¿Cómo es que eso puede llamar a un método equals?
00:33:59
Vamos a ver si es que yo tengo en mi clase cliente un método
00:34:02
equals.
00:34:05
No tengo un método equals en ningún sitio.
00:34:06
¿Cómo puede ser que este llame a un método equals?
00:34:08
Claro, pero ya sabemos que cliente hereda de object
00:34:11
y object tiene un método equals, que es este.
00:34:14
Pero este método equals nos vale.
00:34:20
Pues si miramos cómo está hecho, tampoco nos vale.
00:34:22
Porque este método equals lo que hace es el doble igual.
00:34:25
Comparar la dirección de memoria del que llama al método
00:34:28
con la propia dirección de memoria del pasado.
00:34:31
Es decir, hace lo mismo.
00:34:35
Hace el doble igual.
00:34:36
Con lo cual no he ganado nada llamando al equals.
00:34:37
No he ganado nada, porque lo que hace el equals de object es coger la dirección de C1 y hacer doble igual con la de C2.
00:34:40
Esto, coger C1 y hacer doble igual con C2, con lo cual no he ganado nada, llamando al equals de object.
00:34:48
Y de hecho, si lo ejecuto, me va a seguir diciendo que no son el mismo.
00:34:58
Claro, pero es que lo que ocurre es que a mí el equals de object no me interesa.
00:35:02
yo quiero sobreescribir el equals
00:35:06
para que refleje realmente
00:35:09
si el objeto es el mismo o no
00:35:11
entonces nosotros
00:35:13
sobreescribimos el método equals
00:35:15
de object con nuestra condición de igualdad
00:35:17
con la que nos interese a nosotros por aplicación
00:35:19
la que nos dé la gana
00:35:22
entonces, ¿qué hacemos aquí?
00:35:23
vamos a sobreescribir el equals
00:35:25
igual que hemos sobreescrito el toString
00:35:27
vamos a sobreescribir el equals
00:35:28
cliente
00:35:31
equals
00:35:33
cliente C
00:35:35
por ejemplo
00:35:38
y ahora
00:35:39
y que me devuelve
00:35:40
boolean
00:35:44
vale
00:35:45
y voy a poner aquí un override
00:35:47
para asegurarme
00:35:51
a ver si he puesto bien la cabecera
00:35:53
vale
00:35:55
he puesto aquí, perdón
00:35:56
esto, vale
00:35:59
public me devuelve un boolean
00:36:01
el método equal recibe un objeto cliente
00:36:03
entonces
00:36:06
¿qué me va a devolver? pues
00:36:07
si
00:36:10
dis
00:36:11
el objeto que llama al método
00:36:14
punto nif
00:36:15
resulta que es como es un string
00:36:16
resulta que es igual
00:36:19
esto es un string
00:36:21
¿vale? recordad que los strings se comparan con
00:36:23
equals
00:36:25
es igual que c punto nif
00:36:26
pues entonces
00:36:30
ya retúntru
00:36:31
que mi equals me devuelva true
00:36:32
y si no
00:36:34
Else
00:36:36
Return false
00:36:38
¿Vale?
00:36:40
Entonces
00:36:42
A ver que no he escrito
00:36:43
Bien la cabecera
00:36:50
Object
00:36:52
Y ahora, ¿vale?
00:37:06
Porque la cabecera no estaba idéntica
00:37:08
¿Vale? Ahora he puesto la cabecera
00:37:11
Idéntica para que sea sobrescrito
00:37:12
¿Vale?
00:37:14
He puesto la cabecera
00:37:15
Perdón, idéntica
00:37:17
la cabecera está idéntica
00:37:18
pero lo único
00:37:20
es que ahora me falta hacer el casting
00:37:22
para que la cabecera sea idéntica
00:37:24
el parámetro que paso
00:37:26
lo tengo que poner como si fuera object
00:37:28
para que la cabecera sea idéntica
00:37:29
pero yo sé que el que voy a pasar
00:37:31
es un objeto cliente
00:37:34
cuando lo llame lo sé que es un objeto cliente
00:37:36
luego para poder acceder
00:37:38
a nif, porque esto de nuevo es herencia
00:37:40
el compilador me dice
00:37:42
a ver parámetro c
00:37:44
parámetro c es de clase object
00:37:45
En la clase object
00:37:48
No hay ningún nif que yo sepa
00:37:50
Con lo cual no te dejo
00:37:51
Que hacíamos
00:37:53
Le poníamos el casting a object
00:37:55
¿Verdad?
00:37:57
Perdón, el casting a cliente
00:37:59
Ay, jolines, cliente
00:38:01
Cliente de C
00:38:10
Y ahora
00:38:15
Esto lo paso a
00:38:19
Cliente C
00:38:24
Punto
00:38:25
Ahora, ahora lo
00:38:26
Vale, ya está
00:38:33
Vale, a ver, repasamos por partes. Yo quiero sobreescribir el método equals de object para que realmente me compare, me devuelva true si los objetos son iguales o falsos y no, pero según el criterio de igualdad mío que yo quiera, no según el de dirección de memoria que es el que tiene object.
00:38:39
¿Vale? Ese no me gusta
00:39:02
Quiero que me devuelva true
00:39:04
Si pasa lo que yo quiero
00:39:07
Y false si no
00:39:08
Hasta ahí está claro, ¿no?
00:39:10
Entonces lo sobrescribo
00:39:11
Y sobrescribirlo implica respetar su cabecera tal cual
00:39:13
Vale, ahí se queda sobrescrito
00:39:16
Ahora
00:39:18
¿Cuándo quiero yo que devuelva true?
00:39:19
Cuando el need del objeto que llama el método
00:39:22
Que es this
00:39:25
Sea igual que el need del objeto parámetro
00:39:25
Ahí es cuando quiero que devuelva true
00:39:29
Y false si no
00:39:31
vale, pues si this.nif
00:39:32
es igual
00:39:35
este es el equals de la clase string
00:39:36
es igual que el nif
00:39:38
de este
00:39:41
pero claro, esto es lo mismo de la herencia
00:39:42
que ya hemos visto
00:39:45
como cliente
00:39:46
hereda de object
00:39:49
yo aquí le puedo pasar, le he pasado un cliente
00:39:50
y no pasa nada, porque recordad
00:39:53
que en una superclase
00:39:55
puede caer una instancia de una subclase
00:39:56
entonces c2, lo que yo le paso
00:39:59
aquí es cliente que es subclase
00:40:01
pero él cabe perfectamente
00:40:03
ningún problema
00:40:05
en meterlo en un object
00:40:06
porque object es superclase
00:40:09
luego casa perfectamente
00:40:10
pero claro, el compilador, cuando yo haga c.nir
00:40:12
el compilador me dice
00:40:15
perdona, yo miro como estás
00:40:17
declarado, aunque luego te instancies
00:40:19
como cliente y te pases aquí como cliente
00:40:21
yo miro que estás
00:40:23
declarado como object y aquí en object
00:40:25
que yo sepa no hay ningún nir
00:40:27
¿cómo solucionábamos eso?
00:40:28
hacíamos el casting a la subclase
00:40:31
y ya está
00:40:33
¿vale? es decir, yo sé
00:40:34
que C, cuando este método realmente
00:40:37
se ha invocado desde el main
00:40:40
se ha invocado
00:40:41
sé que le voy a pasar un objeto cliente
00:40:43
que perfectamente
00:40:46
cabe en esta referencia
00:40:47
entonces, me puedo permitir
00:40:49
hacerle un casting
00:40:52
a cliente y ahora
00:40:53
en el casting del compilador
00:40:55
ya si me deja coger las propiedades de cliente
00:40:57
ya si me deja
00:41:00
¿vale? que es lo que habíamos hablado
00:41:01
bueno, pues ya tengo un equals
00:41:03
que se adapta a lo que yo quiero
00:41:05
me devuelve true
00:41:07
si el objeto que llama al método
00:41:08
tiene el mismo need que el objeto parámetro
00:41:10
y false signo, ahora ya tengo el equals
00:41:12
bueno
00:41:15
con lo cual, ahora ya mi main
00:41:15
esto ya sí que va a funcionar
00:41:19
estos dos son objetos distintos
00:41:21
el nombre distinto
00:41:23
luego se registró, puso nombres distintos
00:41:25
pero son el mismo, son una
00:41:27
dúplica
00:41:29
entonces, ahora yo ya
00:41:30
lo voy a ver con esto
00:41:32
cuando yo ejecute esto
00:41:33
ahora efectivamente
00:41:36
me dice la aplicación, los objetos
00:41:39
son el mismo, son lo mismo
00:41:42
es el mismo cliente, porque c1
00:41:43
es igual a c2
00:41:46
porque para que este método sea sobrescrito
00:41:47
tiene que tener la cabecera
00:41:56
tal cual, y la cabecera
00:41:58
en object es esta
00:42:00
vale
00:42:02
claro
00:42:04
¿vale? entonces el equals
00:42:07
de hecho es un método
00:42:13
tan imprescindible
00:42:15
en general, ponerlo en nuestras clases
00:42:17
para dar ese significado
00:42:19
de cuando algo es igual, es una dúplica
00:42:21
de otra cosa, aunque sean objetos distintos
00:42:23
que
00:42:25
como el toString, el eclipse te lo genera
00:42:26
solo si te da la gana
00:42:29
por ejemplo, voy a dejar
00:42:30
este comentado que es nuestra versión
00:42:33
y digo, yo estoy ya
00:42:35
en plan piloto automático
00:42:37
y digo, a ver, cliente
00:42:39
cliente en mi diseño, mi aplicación
00:42:41
me está diciendo que clientes
00:42:44
con NIF iguales son el mismo porque es clave
00:42:45
primaria, pues como NIF es clave
00:42:47
primaria no puede haber dos clientes
00:42:49
con el mismo
00:42:51
NIF, pues me voy a hacer ya un equals
00:42:53
para que la aplicación tenga claro cuando
00:42:55
un objeto es el mismo que el otro, cuando son
00:42:57
dúplicas, aunque sean objetos distintos
00:42:59
pues o lo hago a mano como lo he hecho ahora
00:43:01
o cualquier entorno te permite generarlo
00:43:03
directamente, veis aquí botón derecho
00:43:05
te pone
00:43:07
generar hashcode
00:43:10
en equals
00:43:11
igual que hemos generado
00:43:11
automáticamente
00:43:14
los getter y setter
00:43:14
el toString
00:43:15
pues le marcamos
00:43:16
hashcode en equals
00:43:17
y te dice
00:43:18
¿cuáles son las
00:43:18
propiedades
00:43:22
que definen
00:43:23
que un objeto
00:43:24
sea igual a otro?
00:43:25
en nuestro caso
00:43:25
nif
00:43:26
pues dejamos marcada
00:43:26
nif solamente
00:43:27
podría ser
00:43:28
que yo
00:43:30
que para mí
00:43:31
dos objetos
00:43:31
son iguales
00:43:32
solo
00:43:32
si nif
00:43:33
y nombre
00:43:34
son iguales
00:43:35
los dos
00:43:36
podría ser
00:43:36
eso ya depende del análisis
00:43:37
que yo he hecho de mi aplicación, en este caso
00:43:39
solo depende del nif, marco solo
00:43:41
nif y generar
00:43:43
vale
00:43:45
y él me ha
00:43:46
generado aquí
00:43:51
este equals
00:43:54
y me gea el hashcode
00:43:55
obligatoriamente que lo podemos dejar
00:43:57
pero ahora mismo es que no lo usamos
00:43:59
entonces lo podemos dejar
00:44:01
el hashcode es un paso B
00:44:03
de igualdad cuando usas conjuntos
00:44:05
pero bueno, eso ya lo veremos
00:44:08
Si no usas conjuntos, no lo necesitas.
00:44:09
Vale, entonces nos ha generado un equals
00:44:12
un poquito más completito que el nuestro.
00:44:14
En realidad hacen lo mismo, pero bueno,
00:44:18
como te dice.
00:44:20
A ver, si la dirección de memoria del que llama
00:44:22
es igual que la dirección de memoria,
00:44:24
ahí es evidente que van a ser,
00:44:27
que tiene el mismo nid.
00:44:28
Ahí es evidente.
00:44:29
Pues entonces te devuelve true.
00:44:31
Vale.
00:44:33
¿Qué más hace este equals generado?
00:44:34
Si el objeto que le pasas como parámetro
00:44:36
es nul, es evidente
00:44:38
que es imposible que sea igual que este.
00:44:41
Con lo cual, retúrfalse.
00:44:43
Porque el que llama
00:44:45
al método no podría ser nul.
00:44:46
¿Por qué no puede ser nul?
00:44:48
Porque si...
00:44:52
Claro, si un objeto nul...
00:44:54
Tú llamas c1 punto...
00:44:56
No, es que
00:44:58
no serían iguales. Es que nunca jamás
00:45:00
llegarías ahí. Imagínate que c1 es nul.
00:45:02
Yo ahora hago esto.
00:45:05
c1 es igual a nul.
00:45:06
Y trato de ejecutar este código, que puedo ejecutarlo.
00:45:08
Me sale un null pointer exception,
00:45:14
porque yo no puedo ejecutar desde un,
00:45:16
con lo cual jamás llegaría al equals.
00:45:19
¿Vale?
00:45:22
Entonces, y ya de verdad que terminamos.
00:45:23
Ya, es que son 6 minutos cuánticos.
00:45:28
Entonces, no son lo mismo.
00:45:31
¿Dónde estamos?
00:45:37
En el equals que ha generado, que estaba dónde.
00:45:38
Ah, que no estoy ahí.
00:45:40
Aquí.
00:45:41
vale, entonces este
00:45:41
equals, si los dos
00:45:44
objetos son la misma dirección de memoria
00:45:46
es decir, uno está encima del otro, es evidente
00:45:48
que retunsa, si el segundo
00:45:50
es null, es evidente
00:45:52
que no son iguales, porque el primero no puede ser
00:45:54
null, porque no habríamos llegado ahí
00:45:56
no puede ser null, vale, ahora
00:45:57
esto lo que te dice es
00:46:00
si la clase a la que pertenece
00:46:01
el primero es diferente de la clase
00:46:04
a la que pertenece el segundo
00:46:06
es decir, yo le paso
00:46:07
un cliente y aquí le paso un pedido
00:46:09
que podría porque cabe en object
00:46:12
él ya directamente
00:46:13
te devuelve que es falso, es imposible
00:46:15
que dos objetos sean iguales y son de diferente clase
00:46:17
vale, entonces este es
00:46:19
un método que te devuelve, ya veremos
00:46:21
más adelante, la clase a la que pertenece
00:46:23
si no es la misma clase
00:46:25
directamente retú un falso
00:46:27
y ahora ya, si has pasado todo
00:46:29
el cribado, ahora ya te hace
00:46:31
el casting famoso, te hace el
00:46:33
casting y ahora ya sí te
00:46:35
devuelve, si este
00:46:37
es igual que el otro, te devuelve true
00:46:39
y si no te devuelve false
00:46:41
es decir, hace lo mismo
00:46:42
que el nuestro, pero bueno
00:46:45
te contempla más casos, te contempla si este
00:46:47
es null, que tenemos comparado
00:46:49
luego, este es
00:46:51
otro ejemplo de método sobrescrito de object
00:46:53
que normalmente
00:46:55
lo ponemos para darle un poco de significado
00:46:57
a la aplicación, para darle
00:46:59
significado de que un objeto es igual a otro
00:47:01
y la clase string
00:47:03
tiene su propio método equals que ella
00:47:04
sobrescribe, cuando usamos el
00:47:07
equals de string, no usamos el de object
00:47:09
usamos el que la propia clase
00:47:11
string ha sobrescrito, que mira
00:47:13
a ver si cada carácter es igual que el del otro
00:47:15
¿vale?
00:47:17
si
00:47:20
si mira, si entramos en la clase
00:47:20
string, que es
00:47:25
esta clase string, pues la clase string
00:47:27
tiene su propio toString sobrescrito
00:47:29
su propio toString
00:47:31
sobrescrito, que a ver si
00:47:37
lo encontramos rápido, esos son los constructores
00:47:39
bueno, aquí no hay un buscar
00:47:41
toString
00:47:51
vale, pero más
00:47:55
¿cómo avanzo aquí?
00:47:59
así aquí
00:48:03
ah, no, perdón
00:48:04
que estaba hablando del equals
00:48:18
perdón, el que quiero localizar es el equals
00:48:19
tiene su propio equals
00:48:22
su propio equals
00:48:23
¿veis? la clase string
00:48:26
que es esta clase
00:48:33
que la acabo de abrir, la clase string
00:48:35
tiene su propio
00:48:37
equals que sobrescribe
00:48:39
de la de object, porque cuando yo
00:48:41
comparo dos strings no quiero comparar con
00:48:43
su dirección de memoria, quiero
00:48:45
comparar si los char que tiene uno dentro
00:48:47
son los char que tiene otro, puesto
00:48:49
de este código que te hace
00:48:51
el equals de tu string
00:48:53
te vale para meterse en el string
00:48:55
para ver si los caracteres son iguales
00:48:57
los del que llama el método
00:48:59
que el string que tú le pases, etc
00:49:00
tiene su propio equals
00:49:03
¿vale? porque el equals
00:49:05
de object no vale para nada, vale para comparar direcciones
00:49:07
de memoria solo
00:49:09
¿vale?
00:49:09
y ahora sí que me callo
00:49:12
- 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:
- 1
- Fecha:
- 19 de enero de 2026 - 11:12
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 49′ 18″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 432.57 MBytes