Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 5-02-24 - 1 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Entonces, esta clase cliente de tienda, por el hecho de heredar de cliente, simplemente por poner el extensa ahí, solo por eso, esta clase tiene no solo la propiedad dirección que hemos escrito ahí, sino que tiene las que están en la clase de la querida.
00:00:00
Estas dos, ¿vale? Y además tiene los get, los set, todos los métodos, ¿vale? Ahí está todo, ¿vale?
00:00:21
Bueno, pues esto lo hace muy cómodo, lo hace muy cómodo y vimos la comodidad de hacer esto cuando ahora ya hacíamos una aplicación que gestionaba diferentes tipos de clientes.
00:00:38
Aquí vimos la comodidad.
00:00:48
Nos, primero vimos.
00:00:50
¿Cómo se hace lo de la herencia?
00:00:52
Pues haces el extensa y lo que hay arriba lo tienes abajo, ¿vale?
00:00:53
Aquí ya hay matices que hay que meter.
00:00:57
¿Recordáis cuando vimos los modificadores de acceso que dije?
00:01:00
En realidad, tú puedes poner el private, el public, no poner nada, que no poner nada es como poner un omitido que se llama package, que significa desde el mismo paquete.
00:01:03
O el protected, y el protected dije este, nos olvidamos de él porque tiene que ver con la herencia.
00:01:14
Bueno, pues ya lo incorporaremos.
00:01:19
Vale.
00:01:22
Bueno, pues entonces nosotros lo que hemos visto es cómo heredar el extensa, las implicaciones que eso tiene.
00:01:24
Y en este ejemplito vimos que eso luego nos da ventajas, que eso nos da ventajas ahora de gestionar las cosas.
00:01:29
Nuestro main, nuestro main de aquí, ahora ya tenía un único almacén de datos, ya está.
00:01:36
Tenía solamente objetos de la clase cliente.
00:01:44
Y entonces, cuando un almacén de datos.
00:01:48
Una variable está declarada de este tipo, está declarada de este tipo, significa que puede recibir objetos de ese tipo o de cualquiera de los herederos.
00:01:51
Caben todos ahí, caben todos en esa referencia, eso es lo que significa.
00:02:02
Y ahí, esa es la ventaja, esa es la ventaja, se hace todo esto de la herencia, se hace por eso, para que en una referencia declarada de una clase puedan caer objetos de esa clase, pero también de todas las que heredan.
00:02:07
¿Vale?
00:02:20
Vamos a, lo vimos en la aplicación esta, vimos cómo yo aquí me hacía un array de clientes, pero luego en este array metía, en este array yo luego metía el que me daba la gana.
00:02:21
O metía uno de tipo cliente tienda, o metía uno de tipo cliente online, ¿vale?
00:02:39
Metíamos cualquiera de ellos, porque cabían en esa referencia, ¿vale?
00:02:45
Vamos a dejar esto más claro, ¿vale?
00:02:51
Aquí en un proyectito aparte, para que quede claro todos los matices.
00:02:59
Lo voy a llamar ejemplo básico herencia, porque es solamente para recoger los detalles de la herencia y de cómo funcionan.
00:03:12
aquí por ejemplo
00:03:21
como yo he creado el proyecto así rápidamente
00:03:29
lo digo para que estas cosas
00:03:31
os pasen y yo no tengo desmarcada
00:03:33
la casilla de generar
00:03:35
el módulo e-info, pues me ha generado
00:03:37
el módulo e-info, recordad
00:03:39
que si el archivo
00:03:41
tiene ese fichero
00:03:43
entonces es obligatorio trabajar con paquetes
00:03:44
porque si no
00:03:47
trabajas con paquetes, luego
00:03:49
la máquina virtual no va a encontrar las rutas
00:03:50
porque el módulo e-info
00:03:53
incorpora un mecanismo adicional
00:03:55
para
00:03:57
encontrar los paquetes
00:03:58
bueno, de alguna manera es una especie
00:04:01
de mecanismo que se introdujo desde Java 10
00:04:03
para organizar los paquetes
00:04:05
entonces, si tú incorporas ese fichero
00:04:07
deberías
00:04:09
incorporar en él información sobre
00:04:11
tus paquetes, y si tienes uno por defecto
00:04:13
pues entonces, si no lo dices
00:04:16
ahí, no te va a funcionar la aplicación
00:04:17
conclusión
00:04:19
como no estamos en eso y no os da igual
00:04:20
nos volváis locos
00:04:22
con esas cosas si os pasan
00:04:25
que generáis un proyecto, tiene este fichero
00:04:26
luego lo ejecutáis y dice
00:04:28
no encuentra el main, no encuentra el main
00:04:30
claro, porque no estás trabajando con paquetes
00:04:32
estás trabajando el paquete por defecto
00:04:35
si estás trabajando el paquete por defecto
00:04:37
tienes que reflejarlo en el módulo e-info, etc, etc
00:04:38
entonces no estamos en eso
00:04:41
así que
00:04:43
lo digo por, bueno
00:04:44
para que no perdáis tiempo en errores
00:04:47
de estos que hay veces que se hay una y otra vez
00:04:49
y son de chorradas de este estilo
00:04:50
vale, bueno, yo en cualquier caso voy a hacer un paquete
00:04:52
aunque no tenga el módulo e-info
00:04:55
porque siempre es buena idea ya acostumbrarse
00:04:56
a organizar uno, sus proyectos
00:04:58
sus aplicaciones en paquetes
00:05:01
donde se guarden clases
00:05:02
que significan cosas diferentes
00:05:05
pero vamos, esto como es un ejemplito
00:05:07
básico para ver lo de la herencia
00:05:09
pues va a ser una chorrada
00:05:10
vale, pues venga, vamos a ver
00:05:12
yo tengo aquí
00:05:17
mi paquete de
00:05:19
paquete, ahí
00:05:20
vale, pues tengo aquí mi paquete
00:05:33
de modelo para las entidades
00:05:37
voy a hacer una entidad cualquiera
00:05:39
de la que luego vamos a heredar
00:05:41
vale
00:05:43
por ejemplo, vamos a
00:05:44
hacer
00:05:47
una clase
00:05:49
vale, de
00:05:50
lo típico
00:05:52
que es como mejor se entiende, animal
00:05:55
venga
00:05:57
una aplicación que gestiona animales
00:05:58
pues entonces
00:06:01
uno aquí
00:06:02
las propiedades genéricas de un animal
00:06:03
las que aplican a todos
00:06:07
pues imaginaos que
00:06:09
bueno, el nombre
00:06:11
el nombre que recibe
00:06:12
vale
00:06:13
André Sile
00:06:20
si le hacemos un constructor
00:06:25
vale, entonces, vamos a escribir disculpas
00:06:29
el nombre de una planta
00:06:30
que lo escribo
00:06:31
para que creamos
00:06:31
una planificación
00:06:33
entonces, vamos a escribir
00:06:33
el nombre de un animal
00:06:35
vale, entonces, vamos a escribir
00:06:36
una planta
00:06:37
y la explicamos
00:06:39
por ejemplo, por ejemplo
00:06:40
una cosa que no se sabe
00:06:42
por ejemplo, para hacer
00:06:43
una pesadilla
00:06:44
o para hacer
00:06:45
un telet Sadly
00:06:46
como yo lo digo
00:06:48
donde voy a ponerlos
00:06:48
vamos a ponerlos en la descripción
00:06:49
en este caso un oso
00:06:49
vale, ahora
00:06:51
hay ejemplos de animales en concreto
00:06:55
vale, pues está el gato, está el perro, está el no sé qué
00:07:01
entonces ahí tendría sentido que mi aplicación recoja además
00:07:03
una clase gato para los animales que además sean gato
00:07:07
o una clase pez para los animales que a su vez sean pez
00:07:10
por ejemplo, pues entonces serían dos clases separadas
00:07:16
vale, entonces tanto pez como perro
00:07:19
como son animales, tienen nombre también
00:07:41
porque hemos decidido que todos los animales tienen su nombre
00:07:43
todo esto son decisiones que uno toma en la fase de diseño
00:07:46
hemos decidido que todos los animales tienen su nombre
00:07:49
hemos decidido que todos los animales van a tener nombre
00:07:49
por eso lo pongo en la clase animal
00:07:51
y ahora pez y perro aparte de su nombre
00:07:53
tendrán sus propias propiedades
00:07:56
entonces si realmente yo he decidido
00:07:58
cuando he descrito mi situación
00:08:00
que pez y perro sean animales
00:08:02
porque lo he decidido que lo son
00:08:04
y tiene sentido que lo sean
00:08:06
pues entonces tendremos que incorporar aquí el extends
00:08:07
vale
00:08:11
vale
00:08:19
vale, pues nada
00:08:33
ahora decidimos que propiedades les añadimos a cada uno de ellos
00:08:40
pues venga, que caracterizaría a un pez
00:08:45
que no tiene sentido que caracterice a un pez
00:08:48
que no tiene sentido que caracterice a todos los animales del universo
00:08:49
que solo lo caracteriza a ellos
00:08:52
solamente
00:08:54
el tipo de blanquia por ejemplo
00:08:55
bueno no, el acuífero en el que viven
00:09:00
por ejemplo, el acuífero
00:09:03
¿no? un perro no vive en un acuífero
00:09:05
el acuífero
00:09:08
o sea, aquí iría solo lo que caracteriza
00:09:11
al pez
00:09:17
eso no tiene sentido que vaya en animal
00:09:19
esto va aquí
00:09:20
vale
00:09:22
entonces si no hubiéramos hecho el extends
00:09:23
además tendríamos que poner ahí el nombre
00:09:26
no tenemos que ponérselo porque
00:09:28
pez ya hereda de animal
00:09:30
vale
00:09:31
¿y qué caracteriza a un perro que no caracterice
00:09:34
al resto de los animales?
00:09:36
¿qué es propio suyo?
00:09:39
cualquier chorrada
00:09:43
raza
00:09:44
vale, porque podría tener sentido
00:09:46
que uno no quiera poner en un perro
00:09:48
o raza, o sea, perdón, en un pez
00:09:49
normalmente tú no distingues los pez por raza
00:09:51
en todo caso por especie, ¿no?
00:09:53
la raza quieres que esté solo en el
00:09:55
cara a cara, te dice solo al perro
00:09:57
vale, pues ya está
00:09:59
vale, entonces
00:10:00
vale, pues nada
00:10:04
le ponemos el constructor
00:10:11
y
00:10:19
get y set de cada uno
00:10:33
constructor
00:10:42
general, vale
00:10:42
y aquí me falta el get y el set
00:10:43
vale
00:10:48
lo del get y el set es por hábito
00:10:49
porque las clases entidad
00:10:53
lo habitual es que las manejemos
00:10:54
a través de get y set, repito
00:10:59
vale
00:11:00
bueno, pues hala, yo aquí tengo un modelo muy sencillo
00:11:01
ya está, un modelo muy sencillo
00:11:05
la clase, super clase animal y subclases
00:11:06
perro y pez, vale, ya está
00:11:09
tengo un modelo muy sencillo
00:11:10
y ahora vamos a ver a través de un main pequeñito
00:11:11
pues efectivamente los matices
00:11:14
del funcionamiento de la herencia
00:11:16
a partir de un main
00:11:18
para que nos queden ya bien claros
00:11:19
vale, bueno, pues a ver
00:11:22
nos vamos a hacer un main cualquiera
00:11:24
muy pequeñito
00:11:25
venga, pues nuestro main
00:11:26
perdón
00:11:41
si, es un paquete diferente
00:11:43
porque normalmente las clases
00:11:45
que son el modelo
00:11:47
o las realidades, las entidades
00:11:48
van en un paquete, las que hacen operaciones
00:11:50
van en otro, entonces bueno
00:11:53
aunque tengamos poquitas clases
00:11:54
conviene que desde ya nos acostumbremos
00:11:56
a que suelen ir a paquetes distintos
00:11:58
en función de la
00:12:00
función que cumplen
00:12:02
en función del papel que desempeñan en la aplicación
00:12:04
pues venga, nos hacemos aquí una clase main
00:12:07
vale, pues entonces
00:12:18
todo el rollo de la herencia
00:12:24
y la importancia de la herencia
00:12:27
se recogen, se recorre
00:12:28
joder, se recogen esto
00:12:29
yo tengo aquí
00:12:31
declarada
00:12:33
una referencia de tipo animal
00:12:35
una referencia de tipo animal
00:12:40
esta
00:12:42
ahora mismo recordad
00:12:43
que lo único que hemos declarado en memoria
00:12:46
con esto es que
00:12:48
lo único que hemos hecho es esto
00:12:48
vale, esto es lo único que hemos hecho
00:12:50
hemos creado
00:12:53
una variable
00:12:53
vale
00:12:55
que se llama, esa variable
00:12:56
se llama así
00:13:00
no es el nombre que le hemos dado
00:13:01
hemos creado una variable
00:13:05
que se llama
00:13:14
a
00:13:15
esto
00:13:15
, esto es lo único que hemos creado
00:13:18
que está apuntando a qué
00:13:19
está apuntando
00:13:20
a null
00:13:22
vale, esto es lo único que hemos hecho hasta ahora
00:13:26
lo único que hemos hecho
00:13:34
hemos creado
00:13:36
una variable a
00:13:37
que es una dirección de memoria
00:13:39
pensada
00:13:42
para apuntar a un objeto animal
00:13:43
es lo único que hemos hecho hasta ahora
00:13:46
con esa dirección de memoria
00:13:47
declaración
00:13:48
este espacio en memoria ya existe
00:13:49
se llama a
00:13:51
y contiene una dirección de memoria
00:13:52
pensada para apuntar a un objeto animal
00:13:54
que todavía no existe
00:13:56
porque no hemos asignado
00:13:58
aquí no le hemos asignado nada
00:14:00
entonces por defecto
00:14:02
java lo inicializa a algún valor
00:14:04
lo inicializa a algo, por defecto
00:14:06
entonces por defecto lo inicializa a null
00:14:08
como ya sabemos
00:14:11
entonces
00:14:11
esto ahora mismo, si uno hiciera aquí
00:14:12
un
00:14:16
un system.out.println de a
00:14:18
le saldría un null
00:14:21
porque eso es lo que tiene a un null
00:14:22
¿vale? eso le saldría
00:14:24
vale, bueno, pues ahora
00:14:26
la herencia en realidad
00:14:28
en que se traduce
00:14:31
y para qué sirve
00:14:33
pues se recoge simplemente en esta idea
00:14:34
que ahora yo ya en esa referencia
00:14:36
puedo si me da la gana
00:14:38
meter un objeto animal
00:14:39
si yo quiero
00:14:42
, puedo hacer esto tranquilamente
00:14:48
y perfecto
00:14:55
ahora la referencia a se queda apuntada a un objeto animal
00:14:57
con su única propiedad nombre
00:14:59
porque el objeto animal no tiene más con lo que tiene
00:15:02
eso lo puedo hacer tranquilamente
00:15:04
pero no sólo eso
00:15:08
sino que también en esa misma referencia a
00:15:09
en esa misma referencia
00:15:12
puedo meter un objeto de cualquiera de los que herede
00:15:14
en esa misma referencia yo puedo también
00:15:18
si me da la gana
00:15:20
pues meter este objeto
00:15:25
vale, el constructor este de
00:15:27
perro, no sé ni cómo
00:15:29
lo tengo hecho
00:15:31
así, con los dos valores, vale
00:15:33
ahí
00:15:45
vale, a ver, por qué no me...
00:15:48
ah, que no importa la clase, vale
00:16:03
vale, y eso también lo puedo hacer
00:16:05
ah, es una referencia de tipo animal
00:16:09
pero perfectamente cabe en ella
00:16:11
un objeto de tipo perro
00:16:14
ningún problema, porque perro hereda de animal
00:16:15
y eso también lo puedo hacer
00:16:17
y también perfectamente
00:16:18
podría caber en A
00:16:22
podría caber en A
00:16:26
una referencia
00:16:30
un objeto
00:16:31
de tipo pez
00:16:33
bueno, pues esta es la principal referencia
00:16:41
de la herencia
00:16:48
que en una referencia de una clase
00:16:49
pueden caber objetos de esa clase
00:16:52
y de cualquiera de las subclases
00:16:55
y eso nos facilita muchísimo la vida en las aplicaciones
00:16:57
ya lo hemos visto en la del otro día
00:17:00
en la de clientes
00:17:02
yo tengo que trabajar con muchos clientes
00:17:03
tengo que trabajar con muchos
00:17:05
pues me hago un array único
00:17:06
un array único de tipo cliente
00:17:08
y en ese array meto en cada posición lo que me da la gana
00:17:10
porque cada posición será una referencia de tipo cliente
00:17:13
cada posición, aquí está
00:17:16
a clientes de cero, de uno, de dos
00:17:17
pues en cada posición meto el cliente que yo quiera
00:17:19
y no hay ningún problema
00:17:22
y ya está
00:17:24
vale, entonces ahora
00:17:25
me facilita ahí mucho las cosas
00:17:29
yo cuando, por ejemplo
00:17:32
imaginaos que ahora
00:17:33
nosotros queremos hacer un método
00:17:36
al cual se le pueden pasar
00:17:37
animales en general
00:17:40
tanto perros como gatos
00:17:42
y ese método tiene que hacer cosas con esos animales
00:17:43
vamos a
00:17:46
vamos a imaginarnos
00:17:47
vamos a hacernos una clase operaciones
00:17:48
para hacer cosas con estos animales
00:17:50
en otro paquete aparte
00:17:51
vamos a hacer otro paquete aparte
00:17:54
pues yo que sé
00:17:56
lógica
00:17:56
ah, que ya lo he llamado antes
00:17:58
bueno, no merece la pena
00:18:04
porque en este mismo paquete lógica
00:18:05
vamos a hacernos una nueva clase
00:18:08
operaciones
00:18:10
para llamarla desde el main
00:18:11
bueno
00:18:14
vale, pues en esta clase de operaciones
00:18:17
vamos a hacer un método
00:18:19
al que le podamos pasar
00:18:20
cualquier animal
00:18:23
y te diga como se llama
00:18:24
y te diga
00:18:26
te diga la inicial del animal
00:18:27
te devuelva la inicial
00:18:31
para que no sea exactamente un get
00:18:32
porque el get ya te devolvería como se llama
00:18:34
te devuelva la inicial del nombre
00:18:36
entonces, tú haces aquí un método y dices
00:18:38
a ver, necesito un método para devolver la inicial de mi nombre
00:18:40
pues venga, este método
00:18:43
me va a devolver
00:18:45
un char que es la inicial
00:18:49
y aquí el problema que viene es
00:18:51
este método que va a necesitar
00:18:58
hombre, pues le puedes pasar un perro
00:19:01
le puedes pasar un gato, le puedes pasar un pez
00:19:03
le puedes pasar lo que sea
00:19:05
entonces cuando uno declarara este método
00:19:05
si no tuviera la herencia
00:19:08
tendría que hacer
00:19:09
devolver inicial perro
00:19:11
y ponerle aquí, le paso un perro
00:19:13
devolver inicial gato
00:19:15
y aquí, le paso un gato
00:19:16
devolver inicial pez
00:19:18
y aquí, le paso un pez
00:19:20
entonces si no tuviéramos herencia
00:19:22
y tuviéramos una aplicación con muchos tipos de animales distintos
00:19:23
tendríamos que hacer un método
00:19:27
de devolver inicial para cada uno de ellos
00:19:29
y a cada uno de ellos
00:19:31
decirle que tipo de parámetro recibe
00:19:32
vale, esta sería la versión
00:19:36
cuando
00:19:39
el método devuelve la inicial del perro
00:19:41
pero la versión
00:19:44
para cuando el método devuelve la inicial de un pez
00:19:45
sería esto mismo pero con pez
00:19:48
sería una locura
00:19:49
entonces gracias a que
00:19:50
pez, perro, gato, todos
00:19:52
están bajo una super clase común
00:19:55
ese método basta con que yo haga
00:19:57
una única versión
00:19:59
hago una única versión de este método y digo
00:20:00
oye, pásame el animal que te dé la gana
00:20:03
pásame el que quieras
00:20:05
pásame el que quieras
00:20:07
y ahora esto ya, jolín
00:20:10
nos facilita la vida un montón
00:20:13
porque este método dice
00:20:15
tú pásame cualquier cosa que
00:20:16
quepa en esta referencia
00:20:18
cualquier cosa, yo ya trabajaré
00:20:20
y en esa referencia que cabe
00:20:22
caben objetos animal
00:20:24
pero también caben objeto perro, también caben objeto gato
00:20:25
cualquier cosa que herede
00:20:28
es lo que hemos
00:20:30
tratado de ejemplificar justo aquí
00:20:32
que en esta referencia
00:20:35
cabe cualquier cosa que herede
00:20:36
de animal, cualquier cosa
00:20:39
pues aquí vemos una ventaja enorme
00:20:41
yo hago un único método
00:20:43
y digo, va, pásame el tipo de animal que te dé la gana
00:20:45
no tengo que hacer una declaración para cada uno
00:20:48
no me hace falta
00:20:50
pongo aquí, pásame cualquier cosa que quepa en la
00:20:51
y ahora yo ya trabajo con ese objeto A
00:20:54
¿vale? ahora yo ya trabajo con ese objeto A
00:20:58
es que si no, sería una locura
00:21:00
sería una locura hacer una aplicación
00:21:01
que tenga que contemplar por separado
00:21:03
los diferentes tipos de clientes
00:21:05
los diferentes tipos de alumnos
00:21:08
los diferentes tipos de no sé qué
00:21:09
sería una locura hacer una aplicación así
00:21:10
y la herencia nos lo facilita
00:21:12
lo que pasa es que si no, no se puede hacer nada
00:21:14
lo que pasa es que entonces, claro
00:21:15
tenemos que
00:21:16
ahora ya saber manejarla
00:21:17
porque claro, ahora este método dice
00:21:21
vale, me has pasado un animal
00:21:23
y ahora
00:21:26
¿qué problema tiene este método ahora?
00:21:28
el primero que se os ocurre
00:21:32
yo ahora estoy programando este método
00:21:34
que es, tú recibes un animal
00:21:36
y en este caso de volver a iniciar
00:21:39
lo tendría fácil, ¿no?
00:21:42
porque el nombre del animal
00:21:45
está en la clase animal
00:21:46
está aquí
00:21:48
¿verdad?
00:21:50
la clase animal
00:21:53
la propiedad nombre está aquí arriba
00:21:54
entonces, en este caso de volver a iniciar
00:21:56
sería
00:21:59
return A.getNombre.charad0
00:22:00
¿verdad?
00:22:12
este método
00:22:13
sería así
00:22:15
entonces, yo ahora llamo a este método
00:22:16
pasándole perro, gato, lo que me dé la gana
00:22:18
¿verdad?
00:22:20
vamos a verlo
00:22:22
imaginaos que
00:22:23
me voy a hacer dos referencias
00:22:26
A1 y A2
00:22:28
en la referencia A1
00:22:29
voy a meter
00:22:32
un perro
00:22:34
y en la referencia A2
00:22:37
voy a meter un pez
00:22:39
¿vale?
00:22:41
tengo dos objetos animal
00:22:43
¿vale?
00:22:44
el A1
00:22:45
y el A2
00:22:45
A1 y A2
00:22:47
como veis están declarados los dos de clase animal
00:22:47
¿vale?
00:22:49
bueno, pues entonces yo ahora puedo llamar
00:22:51
tranquilamente al método
00:22:53
con cualquiera de los dos objetos
00:22:54
devolver inicial
00:22:56
y le paso A1
00:23:00
y estupendo
00:23:01
al compilador le parece genial
00:23:03
yo no le he pasado un animal
00:23:06
en realidad
00:23:08
o sea, aquí
00:23:09
operaciones dice que necesito un objeto de clase animal
00:23:09
eso es lo que dice
00:23:13
el método de clase animal
00:23:15
¿vale?
00:23:15
es la declaración del método
00:23:15
que necesita un objeto de clase animal
00:23:16
y yo en realidad le estoy pasando
00:23:17
uno que es un perro
00:23:20
pero no pasa nada
00:23:23
porque perro heredado de animal
00:23:25
luego estupendo, ahí cabe perfectamente
00:23:26
cuando le pase el pez
00:23:28
pues exactamente igual
00:23:31
cuando le pase el pez
00:23:32
pues lo mismo
00:23:37
le puedo pasar un pez, no pasa nada
00:23:38
cae
00:23:41
cae en la caja de animal perfectamente
00:23:42
porque A2 es un pez
00:23:45
que pez hereda
00:23:46
si no hubiera un extens
00:23:47
pues sería imposible hacer todo esto
00:23:49
claro
00:23:50
¿vale?
00:23:51
bueno, lógicamente si yo ejecutara esto
00:23:53
como no lo he mostrado en un este
00:23:55
pues no va a salir nada
00:23:57
vale
00:24:13
vale
00:24:14
en este caso nos sale
00:24:14
saldrá P en ambas, vamos a llamarle a este
00:24:15
de otra manera
00:24:17
al P
00:24:17
vale, y todo fenomenal, me sale P y X
00:24:19
que efectivamente son las dos iniciales
00:24:27
P y X, vale
00:24:29
hasta aquí está claro, ¿no?
00:24:30
todo nos encaja, todo estupendo, no vemos ninguna
00:24:33
cosa rara, y ya vemos
00:24:35
la primera
00:24:37
de las fortalezas de la herencia
00:24:38
que no hemos tenido que hacer métodos
00:24:40
diferentes para devolver inicial
00:24:43
para cada uno, no
00:24:45
el mismo yo le paso al animal, vale
00:24:46
hasta ahí vamos bien, bueno
00:24:48
vale, vamos a imaginar
00:24:51
que ahora lo que quiere hacer este método
00:24:53
en realidad
00:24:54
depende del animal que sea
00:24:56
me explico, por ejemplo
00:25:00
vamos a suponer que
00:25:02
tenemos
00:25:04
el perro, tiene un
00:25:06
método en particular
00:25:09
que fuera
00:25:10
pues ladrar
00:25:11
ya está
00:25:13
y el pez
00:25:28
tiene un método suyo
00:25:32
que es por lo que hacen los peces
00:25:34
que no sé lo que hacen los peces
00:25:36
algo harán
00:25:39
digo yo
00:25:40
nada
00:25:41
y el pez
00:25:41
tiene un método suyo que es por lo que hacen los peces
00:25:42
pues el pez
00:25:43
nada
00:25:48
que el perro, no nada
00:25:48
vale
00:25:49
entonces la acción del perro
00:25:50
es ladrar y la acción del pez
00:25:56
es nadar
00:25:58
vale
00:25:59
vale, entonces estos métodos lógicamente
00:26:00
no caen en animal, no tendría
00:26:10
ningún sentido que cayeran en animal
00:26:11
no tendría ningún sentido
00:26:13
porque no todos los animales ladran
00:26:15
y no todos los animales
00:26:17
eh, nadan
00:26:19
entonces, esos métodos sí que están
00:26:21
solamente en cada clase
00:26:23
sin embargo, sí puede haber algo
00:26:25
que sólo haga un animal
00:26:27
perdón, que hagan todos los animales
00:26:29
pues todos los animales comen
00:26:31
eso sí que lo hacen todos
00:26:33
entonces, en la clase animal sí podría haber un método
00:26:35
en esta clase animal
00:26:43
sí podría, tendría sentido
00:26:48
haber un método
00:26:49
que fuera a comer
00:26:50
porque todos comen
00:26:57
entonces lo pongo ahí
00:26:58
y ya todos los animales
00:27:00
tienen ese método
00:27:02
aunque yo no lo escriba específicamente
00:27:04
pero como ladrar es sólo de perro, ese va en perro
00:27:06
como nadar es sólo de pez, ese va en pez
00:27:09
vale
00:27:12
hasta que el perro sea un perro
00:27:12
está que bien, ¿no?
00:27:13
esto como diseño pues tendría sentido
00:27:14
yo meto en la superclase lo que hacen todos
00:27:16
y en las subclases lo que es específico de cada uno
00:27:19
está ahí bien
00:27:22
vale, pues nos volvemos a nuestra clase de métodos
00:27:23
imaginaos que ahora hay
00:27:27
que yo quiero hacer en esta aplicación
00:27:29
quiero hacer un método
00:27:31
que ejerza o que realice
00:27:33
la acción propia de cada animal
00:27:35
la acción propia del perro puede ser ladrar
00:27:39
la acción propia del pez, nadar
00:27:41
la acción propia del gato, maullar
00:27:43
hay algo que en mi modelo de datos significa
00:27:45
su acción natural
00:27:47
entonces, ¿cómo expreso yo eso?
00:27:49
pues podría poner
00:27:52
vale, pues mira, me hago un método que sea
00:27:53
public static
00:27:56
realizar su acción, la que sea
00:27:58
nadar, lo que sea
00:28:00
y ahora, ¿quién va a realizar esa acción?
00:28:06
cualquier animal
00:28:08
cuando yo llame a realizar acción para un perro
00:28:10
pues la realizará un perro
00:28:12
todos tienen su acción
00:28:13
ladrar, maullar
00:28:15
entonces, tendría sentido que yo me hiciera aquí un método
00:28:17
y dijera, venga, pásame un animal
00:28:22
pásame un animal
00:28:26
vamos a ver
00:28:28
cualquier animal
00:28:31
esta es la misma idea que el de arriba
00:28:33
cualquier animal puede hacer este método
00:28:35
pásame cualquier animal
00:28:36
y yo aquí ya me encargo de que realice su acción
00:28:38
sea ladrar, sea no sé qué
00:28:41
bueno, pues estupendo
00:28:43
sería esa la idea
00:28:45
y así no tengo que hacer un método para cada
00:28:46
ladrar perro, al que le paso un perro
00:28:49
maullar gato, al que le paso un gato
00:28:51
nadar pez, al que le paso un pez
00:28:53
¿para qué voy a hacer un método
00:28:55
para cada animal
00:28:57
para que realice su acción?
00:28:59
si con esto de la herencia hemos visto
00:29:01
que yo en esta referencia cae cualquier animal
00:29:03
pues me hago un único método, realiza la acción
00:29:07
y que realice la acción que sea
00:29:09
ya dependerá de este animal cual sea
00:29:11
bueno, puede tener sentido
00:29:13
de hecho era la idea
00:29:15
ahorrarnos tener un método para cada uno
00:29:17
pero ¿qué nos pasa?
00:29:19
que nos ponemos aquí a realizar la acción
00:29:21
y nos volvemos locos
00:29:23
porque A, la referencia
00:29:25
oye, el método este me dice
00:29:27
a ver, A
00:29:29
yo sé que es un animal
00:29:31
pero no sé más
00:29:33
no sé más
00:29:35
entonces si yo veo, atiendo
00:29:37
a los métodos de A
00:29:39
a los métodos de A
00:29:41
a los métodos de A
00:29:43
si yo atiendo a los métodos de A
00:29:47
si yo atiendo a los métodos de A
00:29:49
pues es que sólo veo lo que tiene
00:29:51
la clase animal
00:29:53
sólo veo lo que tiene la clase animal
00:29:55
tiene nombres, tiene comer
00:29:57
porque todos comen
00:29:59
pero yo solamente puedo llamar a lo que haya en A
00:30:01
no puedo llamar a la específica
00:30:03
no puedo llamarlo
00:30:05
entonces aquí nos encontramos
00:30:07
con un problema gordo a la hora de hacer este método
00:30:09
¿verdad?
00:30:11
¿qué decimos, jolines?
00:30:13
es que depende
00:30:15
¿qué hago? ¿a punto ladrar?
00:30:17
no puedo, porque ladrar es un método
00:30:19
que está en perro, no está en animal, no puedo
00:30:21
¿hago a punto nadar?
00:30:23
no puedo
00:30:25
es que no existen, no existen esos métodos
00:30:27
aquí, pero entonces
00:30:29
diríamos, jolín, esto no tiene sentido
00:30:31
entonces, ¿para qué te vale esto?
00:30:33
aquí te ha valido muy bien
00:30:35
porque nombre está en todos los animales
00:30:37
pero cuando
00:30:39
quieres tú invocar
00:30:41
a cosas específicas de cada objeto
00:30:43
pues no te vale este invento
00:30:45
no te vale, sólo puedes invocar
00:30:47
a lo que está en animal
00:30:49
¿no?
00:30:51
¿entendéis el problema, no?
00:30:53
bueno, pues tiene que haber
00:30:55
alguna manera para que esto no se desmorone
00:30:57
digamos, jolín, pues hemos empezado a hacer algo
00:30:59
que luego resulta que la potencia que tienes es muy limitada
00:31:01
tiene que haber algo
00:31:03
que nos permita distinguir
00:31:05
dada una referencia
00:31:07
de una superclase
00:31:09
que nos permita distinguir
00:31:11
si el objeto se instanció
00:31:13
como perro, o se instanció como gato
00:31:15
o se instanció como pez
00:31:17
porque eso es lo que nos falta aquí
00:31:19
lo que necesitamos aquí saber
00:31:21
es esto
00:31:23
esto es lo que necesitaríamos saber
00:31:25
¿qué tipo de objeto
00:31:29
es A?
00:31:31
o lo que es lo mismo, sabemos que es
00:31:33
pertenece a animal, o sea, está declarado
00:31:35
como animal, con lo cual sabemos
00:31:37
que es o de clase animal
00:31:39
o de cualquiera de las superclases
00:31:41
eso sí que lo sabemos sí o sí
00:31:43
que A o es de animal, o es de cualquiera de las subclases
00:31:45
ahí no hay otra, tiene que serlo
00:31:47
porque una referencia A
00:31:49
cae en la propia clase animal
00:31:51
y todas las subclases, eso lo sabemos
00:31:53
pero claro, tenemos que saber cuál de todas esas
00:31:55
esa es nuestra gran duda
00:31:59
¿a qué subclase pertenece?
00:32:03
porque si no lo sabemos
00:32:05
si no podemos averiguarlo
00:32:09
no podemos decidir
00:32:11
a qué método llamar, si llamar a ladrar
00:32:13
llamar a nadar, no podemos saberlo
00:32:15
esta pregunta hay que poder responderla
00:32:17
Java nos tiene que dar una manera
00:32:19
de poder responder a esta pregunta
00:32:21
yo sé que A es una referencia
00:32:23
de animal, pero en el momento de crear
00:32:25
en el momento de hacer el new
00:32:27
cuando hiciste el new, ¿qué new hiciste?
00:32:29
hiciste new perro, hiciste new gato
00:32:31
me lo tienes que decir, tengo que encontrar
00:32:33
una manera de resolver eso
00:32:35
porque si no, no sé si ladrar a perro
00:32:37
llamar a ladrar, llamar a nadar, etc
00:32:39
bueno, pues efectivamente
00:32:41
hay una sentencia
00:32:43
para resolver esa pregunta
00:32:45
porque si no, esto no vale para nada
00:32:47
vale, pues ¿qué sentencia es?
00:32:49
es esto
00:32:53
que se usa así
00:32:55
es como un operador
00:32:59
condicional
00:33:01
y se usa así
00:33:03
por ejemplo
00:33:05
esta sería la condición
00:33:09
habría que meterla en un if
00:33:11
o en un while donde fuera
00:33:13
porque es una condición, es un operador condicional
00:33:15
esta sería la condición
00:33:17
si A se instanció
00:33:19
como objeto perro
00:33:21
esto será true
00:33:23
si A
00:33:25
el objeto que tiene dentro se instanció
00:33:27
con el new como perro, dará true
00:33:29
si se instanció como perro
00:33:31
pues esto dará true
00:33:33
si A se instanció con el new como gato
00:33:35
sabemos que se puede instanciar de cualquier cosa
00:33:37
que sea subclase de animal, de cualquiera
00:33:39
pues con esta condición
00:33:41
podemos averiguarlo
00:33:43
entonces
00:33:45
uno podría decir, ah vale, por fin resuelto
00:33:47
si A es un objeto
00:33:49
que se instanció como perro
00:33:51
tendré que hacer el import
00:33:55
si se instanció como perro
00:33:57
si se instanció como perro
00:33:59
pues entonces
00:34:01
ahora yo ya
00:34:03
puedo partir de la base
00:34:05
de que A es un perro
00:34:07
y hacer todo lo necesario
00:34:09
para poder llamar a su método ladrar
00:34:11
entonces
00:34:13
todo lo necesario es esto, a punto ladrar
00:34:15
no me corrijas
00:34:21
compilador, así
00:34:23
todo lo necesario es esto
00:34:25
nos vamos
00:34:27
no, estamos en las mismas
00:34:29
que el compilador, el compilador no entiende
00:34:31
de tiempo de ejecución
00:34:33
de cómo son las cosas
00:34:35
el compilador entiende sólo de cómo se han declarado
00:34:37
y el compilador se emperra y dice
00:34:39
que no, que no llames a ladrar
00:34:41
que A está declarado
00:34:43
como animal, pues yo solamente
00:34:45
te dejo llamar a métodos
00:34:47
que estén animal
00:34:49
pero claro, tú sabes
00:34:51
porque te lo está diciendo
00:34:53
esta condición, tú sabes
00:34:55
que A sí que se instanció como perro
00:34:57
lo sabes porque esto es true
00:34:59
entonces como lo sabes
00:35:01
te puedes permitir
00:35:03
y aquí sí que lo tienes que hacer
00:35:05
te puedes permitir hacer un casting
00:35:07
aquí sí que es lo que el eclipse
00:35:09
se ha empeñado en hacérmelo rápidamente
00:35:11
aquí sí que te puedes
00:35:13
permitir hacer un casting
00:35:15
oye, yo sé que A es un perro
00:35:17
y que haciendo este casting no la cago
00:35:19
porque sé que lo es
00:35:21
sé que lo es
00:35:23
porque si no, no habría dado true esto
00:35:25
entonces como sé que lo es
00:35:27
me hago
00:35:29
el casting a perro
00:35:31
ala, casting a perro
00:35:33
y no va a fallar
00:35:35
y ahora ya esto, después del casting
00:35:37
al ser ya un objeto perro
00:35:39
el compilador dice, vale
00:35:41
estupendo, ya sí que te dejo llamar a ladrar
00:35:43
ya sí que te dejo llamar a ladrar
00:35:45
vale
00:35:47
bueno, vamos a pararlo aquí
00:35:49
bueno, vamos a pararlo aquí
00:35:57
vale
00:35:59
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 12
- Fecha:
- 5 de febrero de 2024 - 20:17
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 36′ 02″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 142.71 MBytes