Teoría Herencia parte 2 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Sigo grabando, si decís algo es porque queréis y por lo tanto me autorizáis
00:00:00
Vale, hemos hecho este ejercicio rápidamente, vamos a ver más
00:00:06
Primero, existe una jerarquía de herencia en Java
00:00:12
Que quiere decir que como cada clase puede heredar de otra
00:00:17
Se crea una jerarquía, un árbol
00:00:23
Donde una persona hereda
00:00:26
Que sea un alumno
00:00:29
Hereda de persona
00:00:31
Que hereda de no se que
00:00:33
Que hereda de no se cuanto
00:00:34
Todos los objetos en Java
00:00:35
Por defecto
00:00:39
Sin que vosotros lo escribáis
00:00:41
Heredan de la clase
00:00:43
Object
00:00:45
Entonces
00:00:46
Todos los objetos
00:00:48
Que vosotros creéis en vuestra vida
00:00:50
Esa
00:00:52
Es un object
00:00:54
Existe esta clase super padre
00:00:56
Que todos los objetos, todas las clases derivan de aquí
00:01:03
Y por lo tanto todos los objetos en Java comparten algunas características
00:01:07
Algunos métodos, algunas partes de información
00:01:12
Porque todos importan desde el objeto
00:01:18
hasta si yo no escribo nada
00:01:22
pues en automático
00:01:24
extiende objeto
00:01:25
¿vale? si yo extiendo
00:01:28
desde alumno extiendo persona y persona
00:01:30
no extiende nada, persona extiende objeto
00:01:32
y por lo tanto estoy extendiendo también
00:01:34
objeto
00:01:36
por lo tanto cualquier clase
00:01:36
está extendiendo objeto
00:01:40
¿sí?
00:01:42
una clase puede o heredar
00:01:44
explícitamente de otra clase como
00:01:45
si yo ahora de
00:01:47
alumno extiende
00:01:48
persona o heredar implícitamente de la clase object. Si no escribo nada, en automático estoy
00:01:51
utilizando el evento. Y por lo tanto se me crea toda una estructura de todo lo que hemos visto nosotros. Por ejemplo, string puede ser de no sé quién que heredará de object.
00:01:58
A este punto
00:02:10
Vamos a mirar una cosa
00:02:15
Que va a ser de interés
00:02:17
Vuestro desde ahora
00:02:21
Para el resto de vuestra vida
00:02:22
Que se llama la API de Java
00:02:24
La API de Java es
00:02:26
Sostancialmente, nosotros hemos visto
00:02:29
Un par de clases o tres como
00:02:31
Scanner, String
00:02:32
Etcétera, etcétera
00:02:34
Que son clases que nosotros utilizamos
00:02:36
¿Vale? Pero no lo hemos hecho nosotros
00:02:39
En ningún momento vosotros habéis hecho public class scanner
00:02:41
Y os habéis puesto a programar
00:02:44
O public class string y os habéis puesto a programar
00:02:46
Pero la habéis podido utilizar
00:02:49
Esto porque Java, en su paquete, digamos, de desarrollo
00:02:51
Os incluye un mogollón de clases ya hechas
00:02:55
Y que vosotros podéis utilizar
00:03:00
Pero, ¿y estas clases cómo están hechas?
00:03:01
¿Qué métodos tienen? ¿Qué parámetros tienen?
00:03:04
No lo sé
00:03:07
Y entonces me voy a Internet, busco Java API y el nombre de la clase que quiero mirar
00:03:08
Por ejemplo en este caso queremos ver Object
00:03:18
Al darle Intro me salen cosas así
00:03:21
Y aquí por ejemplo tengo el API de Object
00:03:24
Si me voy al API de Object obtengo una página parecida a esta
00:03:30
Donde me dice, soy la clase object
00:03:34
Pertenezco al paquete java.lang
00:03:39
Mi nombre completo es java.lang.object
00:03:42
Y soy el objeto
00:03:47
La root of the class hierarchy
00:03:50
La raíz de la jerarquía de clases
00:03:54
Y aquí yo me puedo poner a mirar que tiene que ofrecer
00:03:58
Por ejemplo, me ofrece el object sin parámetros, como constructor, ¿vale?
00:04:02
Que es el constructor que siempre se llama cuando no hago un super, ¿vale?
00:04:08
Porque por defecto estoy llamando a...
00:04:14
Yo soy la clase, qué sé yo, ¿qué hemos hecho ahora?
00:04:17
La clase dispositivo.
00:04:20
Pues la clase dispositivo is a object.
00:04:22
Porque hereda, extiende.
00:04:25
Y por lo tanto, la primera cosa que se hace es llamar el constructor de object.
00:04:28
Este constructor de aquí
00:04:31
Que creará las cosas básicas para que tú puedas ser un objeto
00:04:33
A partir de allí, pondrás todas las cosas que te interese a ti
00:04:38
Pero esta es, digamos, una cosa escondida en nosotros
00:04:41
Que se hace por defecto para crear un objeto
00:04:44
Aquí se hará, aquí dentro, las cosas básicas
00:04:48
Que tiene que hacer la Java Vector Machine
00:04:52
Para poder crear un espacio de memoria donde crear un objeto
00:04:54
Y también tiene un montón de
00:04:57
Metoditos
00:05:03
Y algunos de estos metoditos
00:05:05
Los hemos visto
00:05:08
En algún momento
00:05:11
¿Os suena de algo?
00:05:12
¿Os suena de algo?
00:05:17
Estos métodos de aquí
00:05:24
En particular el equals
00:05:28
Y el toString
00:05:29
Son métodos interesantes
00:05:31
Porque los vamos a utilizar
00:05:33
Sobrescribiéndolos
00:05:35
En cuanto sepamos que es
00:05:37
Sobrescribir
00:05:39
Para que nuestros objetos
00:05:40
Se comporten
00:05:42
De alguna forma
00:05:44
Por ejemplo, el método toString
00:05:46
Devuelve una representación
00:05:48
En formato de string del objeto
00:05:51
Por defecto
00:05:53
Si yo hago el toString
00:05:58
Sobre cualquier objeto del mundo
00:06:00
Sin haber dicho nada
00:06:02
Me llama
00:06:04
El método toString de object
00:06:05
Yo tengo un dispositivo
00:06:08
El dispositivo es un objeto
00:06:10
Y por lo tanto cuando llamo el toString
00:06:11
Sobre el dispositivo me pillará
00:06:13
El de su padre que es object
00:06:15
¿Vale?
00:06:18
La, no sé si la habéis hecho alguna vez
00:06:20
En vuestra vida
00:06:22
Pero si vosotros pilláis un objeto
00:06:23
El objeto
00:06:25
De uno
00:06:27
Y le decís, oye, me imprimes de uno en pantalla
00:06:28
De uno, así
00:06:33
¿Qué hace?
00:06:36
Esto
00:06:42
En realidad, Java no debería hacer nada
00:06:43
Porque System.Auto.Println, ¿qué recibe aquí?
00:06:54
Un dispositivo
00:07:02
¿Qué ponemos normalmente aquí nosotros?
00:07:03
¿Qué tipo de datos ponemos aquí?
00:07:08
Un string
00:07:11
Este señor
00:07:12
Quiere aquí un string
00:07:14
Sin embargo le estoy dando un dispositivo
00:07:15
¿Y por qué no se queja?
00:07:18
Porque en realidad
00:07:21
Está haciendo esto
00:07:22
Oye, cuidado, pero
00:07:25
Esto yo no lo he declarado
00:07:30
No está escrito en dispositivo
00:07:33
En ningún lado el método toString
00:07:35
¿De dónde saco este toString?
00:07:36
De objeto, del objeto object
00:07:40
Es este tu string de aquí
00:07:46
¿Vale?
00:07:50
Entonces, si yo no le digo nada
00:07:55
Cualquier objeto tiene una forma
00:07:57
Para transformarse en un string
00:07:59
¿Vale?
00:08:02
Como es el caso aquí
00:08:03
Cuando Java dice
00:08:04
Mira, aquí necesitaría un string
00:08:07
Y tú me has puesto un objeto
00:08:09
Como yo necesito un string
00:08:11
Te lo voy a traducir a string
00:08:13
Utilizando el método toString
00:08:15
Que transforma tu objeto en una representación en formato string de tu objeto
00:08:18
Y como tú no me has dicho
00:08:23
Cómo se representa de forma string tu objeto
00:08:25
Un objeto dispositivo
00:08:30
Yo tiro de la representación genérica de un objeto
00:08:31
Que es la representación en formato string que me da object
00:08:36
El toString de object
00:08:39
¿Queda claro?
00:08:41
¿Y cómo podría hacer yo que mi dispositivo en vez de este código absurdo aquí
00:08:43
¿Dónde está? No
00:08:51
En vez de este código absurdo aquí
00:08:53
Me dijera algo como soy un dispositivo con número serial no sé qué
00:08:56
La forma sería irse al dispositivo y decir
00:09:03
Oye mira el dispositivo por algún lado aquí
00:09:12
Tú tienes un public string
00:09:15
Porque tienes que devolver un string
00:09:19
ToString
00:09:20
Este método de aquí
00:09:22
Espera que se han parado
00:09:25
Ah, sí, no
00:09:28
Tienes que devolver algo
00:09:29
Entonces string s es igual a esto
00:09:30
Return s
00:09:35
Este método de aquí
00:09:37
¿Es nuevo?
00:09:41
No, existía ya
00:09:43
¿Vale?
00:09:47
Existía como object
00:09:48
Y yo como este señor
00:09:49
No importando nada
00:09:52
Es como si estuviera
00:09:53
StandsObject
00:09:54
Por lo tanto ya lo tenía
00:09:56
Este método, de hecho ya he podido llamarlo
00:10:01
Sin codificarlo
00:10:03
Pero como ahora lo he vuelto a escribir
00:10:05
En un cierto sentido
00:10:07
Esto borra
00:10:09
Lo que es el toString
00:10:10
Del object
00:10:13
Y me pone este de aquí
00:10:14
De hecho si yo ahora vuelvo
00:10:16
¿Os acordáis que antes escribía esta cosa rara?
00:10:18
Vale, si yo ahora vuelvo
00:10:20
A lanzar esto, ¿qué me escribe?
00:10:22
Nada
00:10:26
Porque ahora cuando llama
00:10:27
El toString, llama este
00:10:31
ToString, y como este toString
00:10:33
Dice nada, pues me devuelve
00:10:35
Nada
00:10:37
Pero yo lo puedo cambiar como
00:10:38
Dispositivo
00:10:40
Num
00:10:43
Más numSerial
00:10:44
NumSerial
00:10:47
Número serial
00:10:48
Número serial
00:10:50
Y ahora cuando lanzo la prueba
00:10:52
Él me usa el toString
00:10:56
Del dispositivo
00:11:00
Está claro que si yo en vez de utilizarlo aquí
00:11:01
Lo utilizo sobre un móvil que pasa
00:11:05
Que pasará aquí al fondo
00:11:07
Si yo pongo M1
00:11:14
Me lo trata como si fuera
00:11:17
Un dispositivo
00:11:30
¿Vale?
00:11:32
Porque el móvil
00:11:33
Esto no aparece
00:11:35
Entonces va, digamos que el más cercano de móvil es la definición que está en su padre
00:11:36
Que es el toString
00:11:44
Entonces no necesita llegar hasta el object para trobar un toString
00:11:45
El móvil busca en su padre que es dispositivo
00:11:50
Aquí encuentra una definición de toString y usa esta
00:11:54
Y entonces hace esta cosa aquí
00:11:57
Si yo quisiera hacerlo una cosa distinta en el móvil
00:11:59
Copiaría esto aquí
00:12:04
En vez de dispositivo
00:12:06
Poner móvil
00:12:09
Y ahora
00:12:10
Cuando lo lanzo
00:12:13
Esto me dice dispositivo
00:12:17
Porque he llamado sobre un dispositivo
00:12:20
Y esto me dice móvil porque he llamado sobre un móvil
00:12:22
Sería buena
00:12:24
Praxis
00:12:29
Entre comillas
00:12:31
Que vuestros objetos
00:12:32
Cuando creáis objetos
00:12:33
Pues pongáis el toString
00:12:35
Para que en el momento en que
00:12:38
se imprime en pantalla
00:12:40
el toString se dé una representación
00:12:42
con sentido
00:12:44
de los objetos que estáis creando
00:12:45
si no, sale el codicilo
00:12:47
de antes, vamos a ver
00:12:50
que es el código de antes, fijaos
00:12:52
que pasa si yo borro esto
00:12:54
el de dispositivo
00:12:56
pero dejo el de móvil
00:12:57
¿qué pasará ahora?
00:12:59
que el móvil si te lo marca
00:13:03
pero el dispositivo
00:13:05
el móvil usa el de móvil
00:13:06
y el dispositivo
00:13:09
Usa el de su padre
00:13:10
El de object
00:13:13
¿Lo veis?
00:13:14
Como está hecho esto de object
00:13:16
Dice, ¿qué es esto?
00:13:17
Es la clase
00:13:23
¿Vale?
00:13:23
Entonces, por defecto
00:13:24
El toString de object
00:13:26
Crea un string que es
00:13:28
La clase del objeto
00:13:30
¿Vale?
00:13:32
De qué instancia es
00:13:33
Es una instancia de dispositivo
00:13:36
Et
00:13:37
En posición
00:13:38
Un código raro
00:13:40
Esto, que no es verdad, pero lo podríamos pensar como una zona de memoria
00:13:42
Donde está guardado este objeto
00:13:48
En realidad esto es un código hash raro que hace cosas raras y cosas por el estilo
00:13:50
Pero la idea es que esto me representa en un cierto sentido
00:13:55
Donde está guardado mi ordenador, mi objeto
00:14:00
Es, en un cierto sentido, pensarlo así
00:14:06
Podría ser lo que está escrito en una referencia
00:14:10
¿Sabéis? Cuando yo digo esta variable es una referencia que apunta a un objeto
00:14:14
Pues esto es el código que representa dónde está este objeto
00:14:19
¿Sí?
00:14:25
No es exactamente así, ¿eh?
00:14:30
Por favor, tú que estás mirando el vídeo
00:14:31
No te enfades conmigo
00:14:34
¿Vale?
00:14:36
Pero una simplificación suficiente
00:14:37
Para entenderlo un poquito
00:14:40
¿Sí?
00:14:41
Vale
00:14:43
Sigamos
00:14:44
Entonces, acordaos que cualquier
00:14:46
¿Cómo se llama esto?
00:14:48
Cualquier clase que vosotros creéis
00:14:51
Directamente tira de este señor de aquí
00:14:53
Tened en cuenta también que si queréis
00:14:56
Tener más información sobre el ToString
00:14:58
Pincháis aquí
00:15:00
Y aquí viene
00:15:01
No, este es Notify, pero está por el lado
00:15:02
y os explica
00:15:04
que es, como funciona
00:15:08
para que sirve, bla bla bla
00:15:10
de hecho aquí
00:15:12
os dice
00:15:14
que es lo que viene después de la arroba
00:15:16
que es una
00:15:20
unsigned hexadecimal representation of the
00:15:21
hash code of the object
00:15:24
entonces no es exactamente donde se pone
00:15:25
pero bueno
00:15:28
si
00:15:29
entonces aquí lo podéis mirar
00:15:31
Pero es más que esto
00:15:34
Vosotros aquí, en este mundo maravilloso del API
00:15:35
Podéis ir a miraros todas las clases que nosotros hemos visto
00:15:39
Como por ejemplo, puedo irme a mirar string
00:15:45
Y ver todos los constructores de string
00:15:48
¿Vale?
00:15:52
Que son estos
00:15:54
String, string a través de un byte de bytes
00:15:55
String a través de un bar de...
00:16:00
¿Os acordáis el otro día cuando hicimos el ejercicio dado un array de char, sácame un string?
00:16:03
Si yo sé que existe esto, que hay un constructor de string que pilla un array de char,
00:16:10
eso se hace con new string del array de char.
00:16:23
Y aquí hay todos los posibles constructores de string.
00:16:29
Y luego empiezan todos los métodos de string
00:16:35
A lo mejor
00:16:38
Reconoceréis este método de aquí
00:16:40
Que lo hemos usado alguna vez
00:16:42
El charat
00:16:44
Pero hay un montón
00:16:45
Hay el compare to, hay el concat
00:16:48
El contains
00:16:50
¿Os acordáis eso de
00:16:51
Dada una secuencia de caracteres
00:16:52
Buscarla dentro de un string
00:16:55
Aquí la tenéis
00:16:57
Ya implementada
00:16:59
Y probablemente más eficiente
00:17:01
De lo que hacéis vosotros
00:17:03
¿Vale?
00:17:04
Copy, value, ends, width, equals
00:17:06
¿Esto suena de algo?
00:17:10
¿Dónde lo hemos visto?
00:17:13
Sí, pero ¿dónde lo hemos visto hace un minuto?
00:17:15
Este es object, ¿eh?
00:17:28
Este método de aquí no es un método de string
00:17:32
Es una sobrescritura del método de object
00:17:34
Que en vez de comparar dos objetos entre ellos
00:17:39
Compara dos strings entre ellos
00:17:42
Fijaos que recibe un objeto, no un string
00:17:44
¿Por qué?
00:17:50
Porque el que está en object trabaja con objetos, no con string
00:17:52
Entonces estoy forzado a reutilizar esto
00:17:58
Pero bueno, estas cosas con más calma en un futuro
00:18:02
Lo único es que a veces podéis echarle un vistazo a las nuevas clases que nosotros vamos a ver.
00:18:05
Dedicad un poco de tiempo para ir a la API de esa clase y mirar qué se puede hacer con esa clase.
00:18:15
El 70% de los ejercicios sobre string que hemos hecho son sustancialmente lo mismo.
00:18:24
mismo que ya están implementados en la clase string no necesitaba implementarlo vosotros
00:18:32
cuando yo soy un programador y sé programar no vuelvo a rehacer el búscame una cadena dentro
00:18:41
de otra cadena porque ya está implementado ya me han implementado y no vuelvo a implementar
00:18:48
Yo cada vez que lo uso, uso el contains
00:18:54
¿Vale? O uso
00:18:56
Todo lo que me da aquí, start to string
00:18:57
To lowercase
00:19:00
¿Vale? Dame una frase
00:19:01
Una secuencia en mayúsculas
00:19:04
Y te la pone en minúsculas
00:19:06
Pues aquí lo tenéis
00:19:08
Esto
00:19:09
¿Sí? Entonces
00:19:11
Acordaos
00:19:16
Y esto con todas las clases
00:19:17
De multiverso ya creadas
00:19:20
De Java
00:19:22
vale si vosotros buscáis cárner y tenemos nuestro escáner
00:19:24
vale con todos sus métodos incluidos eso de nex
00:19:32
next in the next double etcétera o sea que aquí están todos lo que podéis
00:19:39
utilizar
00:19:47
Entonces acordaos
00:19:50
Porque esta es una herramienta muy potente
00:19:52
El API
00:19:54
Vosotros podéis buscar allí un montón de información
00:19:55
Cuando encontréis a partir de ahora
00:19:58
Una clase nueva
00:20:00
Echadle un vistazo en el API
00:20:01
Para ver que puede hacer esa clase
00:20:03
Que os proporciona
00:20:05
Sigamos con nuestra herencia
00:20:06
Entonces
00:20:10
Hemos ya creado constructores con herencia
00:20:11
Fijamos algunos puntos
00:20:14
Cuando yo creo un objeto nuevo
00:20:17
Paso siempre por dos puntos
00:20:21
¿Vale? Por dos partes
00:20:23
La primera parte es que creo su parte base
00:20:24
Su parte que hereda
00:20:27
¿Vale? Creo mi padre, sustancialmente
00:20:29
Y después añado la parte propia de esta clase
00:20:32
Esto pasa siempre
00:20:37
Hasta una clase que no extiende nada
00:20:38
Porque siempre crearé en el punto uno
00:20:40
Llamo al objeto, a object
00:20:43
Creo todo lo que está en el constructor de object
00:20:45
Y una vez que he creado el objeto
00:20:51
Que es la parte base
00:20:54
Creo todo lo que yo creo
00:20:55
Que he dicho que existe
00:20:57
En mi clase dispositivo
00:20:59
En mi clase persona
00:21:00
En mi clase lo que sea
00:21:01
Pero es siempre así
00:21:03
Si yo soy una clase que extiende otra clase
00:21:05
Pues este paso
00:21:12
Se vuelve, el paso uno se vuelve a rehacer
00:21:14
Por cada extensión que he hecho
00:21:16
O sea, alumno que extiende persona
00:21:18
Hará el primer paso con
00:21:21
Persona extiende object
00:21:24
Por lo tanto, creo object
00:21:26
Le añado lo que es persona
00:21:28
Y por lo tanto, he creado una persona
00:21:29
Y a este punto le añado lo que es
00:21:31
Alumno
00:21:33
¿Vale?
00:21:36
Una cosa de ese estilo aquí abajo
00:21:36
Si yo tengo alumno que hereda de persona
00:21:38
El paso uno de crear
00:21:43
El paso uno de crear alumno es
00:21:46
Crear la parte correspondiente a persona
00:21:49
Creo lo que yo extendo
00:21:52
Y para crear la persona
00:21:54
Tengo que crear object
00:21:56
Y después de haber creado object
00:21:58
Añadir las cosas de persona
00:22:02
Y entonces he creado la persona
00:22:04
Y paso al punto 2
00:22:07
Donde añado las cosas de alumno
00:22:08
Entonces siempre creo lo más general
00:22:11
Y luego voy añadiendo la parte más concreta
00:22:17
Y más específica de esta clase en concreto
00:22:21
Constructores y herencia
00:22:24
En el constructor de la clase de base
00:22:30
Se realiza siempre una llamada a constructor de la clase de base
00:22:33
Una llamada a constructor super se hace siempre
00:22:35
Solo que puede ser implícita o explícita
00:22:39
¿Vale?
00:22:42
Explícitamente lo puedo escribir yo
00:22:43
O implícitamente si no pongo nada
00:22:45
En automático lo hace él
00:22:47
¿Vale?
00:22:48
La llamada al constructor de la clase base
00:22:51
De la superclase
00:22:54
Es la primera acción que tiene que hacer el constructor
00:22:55
No puedo llamarla super
00:22:58
Hacer una suma y luego llamar super
00:22:59
¿Vale?
00:23:01
Lo tengo que llamar en la primera línea
00:23:02
Porque antes creo, digamos, el entorno donde me estoy moviendo
00:23:04
Mi superclase
00:23:07
Y lo haga para que ya haga otras cosas
00:23:08
¿Vale?
00:23:11
Y puede ser que esta llamada
00:23:13
Al super constructor
00:23:15
¿Vale? Constructor de super
00:23:17
Es o no lo indico específicamente
00:23:18
O lo indico específicamente
00:23:21
Que entonces es en la prima línea
00:23:23
¿Vale? Ejemplo
00:23:24
Si no lo indico específicamente
00:23:26
Fijaos aquí
00:23:28
Es donde él
00:23:29
A escondida
00:23:32
Invisiblemente hace una llamada
00:23:34
A super
00:23:37
Esto
00:23:38
El constructor por defecto
00:23:41
De mi padre
00:23:44
Cuidado, si yo el constructor por defecto
00:23:45
De mi padre se lo he quitado
00:23:47
Esto es flojo
00:23:49
Porque intenta llamar esto
00:23:51
Y esto no está
00:23:54
Y da un error
00:23:56
Probémoslo
00:23:57
Entonces, en el ejemplo que hemos hecho nosotros
00:23:59
Por ejemplo, pillamos móvil
00:24:06
¿Vale?
00:24:08
Móvil
00:24:09
Imaginémonos
00:24:10
A ver, el dispositivo
00:24:15
Tiene solo esto, ¿vale?
00:24:17
El dispositivo no tiene un
00:24:19
Un método así, un constructor así
00:24:22
Esto sería el constructor por defecto
00:24:26
¿Vale?
00:24:31
Si yo creo un constructor cualquiera
00:24:33
Como este de aquí
00:24:36
Pues el constructor sin parámetros desaparece
00:24:37
A menos que yo no lo vuelva a implementar
00:24:40
Explícitamente así
00:24:42
Y poniendo aquí lo que tiene que hacer
00:24:44
En el caso en que no me ponga los parámetros
00:24:46
¿Vale?
00:24:48
Imaginémonos que no está
00:24:50
Y que yo desde móvil
00:24:51
Intente hacer esto
00:24:54
Esto explota
00:24:56
¿Vale?
00:24:58
Porque no existe
00:25:01
Un constructor de dispositivos
00:25:02
Sin parámetros
00:25:05
Realmente
00:25:06
Esto también se enfada
00:25:08
Porque como aquí no estoy llamando nada
00:25:10
En este punto de aquí
00:25:14
Me está llamando él solo
00:25:16
Esta
00:25:18
Y como no está definida aquí
00:25:18
Pues entonces no lo tiene
00:25:22
Dice, no lo puede hacer
00:25:24
No se puede construir un móvil
00:25:25
Con este
00:25:27
Super constructor
00:25:30
Y como no puedo construir tu padre
00:25:31
No te puedo construir a ti
00:25:34
¿Se entiende?
00:25:35
¿Tienes dudas?
00:25:40
Entonces, y si yo quisiera utilizarlo, pues debería ir aquí
00:25:40
Y decirle, oye mira el dispositivo, tendrás también un constructor sin parámetros
00:25:48
Que dará como número serial un número vacío
00:25:56
Ahora ya tiene el constructor sin parámetros
00:25:59
Entonces esto puede llamar super sin parámetros
00:26:04
Así como puede llamar nada
00:26:07
¿Veis que ahora no me da error?
00:26:09
Porque lo que hará es por defecto
00:26:11
Llamar super sin parámetros
00:26:14
Tú das
00:26:16
¿Vale?
00:26:20
Esto es, si no indico explícitamente
00:26:23
Si no digo nada dentro de un constructor
00:26:25
Y hago cosas
00:26:28
Nosotros hemos hecho constructores
00:26:29
Hasta ahora
00:26:32
¿Sí? En las clases que hemos hecho nosotros
00:26:33
¿Habéis alguna vez utilizado super
00:26:36
Paréntesis, paréntesis?
00:26:38
No
00:26:41
Sin embargo, todas vuestras clases
00:26:41
Heredan de Object
00:26:44
Habrían tenido que hacerlo
00:26:46
¿Vale?
00:26:48
Pero él lo ha hecho por defecto
00:26:50
¿Está claro?
00:26:55
¿Sí?
00:26:57
Y como Object tiene un constructor
00:26:57
Sin parámetros, pues entonces funciona
00:27:00
Y si no
00:27:02
La segunda opción es
00:27:04
Ponerlo explícitamente
00:27:05
Llamo a este
00:27:07
Constructor
00:27:09
Y le puedo poner los parámetros
00:27:11
Para decirle de los constructores
00:27:13
Que pueda tener mi padre
00:27:15
Que puede tener, habéis visto string
00:27:16
Que tiene como 10, 15 constructores distintos
00:27:18
Voy a utilizar el que recibe
00:27:20
Un string, otro string
00:27:22
Y un número
00:27:24
Entonces
00:27:25
Constructores o no lo pongo
00:27:34
Entonces llamo por defecto super
00:27:37
Sin parámetros o si no indico
00:27:39
Especialmente en la primera línea
00:27:41
Del constructor
00:27:43
Que super constructor
00:27:44
Pido
00:27:47
Vale, uso
00:27:48
Hasta aquí, dudas
00:27:50
Esto de la herencia
00:27:56
Conlleva también
00:28:02
Dos
00:28:04
Conceptos más, dos cosillas
00:28:05
Que se puede hacer con la herencia
00:28:07
Que son los shadowing
00:28:09
Y el overriding
00:28:10
Esto es como
00:28:12
Se relacionan
00:28:15
Entre dos clases
00:28:17
Que una extiende a la otra
00:28:19
Entonces clase padre, clase hijo
00:28:20
La relación entre
00:28:22
Atributos
00:28:24
Y entremétodos
00:28:26
¿Vale?
00:28:27
Vamos a ver
00:28:30
¿Qué se puede hacer?
00:28:31
Un atributo, ¿vale?
00:28:32
En la clase hijo
00:28:35
Puede tener el mismo nombre
00:28:36
De la clase base
00:28:39
De la clase superclase
00:28:41
¿Vale?
00:28:43
Y hasta distinto tipo
00:28:44
¿Vale?
00:28:46
Mismo nombre, pero el tipo que te da la gana
00:28:47
O el mismo, o otro
00:28:50
Si tú haces así
00:28:51
Estás ocultando
00:28:53
Haciendo sombra
00:28:55
¿Vale? Shadowing
00:28:57
Al
00:28:58
Al atributo del padre
00:28:59
¿En qué sentido?
00:29:03
Pensad por ejemplo dispositivo
00:29:07
¿Vale? Dispositivo tiene
00:29:09
Esto por ejemplo, boolean encendido
00:29:11
¿Vale? Entonces cuando yo voy
00:29:15
A móvil, aquí
00:29:17
Está pensado que existe
00:29:19
Encendido como boolean
00:29:21
¿Y qué pasa si yo hago int encendido? Que el encendido del dispositivo como booleano sigue allí para los dispositivos, pero para los móviles encendido es un int.
00:29:22
Entonces ahora
00:29:45
Si yo tengo un móvil
00:29:48
Acceder al booleano
00:29:49
Es complejo
00:29:51
Lo estoy bloqueando
00:29:53
Lo estoy ocultando
00:29:55
Si yo soy un dispositivo
00:29:56
Seguiré
00:29:57
No, si yo soy un dispositivo
00:29:58
Y le digo
00:30:02
Donde está
00:30:03
Aquí de uno punto
00:30:05
Que era esto encendido
00:30:07
No puedo
00:30:09
Que no me
00:30:11
Ah, encendido
00:30:29
Ahora sí
00:30:32
Y punto encendido
00:30:33
Ten en cuenta que aquí
00:30:36
Le pasaré
00:30:42
Vale, vamos a ver
00:30:44
Y entonces cuando yo creo un móvil
00:30:46
Por ejemplo
00:30:48
A encendido
00:30:49
Le pongo cero
00:30:51
Vale
00:30:53
Entonces, ¿qué me escribirá esta cosa aquí?
00:30:54
Esta cosa aquí
00:30:59
¿Y qué me escribirá?
00:31:00
False
00:31:04
¿Y esta?
00:31:04
Cero
00:31:08
False y cero
00:31:09
¿Sí?
00:31:16
Entonces, esta cosa de aquí
00:31:20
De poder cambiar un
00:31:22
Un atributo
00:31:24
¿Vale? A otro atributo
00:31:26
Que sea hasta
00:31:29
De tipo distinto
00:31:30
Se llama Shadowing
00:31:31
Esencialmente lo que estoy haciendo es que desde un hijo
00:31:33
Impido a objetos de este hijo
00:31:36
O de los que están por debajo de este hijo
00:31:39
¿Vale?
00:31:42
Acceder al mismo
00:31:43
Atributo de un padre
00:31:45
¿Vale?
00:31:49
Porque le estoy haciendo sombra
00:31:49
¿Vale? Literalmente
00:31:51
Shadow
00:31:52
¿Para qué sirve?
00:31:53
Porque a lo mejor en determinados casos
00:31:55
Un valor que en general
00:31:57
Tiene un cierto sentido
00:31:59
Cuando paso a algo extendido
00:32:00
No lo quiero poder utilizar
00:32:03
Porque en la versión más
00:32:05
¿Cómo se dice esto?
00:32:07
Más específica
00:32:09
No tiene el mismo significado que la versión
00:32:10
Generalizada
00:32:13
¿Vale? Y entonces allí de alguna forma
00:32:15
Quiero bloquearlo
00:32:17
¿Vale? No es una cosa que yo haya visto
00:32:18
Muchas veces en mi carrera
00:32:21
¿Vale? Pero
00:32:23
Existe y se puede hacer
00:32:24
¿Sí?
00:32:26
Entonces este es shadowing
00:32:29
Que si no me equivoco aquí hay un ejemplo
00:32:31
¿Vale?
00:32:33
este de aquí por ejemplo
00:32:34
yo tengo la clase persona
00:32:36
la clase alumno que extiende persona
00:32:38
hay un nombre que
00:32:40
cuando es una persona el nombre
00:32:42
es un string y cuando
00:32:44
es un alumno el nombre es
00:32:46
su identificador
00:32:48
como alumno
00:32:50
cuando luego llego aquí en el main
00:32:51
y le digo que
00:32:54
escriba
00:32:56
el nombre de una persona me escribirá
00:32:57
el nombre de la persona cuando le digo
00:33:00
escríbeme el nombre del alumno
00:33:02
me escribirá el número
00:33:04
lo mismo que hemos hecho ahora
00:33:05
con dispositivo y cosas parecidas
00:33:08
entonces no se puede hacer con el super
00:33:09
de acceder a esa
00:33:16
variable
00:33:19
al booleano
00:33:21
al booleano
00:33:24
con el super a prior
00:33:25
no deberías acceder al del padre
00:33:27
vamos a ver
00:33:29
porque creo que después lo digo
00:33:31
podemos acceder a variables de la subclase
00:33:34
o de la superclase utilizando this o super
00:33:35
O sea que yo
00:33:37
Si desde el móvil
00:33:39
No uso encendido
00:33:41
Dis.encendido
00:33:43
Si no uso super.encendido
00:33:45
Entonces estoy accediendo
00:33:48
Al encendido de mi padre
00:33:49
Entonces ahí volverá a ser bueno
00:33:50
Es esto
00:33:52
Con calma
00:34:00
Llegamos
00:34:02
Es que si no complicamos la cosa
00:34:03
Entonces hay esta posibilidad
00:34:06
Lo shadowing
00:34:08
De ocultar a nivel de hijo un parámetro, un atributo que está en mi padre
00:34:09
Entonces la idea es, una vez ocultado no puedo acceder a ello
00:34:18
Pues sí, hay formas de hacerlo
00:34:22
Entonces, si definimos en una subclase un atributo del mismo nombre
00:34:24
El mismo tipo o tipo distinto que la superclase
00:34:31
La de la superclase queda oculta
00:34:35
Hasta aquí hemos llegado
00:34:37
Para acceder a la subclase o la superclase
00:34:38
Puedo utilizar dice super
00:34:42
¿Qué quiere decir esto?
00:34:44
Si yo desde aquí uso encendido
00:34:46
En cualquier lado, como aquí por ejemplo
00:34:51
Pues claramente estoy escribiendo mi encendido
00:34:54
Si en algún lado
00:34:58
Esto ahora ya no es un booleano, ¿vale?
00:35:00
Entonces le tengo que poner así por ejemplo
00:35:03
Si yo aquí quisiera en algún lado escribir mi padre
00:35:05
Por ejemplo, podría crear un método
00:35:12
¿Vale?
00:35:14
Donde quiero escribir los dos valores
00:35:23
¿Vale?
00:35:27
Entonces
00:35:30
Mi encendido
00:35:31
No, encendido móvil
00:35:33
Móvil encendido
00:35:35
Y aquí escribiría
00:35:36
This.encendido
00:35:40
¿Vale?
00:35:43
Y si en vez quiero
00:35:45
acceder al de mi padre
00:35:47
puedo acceder a él
00:35:49
como supe
00:35:55
punto excelido
00:35:56
entonces si desde aquí
00:35:59
en algún lado
00:36:04
llamo a
00:36:05
m1.test al final
00:36:08
m1.test
00:36:10
veis que
00:36:12
para el móvil
00:36:19
encendido es un cero
00:36:21
pero para dispositivo encendido es falso
00:36:22
tened en cuenta que lo estoy
00:36:26
llamando desde los dos desde móvil es este método de aquí a tener en cuenta
00:36:27
que son dos variables distintas no es que 0 corresponde a falsa
00:36:36
si yo cambio 0 a 35 pues el de mi padre se queda falsa son dos variables
00:36:40
distintas guardadas en sitios distintos
00:36:45
Pero es más, ¿vale?
00:36:51
Porque esto yo lo puedo hacer desde el móvil
00:36:54
Pero si estuviera aquí
00:36:58
No tengo súper
00:37:00
En esta prueba no tengo súper para acceder al padre del móvil
00:37:03
Entonces, o el móvil me proporciona un método para que yo pueda acceder al súper
00:37:08
¿Vale?
00:37:15
O si no, no lo puedo acceder
00:37:16
O sí
00:37:19
Está esta otra cosa de aquí
00:37:21
¿Vale?
00:37:24
Imaginémonos
00:37:26
Una situación como esta
00:37:27
Tengo transporte
00:37:29
Transporte puede ser tren
00:37:32
O un vehículo
00:37:34
Y vehículo puede ser la moto o un coche
00:37:35
¿Vale?
00:37:38
Y yo tengo, estoy en coche
00:37:39
Creo, ¿vale?
00:37:41
Que es la clase hija
00:37:42
Fijaos que
00:37:44
Este
00:37:45
¿Cómo se llama?
00:37:48
A estos niveles
00:37:51
El mismo
00:37:52
La misma
00:37:53
¿Cómo se llama?
00:37:56
El mismo atributo se sobrescribe
00:37:57
Se está haciendo shadowing
00:37:59
Sin cambiarle de tipo
00:38:00
Pero se está haciendo
00:38:03
Para que a nivel de esto
00:38:05
Ponga ferraria
00:38:08
A nivel de esto ponga turismo
00:38:09
A nivel de esto ponga terrestre
00:38:10
Cuando yo pongo el nombre
00:38:12
Pues entonces
00:38:13
Si yo estoy en el coche
00:38:16
Y pongo nombre a secas
00:38:18
Estoy hablando de este nombre de aquí
00:38:21
Nombre a nivel de pollo
00:38:24
Si yo pongo dis.nombre
00:38:25
Sigo hablando de esto
00:38:29
De este objeto
00:38:31
Si yo pongo super.nombre
00:38:33
Estoy hablando
00:38:38
De mi padre
00:38:39
Nombre, por lo tanto esto
00:38:41
¿Si?
00:38:43
Y vosotros podéis, ah bueno
00:38:47
Antes de otro paso
00:38:49
Puedo hacer un casting explícito
00:38:50
Decir, pilla this
00:38:54
Soy yo, soy un coche
00:38:56
Considérame un vehículo
00:38:58
Y una vez que me has considerado un vehículo
00:39:01
Haces a mi nombre
00:39:05
Entonces si a mí me considero un vehículo
00:39:06
Yo soy un vehículo, un coche es un vehículo
00:39:08
Pero ahora estaré aquí
00:39:10
Y entonces me escribí esto
00:39:12
Lo que no se hace bajo ningún concepto es esto
00:39:14
Super super no
00:39:21
Tampoco ultra
00:39:23
No se puede llamar dos veces super
00:39:25
Esto está mal
00:39:29
Y como hago esto
00:39:30
Pues con esta misma forma aquí
00:39:31
En vez de hacerme un casting
00:39:33
A vehículo
00:39:35
Hago un cast a transporte
00:39:36
Digo
00:39:40
Este es un objeto coche
00:39:41
Que es un vehículo que es un transporte
00:39:42
Por lo tanto yo también soy un transporte
00:39:44
Ahora considerame como si fuera un transporte
00:39:46
Y accede al nombre
00:39:48
Pues entonces es este
00:39:50
¿Los paréntesis sí o sí hay que ponerlos?
00:39:51
No valdría solo tres paréntesis de transporte
00:39:58
Transporte tipo
00:40:00
Yo lo pondría por claridad
00:40:01
Porque si tú no los pones
00:40:03
Esto de transporte podría ser que dis.nombre
00:40:05
Lo que sea
00:40:08
Lo que sea el resultado de dis.nombre
00:40:09
Tráctamelo como un transporte
00:40:11
Dis.nombre es un string
00:40:13
Entonces no te puede hacer un casting de un string a un transporte
00:40:14
Entonces sería cual
00:40:17
Esto es por preferencia de operadores
00:40:18
Para que sea claro que este transporte
00:40:23
Se aplica a TIS
00:40:25
Pues entonces tú pones que pilla lo que tú dices
00:40:26
Considera un transporte
00:40:29
Y ahora cede a su punto
00:40:31
¿Cómo sería en nuestro caso?
00:40:32
Vamos a probarlo
00:40:36
Entonces nosotros
00:40:37
Borro un poco de esto
00:40:42
Dejo los móviles
00:40:44
Entonces
00:40:49
ahora nosotros estamos así hemos creado un dispositivo y un móvil si yo hago no
00:40:50
me quiere escribir si yo ahora digo a nivel de móvil vale y le digo m1 punto encendido
00:41:06
él me escribe móvil y si ahora le digo oye sí pero escríbeme esto pero a m1 considera
00:41:23
melo un dispositivo y m1 trátalo como un dispositivo asume que es un dispositivo
00:41:42
Y acceda a encendido
00:41:57
¿Qué me pone?
00:41:59
¿Make sense?
00:42:08
Entonces
00:42:12
La idea es que puedo acceder
00:42:13
A varios, puedo hacer lo que me da la gana
00:42:17
Con estas cosas, ¿vale?
00:42:19
La idea es que existe
00:42:21
Este mecanismo, que es el
00:42:23
Shadowing, donde sostancialmente
00:42:25
Puedo un atributo
00:42:27
De otro
00:42:29
De mi clase padre
00:42:30
Ocultarlo de alguna forma
00:42:33
Impedir que se acceda directamente
00:42:34
Esto no quiere decir que no puedo luego recuperar esa cosa
00:42:36
Pero puede ser que este mismo valor, este mismo encendido
00:42:40
Para un móvil tenga un valor y para un dispositivo tenga un valor
00:42:45
Y yo normalmente cuando uso móvil, si lo uso encendido lo utilizo como móvil
00:42:50
En un particular caso en el que ahora necesito utilizarlo como si fuera un dispositivo
00:42:54
Pues siempre puedo acceder a él a través de un casting explícito
00:43:00
Diciéndole, oye, mira, esta cosa aquí
00:43:03
No me la trates como móvil, me la trato como dispositivo
00:43:05
Como existe
00:43:08
Una herencia y una relación
00:43:10
De es un
00:43:12
Pues entonces me funciona
00:43:13
Vale
00:43:15
Y
00:43:20
Última cosa
00:43:21
Lo mismo en un cierto sentido
00:43:24
Pero con los métodos
00:43:28
¿Vale?
00:43:31
Esto es lo que hemos hecho antes
00:43:32
Cuando hemos puesto
00:43:34
El toString
00:43:35
O cuando hemos puesto el
00:43:38
Como me acuerdo me se llama
00:43:39
Describe, en vez de describe móvil
00:43:42
Con describe son
00:43:44
Es decir, que yo puedo reescribir
00:43:45
Métodos
00:43:48
¿Vale?
00:43:50
Esto es más importante que el otro
00:43:52
Es más interesante
00:43:54
La idea es que yo puedo tener
00:43:55
Subclases
00:43:57
Que cuando hacen un método
00:43:59
Que normalmente tiene también la superclase
00:44:01
Pues hagan
00:44:04
Algo más
00:44:06
de lo que hace la clase genérica
00:44:07
¿vale? por ejemplo
00:44:09
un dispositivo no tiene un número de teléfono
00:44:11
si yo te digo, descríbete
00:44:13
a un dispositivo
00:44:15
él no me puede decir que número de teléfono tiene
00:44:17
porque un ordenador no tiene un número de teléfono
00:44:19
por ejemplo, ahora un móvil
00:44:21
cuando le digo descríbete
00:44:24
sí que tiene el número
00:44:25
de teléfono, entonces estaría bien
00:44:27
que dijera, oye, este es mi número de teléfono
00:44:29
¿vale? para hacer eso
00:44:32
nosotros
00:44:34
en el ejemplo que habíamos hecho
00:44:35
habíamos creado
00:44:37
dos métodos distintos
00:44:39
habíamos creado el método estado
00:44:41
y había creado el método
00:44:43
estado móvil
00:44:46
¿vale? entonces no me puedo equivocar
00:44:47
¿sí?
00:44:50
pero el problema de esto es que para saber
00:44:51
que método utilizar tengo que saber en que clase
00:44:53
estoy
00:44:56
si es un móvil que hemos estado móvil, si es un dispositivo
00:44:56
que hemos estado
00:44:59
¿vale? y esto
00:45:00
Es un problema
00:45:02
¿Cuándo es un problema?
00:45:04
Vamos a hacer un ejemplo
00:45:06
Creamos un array de dispositivos
00:45:07
Dispositivo
00:45:11
Es igual a
00:45:12
New
00:45:18
Dispositivo
00:45:19
De 3
00:45:22
¿Vale?
00:45:25
Array de dispositivos
00:45:28
En dispositivo
00:45:29
De 0
00:45:32
Pongo un nuevo dispositivo
00:45:34
En dispositivo de uno
00:45:37
Pongo un nuevo móvil
00:45:50
Me da error
00:45:52
No
00:46:06
¿Por qué?
00:46:07
Porque un móvil es un dispositivo
00:46:09
Entonces puede estar en una red de dispositivos
00:46:11
Y finalmente
00:46:13
Esto no me sirve
00:46:16
Dejo dos
00:46:19
Vale
00:46:20
La cosa interesante aquí es que
00:46:21
Yo tengo una red de dispositivos
00:46:24
Vale, ahora quiero que los dispositivos se presenten
00:46:26
Entonces hago for
00:46:29
Int i es igual a cero
00:46:31
i es menor que
00:46:33
Disp.length
00:46:35
i más más
00:46:38
Disp de i
00:46:40
Punto
00:46:46
Queda esto
00:46:51
Estado
00:46:54
Esto funciona
00:46:56
Aparte que aquí me he cargado algo
00:47:01
Veamos un momento
00:47:13
El
00:47:18
Esto
00:47:19
Desnúmero
00:47:20
NS
00:47:24
Super
00:47:24
NS
00:47:26
Aquí
00:47:28
Vale
00:47:31
Entonces, aquí
00:47:32
Ahora, dispositivo
00:47:34
Si os fijáis, esto está funcionando
00:47:36
Pero me trata el móvil
00:47:39
Como si fuera un dispositivo
00:47:41
No como si fuera un móvil
00:47:44
¿Vale?
00:47:46
Lo que no puede hacer
00:47:47
A ver, ¿dónde está?
00:47:49
Es decirle
00:47:52
Usa estado móvil
00:47:53
Esto se enfada
00:47:54
¿Vale?
00:47:56
Porque lo que me está diciendo es
00:47:58
En
00:48:00
Estado móvil no está definido
00:48:02
En dispositivo
00:48:06
Porque eso está definido en móvil
00:48:08
¿Vale? Podría entonces decirle
00:48:10
Vale, pero tú tráctamelo como móvil
00:48:13
Claro
00:48:14
Pilla este elemento de aquí
00:48:24
El objeto que te da en esta posición
00:48:27
Tráctamelo como móvil
00:48:29
Y ahora llama estado móvil
00:48:31
Vale, fenomenal
00:48:32
Boom
00:48:34
¿Vale?
00:48:36
Class dispositivos
00:48:38
Cannot be cast to class móvil
00:48:42
Dispositivo no se puede
00:48:45
Tratar como móvil
00:48:47
Es un móvil que se puede tratar como un dispositivo
00:48:48
Si
00:48:51
Entonces como puede hacer
00:48:53
Para que
00:48:56
Este señor de aquí
00:48:57
Me funcione
00:49:00
En el sentido que
00:49:01
Yo tengo una red de dispositivos
00:49:04
Pero que si tengo
00:49:06
Un dispositivo
00:49:08
me use el estado
00:49:09
del dispositivo
00:49:11
y si en vez es un móvil, me use
00:49:13
el móvil
00:49:15
y esto se logra
00:49:16
diciendo, vale, aquí en vez de
00:49:19
crearme un método propio
00:49:21
del móvil
00:49:23
sobre escribo
00:49:25
el
00:49:27
método de mi padre
00:49:31
entonces, ahora no hay estado
00:49:32
estado móvil, estado ordenador, estado no sé qué
00:49:35
hay estado
00:49:38
Cada hijo
00:49:39
Sobrascriberá
00:49:41
El funcionamiento del padre
00:49:43
Pero poniendo las cosas
00:49:45
Importantes de esta nueva clase
00:49:47
Como por ejemplo aquí ahora te digo
00:49:50
Que soy un móvil
00:49:51
En automático
00:49:52
Java
00:49:55
Cuando se llama
00:49:56
Sobre un determinado objeto
00:50:02
Utilizará el estado
00:50:04
Del objeto
00:50:06
De la instancia que es el objeto
00:50:09
Si el objeto que he metido allí es un dispositivo, usará el estado del dispositivo
00:50:11
Y si el objeto que he puesto allí es un móvil, usará el debo
00:50:16
Esto ha usado dispositivo porque disuno es un dispositivo
00:50:22
Y esto ha llamado móvil porque es un móvil
00:50:33
Y esto me abre un mundo
00:50:37
Simplemente lo he sobre escrito
00:50:42
A mí en este momento me interesa el concepto de sobreescribir el método
00:50:47
No tanto esta cosa de aquí
00:50:54
Esto se llama polimorfismo, lo veremos con más detalle un poquito más adelante
00:50:58
Es un ejemplo de por qué esto me puede servir
00:51:02
A mí lo que me interesa por ahora es la parte de sobreescribir
00:51:05
Yo puedo pillar un método de mi padre
00:51:12
Veis que es el mismo método
00:51:14
Idéntico a este de aquí
00:51:16
Mismo método
00:51:17
Y decirle, ahora
00:51:19
Este método de aquí no hace
00:51:21
Esto
00:51:24
Pero hace otra cosa
00:51:25
Se tiene que llamar igual
00:51:27
Porque lo estoy sobre escribiendo
00:51:31
Es como el método toString
00:51:32
El método toString representa
00:51:35
Una versión
00:51:37
Textual de mi objeto
00:51:38
Tú tienes el método toString
00:51:41
En object, que te da ese código raro
00:51:43
Si yo en vez de ese código raro
00:51:45
Cuando quieres imprimir mi objeto
00:51:47
Quiero algo que sea más parecido a mi objeto
00:51:49
Con los datos de mi objeto
00:51:51
Pues de todo lo que hago es sobre escribir el toString
00:51:52
Entonces cada vez que se utilizará el toString
00:51:55
Pues utilizará el mío, no el de object
00:51:57
Lo mismo con el equals
00:51:59
String
00:52:02
Cuando hago string1
00:52:03
Cuando hago algo como
00:52:06
Esto.equals
00:52:07
A esto
00:52:10
Este equals de aquí
00:52:14
Es una sobrescriptura
00:52:20
Del equals
00:52:23
Que está en object
00:52:25
¿Vale?
00:52:26
El de object hace una cosa
00:52:28
El de string hace otra cosa
00:52:30
El de object compara entre ellos
00:52:32
Dos objetos, en particular
00:52:34
Compara ese código que hemos visto
00:52:36
Que sea el mismo código
00:52:39
¿Vale?
00:52:41
Sin embargo, equals lo que hace es
00:52:42
Comparar que esta
00:52:44
Esta secuencia de caracteres
00:52:46
Es igual a esta secuencia de caracteres
00:52:48
Dentro string
00:52:51
No sé si me entendéis lo que quiero decir
00:52:52
Yo puedo pillar dispositivos
00:52:53
Y sobre escribir equals
00:52:56
Para que yo pueda luego preguntarme
00:53:00
Si dos dispositivos son el mismo dispositivo
00:53:03
¿Sí?
00:53:05
Es una buenísima
00:53:17
Demanda
00:53:19
Imaginaos que yo tenga un dispositivo
00:53:19
¿Vale?
00:53:25
Que es el dispositivo A
00:53:27
Apagado
00:53:28
El equals
00:53:31
De object
00:53:36
Me da true
00:53:39
Solo si esto
00:53:41
Y esto
00:53:43
Son exactamente
00:53:44
El mismo objeto
00:53:47
Efectivamente
00:53:48
Si no se que punto equals
00:53:52
No se cuanto
00:53:55
No se que y no se cuanto
00:53:56
Apuntan al mismo objeto real
00:53:58
Pues para object
00:54:01
Estos son los mismos
00:54:03
Sin embargo, por ejemplo en string
00:54:04
Yo tengo string gato
00:54:09
Y otra variable
00:54:11
Que dice gato
00:54:14
Y cuando hago equals
00:54:16
No está usando el equals de object
00:54:20
Porque si no me daría true
00:54:22
Solo cuando yo lo uso sobre el mismo objeto
00:54:24
En vez de yo estoy poniendo
00:54:27
Aquí, este objeto de aquí
00:54:29
Por ejemplo
00:54:31
Y aquí, este otro objeto de aquí
00:54:32
Son dos objetos distintos
00:54:34
Entonces la implementación de Equals en String
00:54:36
No puede ser la misma que Equals en Object
00:54:41
Contain Equals
00:54:44
Contiene
00:54:55
No lo sé, había que ver
00:54:57
Entonces, ¿qué pasa si yo me quiero hacer un Equals en dispositivo?
00:55:01
O sea, que aquí yo tengo el dispositivo 1
00:55:08
Y aquí un dispositivo 2
00:55:10
¿Cómo se implementa
00:55:13
Equals entre dispositivos?
00:55:16
Pues lo tengo que
00:55:18
Decidir yo
00:55:19
¿Vale? Soy yo que implemento este equals
00:55:21
Y yo tengo que decir cuando dos
00:55:24
Objetos equals, cuando esto está aquí
00:55:26
Y esto está aquí
00:55:28
¿Cuándo este método me da true?
00:55:29
¿Y cuándo este método me da false?
00:55:32
Por ejemplo, como nosotros
00:55:35
Tenemos un número serial, el número serial
00:55:36
Debería ser único, podría decir
00:55:38
Que cuando el número serial
00:55:40
Es el mismo, entonces devuelve true
00:55:41
Y cuando el número serial es distinto
00:55:44
Devuelve false, independientemente
00:55:46
De si está encendido o no, independientemente
00:55:48
De donde está guardado en memoria
00:55:50
¿Sí?
00:55:51
Pero esto quizás
00:55:55
Un poquito más, más en futuro
00:55:56
¿Vale?
00:55:58
Yo creo que me faltan
00:56:00
No, falta más de lo que pensaba
00:56:02
¿Vale?
00:56:04
Entonces
00:56:06
Entonces, el concepto de overriding o sobreescriptura es esta cosa aquí, ¿vale? De una clase hija puede sobreescribir un método de una clase padre, ¿vale? Para que haga una cosa distinta, una cosa posiblemente más específica para la clase hija.
00:56:06
A lo mejor el método que usa el padre es demasiado genérico, el método que usa el hijo es mucho más específico para ese hijo.
00:56:29
Haremos ejemplos en los próximos días.
00:56:39
También, como pasaba antes, puedo utilizar mi método, el método de este objeto, o puedo utilizar el objeto de mi padre.
00:56:44
O sea, el método de mi padre
00:56:55
¿Vale? Utilizando thisEsSuper
00:56:57
Puedo seguir utilizando la versión mía
00:56:59
O la versión de mi padre
00:57:02
O puedo utilizar dentro de la versión mía
00:57:03
La versión de mi padre
00:57:06
¿Vale? Por ejemplo
00:57:07
Como esto
00:57:09
Bueno, bueno
00:57:11
¿Os acordáis que la versión del padre
00:57:12
Escribía o esto o esto?
00:57:16
Pues yo el mismo método
00:57:18
O muy parecido lo podría hacer así
00:57:20
Escribe sin el n
00:57:22
El móvil
00:57:32
Y luego después
00:57:33
Super punto estado
00:57:37
¿Vale?
00:57:39
Si os fijáis, aquí la cosa sería
00:57:46
Vale, escribe siempre el móvil delante
00:57:49
Y después
00:57:51
Vas a llamar el método de mi padre
00:57:52
El método de mi padre
00:57:55
Este de aquí
00:57:56
Si está encendido, me escribirá detrás
00:57:58
El móvil con número serial
00:58:00
Está encendido, o si no, el número serial
00:58:02
Está apagado, por lo tanto
00:58:04
Me hace lo mismo
00:58:06
Vamos a ver si es verdad
00:58:07
Lo único es que
00:58:09
Este código de aquí
00:58:16
No he tenido que volver a escribirlo
00:58:18
Lo he reutilizado
00:58:21
Entonces, esto es más
00:58:23
Haber entendido el Diesel Super
00:58:34
¿Vale? Cada vez que uso Super
00:58:36
estoy hablando de la clase padre
00:58:38
cada vez que uso this estoy hablando de la clase
00:58:40
en la que estoy
00:58:42
entonces el super se puede utilizar
00:58:43
tanto para llamar
00:58:47
métodos como aquí
00:58:48
como para llamar constructores
00:58:50
vale
00:58:52
entonces
00:58:54
esto es el que dice
00:58:55
este es un ejemplo de overriding
00:58:58
entonces la clase persona
00:59:00
cuando imprime dice persona
00:59:05
es un hombre, la clase alumno
00:59:07
Que está en de persona, dice que es un alumno
00:59:09
Y cuando lo teste
00:59:11
Los dos escriben imprimir
00:59:12
Pero
00:59:15
El
00:59:16
Espera, no, ambas
00:59:17
¿Por qué ambas?
00:59:22
Porque personaP es igual a
00:59:25
Ah, sí, vale, sí, sí
00:59:26
Porque aquí he hecho
00:59:28
Cuando he hecho personaP igual a
00:59:30
Vale
00:59:33
Sostancialmente estoy utilizando
00:59:33
Una variable persona, pero la instancia
00:59:36
Que tengo dentro no es una persona
00:59:38
Es un alumno, porque ha hecho new alumno
00:59:40
Entonces acordaos que
00:59:43
No me baso sobre el tipo
00:59:46
De la variable, sino sobre el tipo
00:59:49
De la instancia a la que apunta
00:59:51
Y más o menos este es el resumen
00:59:53
Mañana hacemos un resumen
01:00:01
De todo esto, vale
01:00:03
Y queda esta cosa de aquí
01:00:04
¿Qué es lo que me preguntaba alguien de vosotros?
01:00:10
Que es el instance of
01:00:13
¿Vale?
01:00:14
El instance of es un operador que me dice
01:00:14
Si un cierto objeto es una instancia de una cierta clase
01:00:17
Se usa, por ejemplo, así
01:00:22
¿Vale?
01:00:24
Entonces, pensad que yo he creado un gato
01:00:27
¿Vale?
01:00:31
Aquí están las clases
01:00:33
Hay la clase animal
01:00:35
La clase gato que está en animal
01:00:36
Y la clase perro que está en animal
01:00:38
¿Vale?
01:00:40
Entonces, si yo me pregunto
01:00:41
La variable gato, que es un gato
01:00:43
¿Es una instancia de animal?
01:00:48
Esto me devuelve true
01:00:51
¿Vale?
01:00:52
Gato es una instancia de animal
01:00:54
Porque gato es un animal
01:00:56
Gato es una instancia de gato
01:00:58
También true
01:01:00
¿Vale?
01:01:02
Ahora, si yo intento gato en instancia de perro
01:01:04
Se enfada
01:01:06
Porque perro y gato no tienen nada que ver entre ellos
01:01:07
Entonces no va a funcionar
01:01:10
Esto me puede servir
01:01:12
Para lo que estábamos viendo antes
01:01:14
De yo voy buscando
01:01:16
En mi array
01:01:19
Y cada elemento que pillo
01:01:19
Hago un if de si esto es
01:01:22
Una instancia de móvil
01:01:24
Entonces utiliza lo que es de móvil
01:01:26
O castea la móvil
01:01:28
Si en vez no es una instancia de móvil
01:01:29
Pues no lo hagas
01:01:32
Mañana lo intentamos más.
01:01:33
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 6
- Fecha:
- 24 de enero de 2023 - 14:13
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 1h′ 01′ 44″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 516.30 MBytes