20250117 HerenciaEjemplos_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:
Bueno, pues venga, entonces, esta ya no tenemos ni que pensar porque nos dice la entidad que va a usar esta aplicación y tendrá un empleado, porque va a haber empleados en esa aplicación.
00:00:00
Lo que pasa es que a algunos de los empleados se les va a tratar de forma especial en cuanto a las funcionalidades que se pueden hacer con ellos y esos serán los gerentes.
00:00:12
entonces podría haber una clase empleado y otra gerente
00:00:22
por libre, pero como
00:00:25
identificamos cuando analizamos el problema
00:00:27
identificamos que gerente también
00:00:29
es un empleado y por tanto
00:00:30
todo lo de empleado le interesa
00:00:33
pues identificamos que hay una relación de
00:00:34
vale, y luego ya seguimos
00:00:36
identificando cosas, pero vamos a empezar
00:00:39
en cuanto a departamento
00:00:40
empresa, empleado temporal, bla bla bla
00:00:42
empezamos con empleado y gerente para ver lo de los
00:00:44
constructores, pues venga
00:00:46
esta clase ya nos la dan hecha, atributos
00:00:48
o propiedades, nombre, salario
00:00:50
y fecha, pues venga
00:00:52
nombre
00:00:54
salario
00:01:17
y la fecha
00:01:20
de contratación
00:01:24
y ya está, date, pues tenemos
00:01:25
que pronunciarnos sobre qué clase
00:01:34
fecha nos interesa, si esta
00:01:36
o la time
00:01:38
o la clase local date
00:01:40
de java time, bueno, si es para
00:01:42
cosas básicas con fechas
00:01:44
pues esta misma y ya está
00:01:45
entonces los
00:01:47
empleados, le podemos poner lo de siempre
00:01:49
un constructor
00:01:52
Sí, porque para hacer
00:01:52
las cosas básicas de meter fechas
00:01:59
comparadas unas con otras, va a sobrar
00:02:01
Vale, pues va a haber empleados
00:02:03
y de los empleados nos interesa esto
00:02:25
Por ahora no
00:02:27
identificamos ninguna funcionalidad
00:02:30
en particular
00:02:32
qué hacer con los empleados
00:02:33
según estudiemos la aplicación y la veamos
00:02:35
pues a lo mejor interesa meter ahí alguna funcionalidad
00:02:37
para hacer en concreto con los empleados
00:02:39
pero bueno, por ahora hemos identificado
00:02:41
que hay empleados
00:02:43
con funcionalidades específicas
00:02:45
para ellos y con datos específicos
00:02:47
que también son
00:02:49
gerentes, pero comparten
00:02:50
los datos
00:02:53
de nombre, salida y fecha, con lo cual
00:02:53
hacemos gerente y al
00:02:57
identificar eso, la hacemos heredera y ya está
00:02:59
vale, pues
00:03:01
bueno
00:03:18
en estas aplicaciones que son cortas
00:03:21
es difícil
00:03:23
que al final nos quede un diseño extraño
00:03:24
pero a veces cuando empezamos
00:03:27
a tener un montón de clases de cosas
00:03:29
y tratamos de reformular el código
00:03:31
el diseño para que quede mejor
00:03:34
pues nos quedan cosas raras
00:03:36
entonces como verifica uno que no le ha quedado una cosa rara
00:03:37
en su diseño
00:03:39
pues cuando tú ves eso tienes que poder decir
00:03:40
oye un gerente es un empleado
00:03:42
si esa frase tiene sentido
00:03:46
Entonces como esa frase tiene sentido
00:03:48
Que un gerente sea un empleado
00:03:50
Esto de aquí tiene sentido
00:03:51
Vale, gerente añade algo
00:03:53
Pues sí, hemos dicho que añadía
00:03:55
Un
00:03:57
Un bonus
00:03:58
Que es
00:04:01
Un extra en el sueldo
00:04:02
Vale, entonces como
00:04:05
Empleado
00:04:08
Tiene ahora ya subclases
00:04:09
Tiene hijas, tiene herederas
00:04:12
Tiene lo que sea
00:04:13
¿Eh?
00:04:15
y gerente tiene un padre.
00:04:18
Vamos a ponerle a este protected,
00:04:21
porque le va a facilitar a lo mejor la vida al gerente,
00:04:23
el poder a su código, a sus métodos,
00:04:25
poder acceder directamente a sus propiedades.
00:04:29
¿Vale?
00:04:33
Entonces, si una clase va a tener subclases,
00:04:33
pasar del private al protected,
00:04:38
le arregla un poco la vida a las subclases,
00:04:40
porque ahora ya la subclase,
00:04:44
si lo necesita en algún método suyo,
00:04:45
Puede poner directamente nombre
00:04:47
Y no tiene que tirar todo el rato de getNombre
00:04:49
Que es más largo y más confuso
00:04:51
Bueno
00:04:52
Vale, a ver
00:04:54
Yo puede, dime
00:04:57
A ver, sí
00:04:59
Pero es que yo no he puesto ningún constructor
00:05:06
Todavía
00:05:08
Claro
00:05:09
No adelantemos
00:05:13
Los acontecimientos, en cualquier caso
00:05:18
Tal y como he hecho yo empleado
00:05:20
O sea
00:05:21
Tú no has hecho un constructor
00:05:23
Sin parámetros aquí, ¿verdad?
00:05:26
Claro
00:05:30
Entonces por eso te sale esa cosa roja
00:05:31
¿Vale?
00:05:32
Por ahora sí
00:05:35
Bueno
00:05:36
¿Deberías borrar qué?
00:05:38
No, no, no
00:05:42
El constructor que has hecho con cosas
00:05:43
Va a ser utilísimo
00:05:44
Lo que yo digo es que como normalmente hacemos
00:05:45
Para aportarle flexibilidad a la aplicación
00:05:48
uno con cosas y otro sin cosas
00:05:50
pues que hagas los dos
00:05:52
por ahora
00:05:53
vale, a ver, podría ocurrir
00:05:54
que yo en mi diseño
00:05:58
en lo que sea, en mi paquete de clases
00:06:00
que otros van a reutilizar, por lo que sea
00:06:01
yo no quiera
00:06:04
que alguien herede de mis clases
00:06:06
bueno, pues lo puedo
00:06:08
prohibir poniendo un modificador
00:06:10
aquí, que es este
00:06:12
vale
00:06:16
este de aquí
00:06:18
es decir
00:06:21
si antes de la declaración de una clase
00:06:23
uno pone final
00:06:26
¿vale?
00:06:28
que es el único modificador extra que hemos incorporado
00:06:30
porque hasta ahora siempre delante de class
00:06:33
solamente teníamos opciones
00:06:34
o no poner nada, poner public
00:06:35
que ya sabemos la diferencia que hay
00:06:38
el final prohíbe que alguien
00:06:40
te herede
00:06:42
la convierte en clase final de la jerarquía
00:06:43
¿entonces gerente ya no funciona?
00:06:46
no
00:06:48
se ha puesto rojita
00:06:49
¿vale?
00:06:51
Entonces, lo vamos a incluir aquí, el modificador este final prohibiría crear subclases, heredar, lo que por traducción natural se llama extender la clase, vale, eso, como lo queráis llamar, prohibiría heredar, vale.
00:06:53
bueno, pues ya tenemos incorporado esto de final
00:07:36
vale, entonces final
00:07:38
ya lo hemos usado
00:07:40
a veces en
00:07:42
pero lo hemos usado ahora mismo
00:07:44
solamente lo hemos mencionado
00:07:46
a veces para ponerlo en una
00:07:48
variable
00:07:50
vale, lo hemos dejado caer en algún momento
00:07:51
vale
00:07:54
en algún momento, por ejemplo, aquí
00:07:56
en este primer ejemplo
00:07:58
herencia que hemos hecho aquí
00:08:02
vale, pues
00:08:03
el modificador final, entonces que ya
00:08:09
vamos a empezar a
00:08:12
familiarizarnos con él
00:08:13
el modificador final se puede poner
00:08:16
delante de una propiedad
00:08:18
delante
00:08:20
de un método y delante
00:08:22
de una clase
00:08:24
delante de una propiedad, ya lo hemos mencionado
00:08:24
alguna vez
00:08:28
y cuando uno lo pone delante de una propiedad, ¿qué significa?
00:08:29
significa
00:08:33
que esa propiedad
00:08:34
desde el momento en el que se le da su primer valor
00:08:35
aquí en la inicialización ya se le puede cambiar
00:08:38
es como poner constante
00:08:41
la constante de toda la vida en los lenguajes de programación
00:08:42
antiguos, los lenguajes de programación más antiguos
00:08:44
decían, tenemos variables
00:08:47
que son identificadores
00:08:48
que se corresponden a un valor que tú puedes cambiar
00:08:50
cuando te da la gana, la variable de toda la vida
00:08:53
o constantes
00:08:54
que es un identificador también que recibe
00:08:56
un valor, pero eso no se va a cambiar
00:08:59
en la vida, bueno pues
00:09:00
la forma de incorporar las constantes en Java
00:09:02
es hacer variables normales y corrientes
00:09:04
y poner un final delante.
00:09:07
Una vez usas el constructor
00:09:09
y la inicializas, ya lo puedes...
00:09:11
Efectivamente.
00:09:13
Vale. Entonces,
00:09:15
esta variable descuento
00:09:17
ya nunca jamás se le podría cambiar el valor.
00:09:18
Pero no hace falta ni inicializarla, ¿no?
00:09:21
Porque imagino que ya cuando inicialices el objeto...
00:09:22
Si es estática, sí.
00:09:24
Digo, si no es estática.
00:09:28
Si no es estática, creo que también tienes que
00:09:30
inicializarla. Creo que te obliga
00:09:32
en el momento en que la declaras.
00:09:34
¿Vale? O sea, una variable constante
00:09:36
tú, en el momento en el que aparece, se supone
00:09:39
que tienes que tener pensado qué valor es el que quieres que tenga.
00:09:41
Claro. Entonces,
00:09:44
le das ahí ese valor y ya nadie lo va a tocar.
00:09:45
¿Vale?
00:09:48
Entonces,
00:09:49
hemos usado ya
00:09:50
variables constantes
00:09:53
que no hemos creado
00:09:55
nosotros.
00:09:57
Pues, por ejemplo, cuando
00:09:59
Eso, cuando
00:10:01
Ah, bueno, es que aquí no me dejaron
00:10:06
Hacerlo porque no estoy dentro de un método
00:10:08
¿Vale?
00:10:10
Que fue cuando mencionamos lo de final
00:10:13
Fue cuando vimos estas constantes
00:10:14
Vale
00:10:16
Es decir
00:10:18
La clase math
00:10:22
Como hace operaciones con pi
00:10:23
Pues te crea una variable
00:10:25
Pi por aquí, te crea una variable
00:10:27
La que le da un valor
00:10:30
Y le pone el final
00:10:30
Porque a la variable pi no nos interesa cambiar el valor nunca
00:10:32
Va a tener siempre ese
00:10:36
No, no se pone
00:10:37
Es el concepto de constante de toda la vida
00:10:39
Pues aquí es poniendo un final delante
00:10:41
Que suelen estar asociados a variables
00:10:43
Estáticas, claro, porque
00:10:45
Es donde tienen sentido
00:10:47
Una constante, un valor que yo
00:10:49
Puedo usar desde cualquier sitio
00:10:51
Con un valor fijo porque me viene bien
00:10:53
Para hacer operaciones
00:10:55
Pues los finals suelen estar asociados a
00:10:56
Constantes estáticas, da igual el orden que pongas
00:10:59
Puedes poner static, final, final, static
00:11:01
Vale, bueno, pues final es solamente eso
00:11:03
Y cuando se pone en una clase
00:11:05
Cuando se pone en una clase
00:11:09
Tiene otro sentido
00:11:11
Cuando se pone en una clase
00:11:12
El sentido que tiene, tiene que ver con la herencia
00:11:14
Y es, esta clase no puede tener subclases
00:11:16
Ya se queda así
00:11:19
Nadie la puede extender para hacer una modificación de ella
00:11:20
En nuestro caso, si queremos extenderla
00:11:23
O heredarla con gerente
00:11:27
Este final no lo pondríamos
00:11:28
¿Tenemos un método?
00:11:30
¿Tenemos un método?
00:11:31
vale, quieres que te lo diga ya
00:11:33
vale, va a esperar a que llegue a un ejemplo
00:11:35
en un método significa que no lo puedes sobrescribir
00:11:37
que no se puede sobrescribir
00:11:39
ah vale, aunque en una subclase crees otro método
00:11:41
con el mismo nombre, claro, por ejemplo
00:11:43
aquí en cliente, en el ejemplo herencia
00:11:45
este
00:11:47
método, en ejemplo herencia que habíamos
00:11:49
hecho ayer, teníamos nuestro
00:11:51
mostrar datos que sobrescribíamos
00:11:53
¿verdad? luego porque
00:11:56
mostrar datos era diferente
00:11:57
entonces
00:11:58
yo puedo ponerle un final al método
00:11:59
pero si le pongo un final
00:12:03
al método
00:12:05
ya no me deja
00:12:06
sobrescribirlo, me dice
00:12:09
no puedes sobrescribir un método final
00:12:11
¿vale? eso es lo que significa, entonces
00:12:13
final es prohibir la herencia
00:12:14
la prohíbes, oye
00:12:17
si la pones en la clase, prohíbo
00:12:18
una subclase, si lo pones
00:12:21
en un método, prohíbo
00:12:23
que sobrescribas este método en las
00:12:25
subclases, ¿vale?
00:12:27
eso significa final en un método
00:12:28
y ya no se puede poner en más sitios
00:12:33
en clases
00:12:39
propiedades y métodos
00:12:41
todo depende
00:12:42
o sea, todo son herramientas
00:12:47
posibilidades si tú las usas para que
00:12:49
tus diseños tengan el mayor sentido posible
00:12:51
y hay veces que sí que
00:12:53
tiene sentido proteger de la herencia
00:12:55
porque si algún desarrollador hereda de eso
00:12:56
a lo mejor va a generar
00:12:59
efectos secundarios en la aplicación
00:13:01
que no son deseables, entonces la forma de
00:13:03
protegerlo es así
00:13:05
vale
00:13:06
bueno, pues entonces ahora ya
00:13:07
nos dice aquí, gerente tiene el bono
00:13:11
y dice, vamos a utilizar
00:13:13
constructores
00:13:15
para empleado
00:13:17
vale, pues
00:13:19
nosotros
00:13:20
como los constructores
00:13:23
no se heredan
00:13:25
como los constructores no se heredan
00:13:26
pues haríamos el constructor
00:13:28
como lo hemos hecho
00:13:30
toda la vida, pues venga
00:13:32
public, por ejemplo
00:13:34
si es con parámetro
00:13:36
public empleado y tendríamos que poner todos
00:13:37
tendríamos que poner
00:13:40
todos los propiedades que tiene, que tiene nombre
00:13:42
salario, fecha
00:13:44
salario
00:13:46
y el bonus
00:13:56
vale, y ahora
00:14:04
eh, uy public
00:14:17
empleado, que hago aquí, public gerente
00:14:23
estoy haciendo el constructor de gerente
00:14:24
y aquí pues
00:14:27
iríamos una por una
00:14:29
Pues dis.nombre
00:14:30
Igual a nombre
00:14:33
Dis.salario
00:14:34
Pues
00:14:40
Porque
00:14:44
Aparte porque lo veamos bien
00:14:46
Porque el
00:14:49
El chivato del eclipse
00:14:51
No sé si te ofrece aquí
00:14:52
Los
00:14:55
Heredados
00:14:56
Entonces si no te los ofrece
00:14:58
Pues no ganas nada
00:15:00
Aunque a lo mejor cambiándolo a algo aquí te lo ofrecería también
00:15:03
Pero bueno, da igual
00:15:07
Dis fecha
00:15:08
Y dis punto bonus igual a bonus
00:15:11
Vale, aquí nos ha permitido acceder a la propiedad
00:15:27
Nombre, salario, fecha, bonus
00:15:31
A estas tres
00:15:33
Nos ha permitido acceder a nombre, salario, fecha
00:15:34
porque las hemos puesto
00:15:37
protected aquí arriba
00:15:39
vale, si no las hubiéramos
00:15:40
puesto protected no podríamos hacer
00:15:43
this.nombre, tendríamos que
00:15:45
haber hecho set nombre
00:15:47
nombre, set salario
00:15:49
entonces como lo hemos puesto protected
00:15:51
y claro, gracias a haberlo
00:15:52
puesto protected pues nos queda
00:15:55
un
00:15:57
porque me aparece aquí este rojo todo el rato
00:15:58
ah, porque el import
00:16:01
de date
00:16:03
entonces mejor poner el protected
00:16:04
porque el aspecto que tiene el constructor
00:16:12
es más parecido a lo que estamos acostumbrados
00:16:13
vale, pero esto es un rollo
00:16:16
patatero, que está muy bien
00:16:18
o sea, esto está bien hecho
00:16:20
pero es un rollo, porque imaginaos que tengo
00:16:21
una jerarquía, ya no sólo
00:16:24
de una
00:16:26
superclase y una subclase, sino que además
00:16:28
tengo otra subclase de esa
00:16:30
subclase, y otra, y otra
00:16:31
entonces tengo un montón de propiedades
00:16:33
arriba, un montón
00:16:35
que he ido heredando y heredando
00:16:36
y este listado se me puede quedar
00:16:39
interminable, entonces es un rollo
00:16:41
vale, eso
00:16:43
pues de cara simplemente a facilitarnos
00:16:44
la escritura, de cara a facilitarnos la escritura
00:16:47
resulta
00:16:49
que yo desde una clase heredada
00:16:51
desde una subclase o clase
00:16:53
heredada
00:16:57
puedo acceder
00:16:58
a la
00:17:01
llamándolo así, a la parte
00:17:03
de instancia
00:17:05
relacionada con lo superclase, lo voy a reducir
00:17:06
aquí, con
00:17:09
este término, con el término
00:17:18
super, este de aquí
00:17:21
que su sentido es parecido al de dis
00:17:22
dis que significa, el objeto en el
00:17:24
que estoy
00:17:27
super significa el objeto padre
00:17:27
no, porque no hay un objeto padre, solo hay
00:17:31
un objeto, que es el que he instanciado
00:17:33
pero super significa la parte tuya
00:17:34
objeto, que está
00:17:37
declarada en la superclase
00:17:39
eso es lo que significa
00:17:40
es decir, porque a veces nos guiamos un poco
00:17:42
y creemos que si tenemos una clase
00:17:45
una superclase y una subclase
00:17:47
cuando instanciamos
00:17:49
el objeto de la subclase es como si tuviéramos
00:17:52
dos objetos, el de la superclase
00:17:54
y el no, no, no, tenemos un único
00:17:56
objeto, el objeto de la subclase
00:17:58
con todas las propiedades
00:18:00
lo que pasa es que están declaradas en dos partes distintas
00:18:01
pero es un único objeto con todas las propiedades
00:18:04
vale, pues super significa
00:18:05
la parte de ese objeto
00:18:08
pero que está declarada en la superclase
00:18:11
entonces
00:18:14
todo esto de aquí
00:18:16
nos lo podríamos haber ahorrado
00:18:18
haciendo una llamada super de esta manera
00:18:20
como super es
00:18:23
la superclase
00:18:25
super es la llamada al método
00:18:26
constructor de la superclase
00:18:29
entonces si yo hago esto
00:18:31
nombre
00:18:33
salario
00:18:35
y fecha
00:18:38
contratación
00:18:41
¿Qué estamos haciendo?
00:18:42
Estamos llamando al constructor
00:18:45
De la subclase
00:18:47
De la superclase, perdón
00:18:48
No, porque el constructor
00:18:51
De la superclase no tiene el bonus
00:18:59
El bonus ya sí que lo tengo que hacer por libre
00:19:01
Vale, entonces
00:19:02
Esto nos facilita la escritura
00:19:12
Porque decimos, vamos a ver
00:19:15
Gerente, de todo lo que yo le paso
00:19:17
Que le paso mil cosas
00:19:20
las tres primeras
00:19:21
ya hay un constructor
00:19:24
en la superclase para inicializar las propiedades
00:19:26
pues voy a llamar
00:19:29
al constructor de la superclase
00:19:30
que es este
00:19:32
voy a llamar a este constructor
00:19:33
que es este
00:19:36
le paso esas tres
00:19:38
y con esas tres ya está llamando este código
00:19:40
es como si hiciéramos un copia y pega
00:19:43
de ese código abajo
00:19:44
que cuando son tres no es mucho
00:19:45
pero si fueran veinte pues es un montón
00:19:48
entonces siempre
00:19:51
se programan los constructores
00:19:53
de las subclases usando esto
00:19:55
siempre, vale
00:19:57
esto significa, llama
00:19:58
al constructor de la superclase
00:20:01
y al
00:20:03
constructor que le pasamos
00:20:05
pues las propiedades que toquen
00:20:06
que son las que yo le he dado aquí
00:20:08
a ver, esta llamada también sería
00:20:10
válida, esto también sería válido, ¿por qué?
00:20:13
porque la superclase tiene un
00:20:15
constructor vacío también, lo tiene
00:20:17
tiene este, que no hace nada
00:20:19
entonces este constructor también sería válido
00:20:20
lo que pasa es que este constructor
00:20:23
no estaría haciendo nada
00:20:24
y luego inicializando bonos, con lo cual esto que le hemos pasado
00:20:26
aquí lo estaría tirando a la basura, no lo estaría usando
00:20:29
para nada, pero sentido
00:20:30
sintáctico tiene
00:20:33
¿vale?
00:20:34
lo normal es que nuestro constructor
00:20:36
parámetros, lo usemos
00:20:38
¿vale? entonces
00:20:39
esta llamada de aquí
00:20:41
esta llamada, en caso
00:20:44
de usarla, que no es que sea obligatorio usarla
00:20:46
en caso de usarla
00:20:48
Tiene que ponerse siempre como la primera línea
00:20:49
¿Vale?
00:20:52
Sí, vamos a comprobarlo
00:20:55
Por si hubieran cambiado las cosas en estos últimos
00:20:56
Tiempos, pero
00:20:58
Constructor
00:20:59
¿Vale? Si la pongo
00:21:11
Si no la pongo como primera línea
00:21:21
Me da un error, y de hecho me lo está diciendo
00:21:23
Me dice, oye, la llamada
00:21:26
Al constructor de arriba
00:21:28
Tiene que ser, hasta aquí hemos llegado
00:21:29
¿No? Vamos
00:21:32
Ha hecho un gesto
00:21:34
esto, mira, me has recordado
00:21:35
un amigo mío
00:21:39
entró una vez a un bar
00:21:40
y en el bar de repente
00:21:42
bueno, entré yo con él
00:21:44
y había un montón de gente de una pinta muy muy muy rara
00:21:45
de estas como de broncas
00:21:48
entonces entramos
00:21:49
y de repente mi amigo que lleva gafas
00:21:51
se las quitó
00:21:55
y las guardaba en el bolsillo
00:21:57
con ese gesto así de tranquilidad
00:21:58
claro, pues ese gesto así
00:22:00
no veas
00:22:02
el poderío que transmitió
00:22:04
Claro, pues tú lo mismo, has bajado esto
00:22:05
No sigas dando clase
00:22:08
Porque se ha acabado
00:22:09
Claro
00:22:10
Venga, pues ya lo hemos acabado
00:22:13
- 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:
- 5
- Fecha:
- 18 de enero de 2025 - 14:22
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 22′ 17″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 101.78 MBytes