2025-02-24-Programacion - 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:
Tema 7- Repaso general
Inicia la grabación, la semana pasada después de hacer la grabación la subí a la mediateca que es desde donde las comparto y de forma inmediata no está disponible la mediateca, como que la tienen que cocinar allí de alguna forma, no sé.
00:00:00
y luego ya por la noche suele estar disponible para poder utilizarla o al día siguiente
00:00:16
y se me pasa dos o tres días hasta que bueno, uno de los que creo que andáis por aquí
00:00:21
el que me pusisteis el mensajillo, si me vuelve a pasar pues avisarme
00:00:25
que es que se me olvidó poner el enlace en la ola virtual para que la vierais
00:00:29
luego deciros también que la semana que viene, bueno tanto el viernes
00:00:33
no sé si tenéis alguna tutoría, como luego el lunes son días no lectivos
00:00:39
Es verdad que no son festivos los dos, me parece, para los trabajos, pero sí que son no lectivos, con lo cual esos dos días no tendréis tutorías. Si tenéis alguna el viernes, no contéis con ella y, bueno, pues el lunes, este lunes que viene, no tendremos clase como todos los lunes habitualmente.
00:00:43
de tal forma que creo que el siguiente tema, el tema 8
00:01:01
abre el martes de la semana que viene, como lo tenemos
00:01:08
estipulados así en martes, con lo cual en principio hoy es el último
00:01:12
día que tenemos del tema 7 y luego una vez cerrado el tema
00:01:16
sabéis que siempre solemos dedicar, si no hay ninguna petición
00:01:20
particular, solemos dedicar la tutoría siguiente a resolver la tarea
00:01:24
es decir, tenemos en principio para el tema 7
00:01:28
Si luego es necesario echar un ratillo por ahí alguna otra tutoría con alguna cosa, pues lo buscaríamos el día de hoy para pegar un pequeño repaso de lo que vaya surgiendo por aquí del tema 7.
00:01:32
Tengo por aquí un guión para iros contando algunas cosas y luego, no el lunes que viene, sino en 14 días haríamos la tarea.
00:01:43
Y bueno, en base a la tarea ya sabéis que vamos siempre muy despacito, de tal forma que volvemos a repasar un poco de nuevo todos los conceptos.
00:01:51
Y bueno, antes de empezar a contaros, como siempre, preguntaros si tenéis alguna cosilla, alguna aclaración que queráis que hagamos de alguna cosa de las que estáis viendo o de algún aspecto por ahí que queráis comentar. Bueno, sí, podemos, pues lo alargamos, no sé. Estás, bueno, para que quede grabado me proponen alargar un poquito más la tarea. No sé, podríamos, podría ser un par de días. ¿Pensabas en un par de días o en tres días o en cuánto tiempo estabas pensando hacer la propuesta de alargarla?
00:01:59
Bueno, pues nada, si al fin y al cabo las tutorías es para que las podáis trabajar y si me comentáis que en principio os ha pillado un poco el toro, en este caso a ti, para hacerla, pues bueno, la pospongo una semana y ya está.
00:02:45
vale
00:03:19
vale, pues nada
00:03:30
pues
00:03:35
los plazos para ir abriendo temas
00:03:36
los mantenemos, pero lo que es
00:03:40
la posibilidad de entrega de la tarea, pues en lugar
00:03:42
de cerrar el próximo
00:03:44
lunes, que sería, pues lo
00:03:45
dejamos para cerrar una semana después
00:03:48
y ya está, vale, pues ya está
00:03:49
lo hago así, luego os pongo también
00:03:51
si no se me olvida, os pongo
00:03:53
un mensajillo para que lo sepa todo el mundo
00:03:55
que no esté
00:03:58
que no vea la tutoría o que no esté
00:03:59
ahora aquí o no la había luego grabada y ya está, que sepan que la alargamos una semana
00:04:01
y ya está, vale, sí, sin problema. Vale, pues nada, si
00:04:06
no hay más cosillas por ahí, pues os empiezo a contar un poco
00:04:12
algunas cosas que tengo por aquí apuntadas de guión que
00:04:17
he sacado de lo que es la teoría de este tema. En realidad
00:04:21
muchas de ellas, es verdad que es un tema extenso, pero muchas de ellas
00:04:25
las hemos ido hablando durante el curso, así que bueno, si ya tenemos
00:04:29
un poco base de algunos conceptos, pues bienvenido sea.
00:04:33
Vamos a crear un proyecto y vamos hablando
00:04:37
de los diferentes conceptos teóricos que aparecen
00:04:41
por ahí. Vamos a poner aquí tema 7
00:04:45
para el proyecto. Este tema, en principio,
00:04:48
arranca hablando de lo que son las relaciones entre diferentes
00:05:00
clases que nos podemos encontrar en un proyecto.
00:05:04
y bueno, a grandes rasgos, ya os digo que hemos hablado
00:05:06
de las relaciones que podemos tener, tenemos dos
00:05:10
una, que podemos tener
00:05:13
definida una clase y ser un atributo
00:05:16
de otra, vamos a ponernos en la situación
00:05:19
de una persona y de la clase persona
00:05:22
y de la clase brazo
00:05:25
podemos entender que una persona está formada
00:05:26
por cabeza, tronco y extremidades
00:05:31
podríamos definir una clase tronco que tuviera sus propios
00:05:33
atributos como clase en sí o los objetos que podamos definir
00:05:38
de ella y sus métodos, como siempre, como toda clase
00:05:42
y luego en sí, cuando definimos la clase
00:05:46
persona, si está formada por cabeza, tronco y extremidades
00:05:50
el tronco sería uno de los posibles atributos de la clase
00:05:53
persona. Entonces esto es uno de los tipos de relación que principalmente
00:05:58
existen. Y luego, el otro tipo de relación es el de herencia.
00:06:02
Bueno, ahora hablamos también
00:06:09
de un tercer tipo que aparece ahí en la teoría.
00:06:10
Pero vamos, como dos grandes relaciones entre clases, esta, que una
00:06:14
clase sea atributo de otra. Ahora hacemos un ejemplillo donde aparezca,
00:06:18
aunque ya hemos trabajado con ella en algún momento. Por ejemplo, en la tarea
00:06:22
esta de cocina, pues la cocina tenía como
00:06:26
clase integrada en forma de atributo de la clase cocina
00:06:30
tenía el frigorífico y tenía la placa, ¿no? Pues esa está la idea.
00:06:34
Y luego tenemos la posibilidad de herencia, que es una de las
00:06:38
características de la programación orientada a objetos, en alguna otra tutoría hemos hablado ya
00:06:42
de ello, y lo que hacemos es que las clases hijas
00:06:46
de la clase, hay una estructura en árbol, digamos, de clases
00:06:50
cuanto más arriba estás, pues digamos que las clases
00:06:54
que están por encima de las que están por debajo actúan de clases padre de las clases que están
00:06:58
por abajo entonces las clases que están por abajo en esta estructura heredan características de la
00:07:02
clase padre básicamente heredan sus atributos y sus métodos los que tienen disponibles y luego
00:07:08
bueno pues está la otra de las características de la programación orientada a objetos que es la
00:07:17
sobrescritura que podemos sobre escribir el comportamiento que tiene heredado de un método
00:07:21
por ejemplo, de la clase padre, lo podemos sobrescribir en la clase hijo para que sea la que considera.
00:07:25
La primera, en la que son atributos una clase de otra, en la teoría la refiere como composición
00:07:33
y la mete dentro de una categoría de tipos de clase de uso de clientela.
00:07:43
Es como aparece ahí en la teoría.
00:07:49
Y dentro de estar del uso de clientela, también tenemos la posibilidad de anidamiento.
00:07:51
Y el anidamiento es que dentro, no que tenemos un objeto o una referencia de una clase como atributo de otra, sino que la definición de la propia clase está dentro, una clase está dentro de otra en su código.
00:07:56
Pues en una clase podemos tener, imaginaos la clase Persona, de la que hablábamos antes, pues tendríamos sus atributos, tendríamos sus métodos y además de sus atributos y sus métodos podríamos tener definida una clase dentro de la clase Persona.
00:08:12
Pues esto es lo que es el anidamiento. Bueno, yo lo uso poco, en verdad, la idea viene relacionada, la idea de anidar unas clases con otras, que también en la teoría aparece como uso de tipo clientela, tiene que ver con cuestiones de encasulamiento, que es otra de las características que tenemos en la programación orientada a objetos.
00:08:30
típicamente si nosotros tenemos un programa
00:08:54
ahora llegamos a las clases
00:08:59
sanidadas, pero si tenemos un programa con diferentes clases
00:09:02
para acceder desde unas clases a otras, lo hacemos bien
00:09:05
si la visibilidad lo permite, bien accediendo directamente
00:09:09
a sus atributos o bien a través de métodos también en función de la visibilidad
00:09:14
si es público, privada, PACAS, os acordáis de todo esto
00:09:18
Entonces, esta forma de acceder a las características y a las acciones que puedan hacer los objetos de una determinada clase a través de sus atributos y sus métodos, llamándolos, para que una clase externa sea capaz de trabajar con ello, necesita conocer su protocolo.
00:09:21
¿Cómo puedo yo comunicar con un objeto de esta clase o su protocolo o su interfaz? ¿Qué interfaz me da la clase persona de cara al resto del programa? Pues hay un método que será el método saludar, otro que será el método despedir y un atributo para la persona que sea el nombre y la edad. Pues ese es el interfaz, la cara que da un objeto de la clase persona hacia el resto del programa.
00:09:44
como imaginaos que dentro de la clase persona se puede consultar el dni verdad con un getter
00:10:06
del atributo dni o directamente con un método que te devuelve el número del dni que tiene esa
00:10:16
persona pues resulta que en la estructura del programa en general nosotros desde cualquier
00:10:23
clase podríamos poner haber instanciado un objeto de la clase persona que sea no a poner
00:10:29
noa.getDNI, el getter del DNI y me daría el número o el string que tiene el DNI.
00:10:35
Pero desde fuera nos despreocupamos por completo de cómo el getter de la clase persona ha obtenido ese DNI.
00:10:43
Imaginaros que en un momento dado podría estar en una base de datos, no sé si habéis estudiado el módulo de base de datos
00:10:52
y hacer un select a una tabla, o podría estar en un fichero o directamente desde el getter con un escáner
00:10:58
se podría pedir desde teclado. La implementación del getter está encerradita dentro de la clase persona y a quien quiera utilizar el método getter de la clase
00:11:05
persona le es ajeno por completo porque lo único que hace es llamar a través de un método que es el getedad de la clase persona le es ajeno si en realidad de la clase
00:11:18
persona se ha obtenido ese dato accediendo a una base de datos a un
00:11:29
fichero por teclado o se lo ha inventado directamente con
00:11:32
un DNI aleatorio. Él solamente conoce el interfaz
00:11:37
y sabe de la clase persona, desde una clase externa
00:11:41
a la persona y sabe que para tener el DNI de un objeto de la clase persona
00:11:45
utiliza el getter y ya está. En cambio, el desarrollo
00:11:48
puede estar montado de una forma u otra. Imaginaos que este getter
00:11:52
estuviera haciendo un select a una base de datos
00:11:56
para devolvernos el DNI.
00:11:59
Pues estupendo, la clase externa de mi programa
00:12:00
utiliza el getter, pero mañana de repente
00:12:03
se hace una actualización del programa
00:12:07
y alguien me va a preguntar algo
00:12:09
un segundo en que termino de desarrollar esto
00:12:12
y te doy la palabra.
00:12:14
Una persona, o sea, de repente
00:12:17
a nivel de desarrollo se decide
00:12:19
que se va a quitar la base de datos
00:12:23
y esa información se va a volcar a un fichero.
00:12:24
Simplemente tendríamos que trabajar sobre el código del método getter de la clase persona, pero el resto del programa seguiría funcionando de igual forma, porque el interfaz se mantiene y seguiríamos obteniendo esa información a través del getter.
00:12:26
Esto es lo que nos permite trabajar desde fuera con interfaces y utilizar la característica de abstracción, es decir, que la información está ahí, es indiferente a nosotros cómo se tiene esa información porque nosotros trabajamos desde otras clases a través de interfaces o protocolos de acceso a las clases.
00:12:39
si, alguien me quería preguntar algo por ahí
00:13:00
o ha levantado la mano, no sé si por error
00:13:03
un mensaje al chat, a ver, vamos a ver
00:13:05
no, solo estoy contando de momento, no me he puesto a escribir
00:13:15
nada de momento, no, era por si teníais duda
00:13:23
si estaba escribiendo, no, simplemente os estoy contando, ahora arrancamos
00:13:26
a hacerlo, entonces pues nada
00:13:29
el interfaz, las tracciones son las características
00:13:33
de la programación como os digo orientada a objetos
00:13:37
y consiste en esto, entonces
00:13:39
El anidamiento, que es una forma de relacionar diferentes clases, es meter una clase dentro de otra y típicamente cuando trabajas con anidación, pues imaginaos que estás con la clase tronco y dentro del tronco, de forma anidada, dentro de la clase tronco define la clase corazón.
00:13:43
Pero no la defines como una clase fuera y tienes un atributo, sino que la defines dentro. Es un poco como bajo el concepto general de a la clase corazón no se va a acceder desde ningún sitio que no sea la clase tronco.
00:14:01
Con lo cual me puedo permitir dejarla ahí muy encerradita dentro de la clase tronco porque no va a haber ningún acceso por ahí externo. Es un poco esa la idea. Entonces la anido dentro de la tronco y lo dejo ahí muy encasulado para que esté muy muy encerradito con la idea esa de hago todo el desarrollo del tronco y cuando necesite un servicio del corazón internamente ahí lo tengo encerradito el código y no está accesible desde otras partes de los programas.
00:14:16
En lugar de tenerla anidada, la podríamos tener en una clase diferente, probablemente privada, o sea, probablemente que solamente fuera accesible desde el propio proyecto, desde el propio paquete y tenerla como un atributo. En ese caso se convertiría en una clase de composición.
00:14:43
Entonces esto es los dos usos generales, un uso de clientela que principalmente si dejamos a un lado el anidamiento es la composición, clase cocina que tenía como atributos frigorífico, luego incluso tuvimos un array de frigoríficos, un array de placas o herencia que hemos hablado en algún momento en alguna tutoría y hoy hacemos algún ejercicio también de herencia.
00:15:01
Vamos a ir desarrollando aquí algunas clases para ir apoyándonos en el código.
00:15:28
Vamos a definir la clase persona, vamos a definir la clase cabeza, vamos a definir la clase alumno, vamos a definir la clase profesor, por ejemplo.
00:15:37
y vamos a buscar relaciones un poco entre todas estas cosas.
00:16:09
Mirad, en la clase persona, a la hora de buscar una relación con cabeza,
00:16:20
pues entendemos que la cabeza es algo, es una parte de una persona.
00:16:30
Una cabeza pertenece a una persona.
00:16:36
En cambio, la clase alumno no es algo que pertenezca a una persona, sino que es un tipo de persona. Y profesor no es algo que pertenezca a una persona. Digamos que están un poco al mismo nivel una persona y un profesor. Un profesor no es una parte de una persona como sí que lo es una cabeza o lo es el tronco.
00:16:38
entonces a la hora de buscar una relación entre persona y estas otras clases
00:17:00
un poco la pregunta que nos podemos hacer es esto
00:17:05
queremos que la clase cabeza esté relacionada con la clase persona
00:17:08
si la consideráramos como una herencia
00:17:11
tendríamos que decir, ¿la cabeza es un tipo de persona?
00:17:14
si tenemos un concepto general de persona
00:17:19
¿un grupo de personas sería la cabeza?
00:17:22
pues no, no es un tipo de persona, es una parte de las personas
00:17:24
Entonces la relación que tenemos es de clientela, según dice la teoría, esto de clientela la verdad aparece en nuestra teoría, pero yo creo que no está luego mucho por ahí en textos, pero bueno, y lo que sería, sería una relación de composición, la cabeza es un tipo de, es una parte de las personas.
00:17:28
Entonces, podríamos decir que como atributo, perdón, aquí no, como atributo de la clase persona, pues resulta que tiene una cabeza. Luego también tendría ese nombre, pues esto sería un atributo, ¿verdad?
00:17:50
Este va a terminar siendo un objeto referenciado de la clase cabeza. Y el string, bueno, el string ya decimos que es referenciado, pero también tiene ciertas características de los tipos primitivos, porque no lo hacemos el new, pues sería otro atributo y en este caso basado en tipo string.
00:18:08
Y uno primitivo, puramente dicho, pues podría ser la edad.
00:18:27
No referenciado y primitivo.
00:18:33
Tiene tres atributos, la clase persona, una de ellas, ya que es una relación entre diferentes clases,
00:18:35
la clase cabeza y la clase persona, es que la cabeza es una parte de la persona,
00:18:40
con lo cual hacemos una relación de composición.
00:18:45
En cambio, pegaría aquí poner alumno, lógicamente se lo va a tragar, ¿no?
00:18:51
porque es una clase que existe, a nivel de Java se lo traga, pero a nivel de conceptual
00:18:58
podríamos decir que un alumno es una característica
00:19:02
de una persona, pues no, más bien es un tipo de persona
00:19:06
lo que haríamos sería decir que si es un tipo de persona
00:19:10
y tenemos una jerarquía, un orden de clases de arriba abajo, podríamos decir
00:19:14
pues tenemos las personas que pueden ser de tipo
00:19:18
alumno o de tipo profesor
00:19:23
Y las personas, esto sería una relación de herencia. ¿Un alumno es un tipo de persona? Sí. ¿Un profesor es un tipo de persona? Sí. ¿Un alumno podrá hacer cosas o tendrá características típicas de las personas? Pues sí.
00:19:27
Fijaros en la clase alumno, podríamos coger y decir, ¿los alumnos tienen como relación de composición una cabeza? Pues sí, podríamos coger y definir aquí que tienen una cabeza. Sería correcto como atributo de clase de la clase alumno.
00:19:44
Pero lo que vamos a hacer va a ser aprovechar otra relación entre clases que es la de herencia para decir, definimos que toda persona tiene una cabeza, un alumno que es un tipo de persona la haremos hija de la clase persona y como hereda todos sus atributos directamente como herencia ya obtendrá el atributo de CAP de tipo cabeza como herencia de la clase persona.
00:20:03
Un poco la estructura podría ser esta, por herencia de arriba abajo y aquí podríamos decir los atributos que tiene una persona, que sería el nombre, en este caso la edad y en principio que tiene una cabeza, también podríamos decir una clase que fuese de tipo, de otros tipos, de tronco y extremidades, como fuera para piernas y todo esto.
00:20:33
En la teoría creo que habla también de un ave a la hora de explicar esto. Entonces dice, vamos a considerar la clase ave y la clase loro. Entonces podríamos decir, ¿un loro es una característica de un ave o es un tipo de ave?
00:20:54
más bien un tipo de ave, pues la respuesta que nos da la relación entre
00:21:19
ave y loro es que es un tipo de, pues entonces la relación
00:21:24
podría ser de herencia, y luego habrá por ejemplo de la clase
00:21:28
pico y alas, un pico es un tipo
00:21:32
de ave o es una característica que tienen las aves
00:21:36
pues si es una característica que tienen las aves, en este caso sería una relación de composición
00:21:40
esta es un poco la idea
00:21:44
Bien, fijaros, si tenemos la clase persona por aquí, entonces hemos utilizado una referencia, que no todavía una cabeza, porque para que exista la estructura de cabeza, sabéis que tendríamos que hacer el new, una referencia, es decir, a este logo le tendremos que hacer en algún momento un new para poder utilizar esta referencia a la cabeza.
00:21:48
Y en cuanto a la relación de herencia, lo que haríamos sería para indicar que una clase es hija de otra, que en principio es la clase padre, es decir, que el alumno va a heredar cosas de la clase persona, que es la padre.
00:22:08
la etiqueta que utilizamos es Stents.
00:22:24
Con Stents está la forma que tenemos de identificar
00:22:28
que un alumno en el código es un tipo de persona
00:22:33
y alumno será una clase que en esa estructura en árbol estará justo por debajo
00:22:37
de la clase persona. Y esta herencia, Stents
00:22:41
de persona, ya me garantiza que tengo disponibles
00:22:45
los atributos y métodos que están definidos
00:22:49
en la clase persona.
00:22:53
Imaginaos que tenemos aquí
00:22:56
pues yo que sé
00:22:57
public
00:22:59
voy a saludar
00:23:00
como siempre, siempre utilizamos los mismos métodos
00:23:02
la verdad para poner los ejemplos
00:23:05
ponemos aquí un hola
00:23:07
soy una persona
00:23:15
pues resulta que ahora
00:23:19
la clase alumno
00:23:21
por esta herencia
00:23:23
que estamos identificando aquí de la clase
00:23:25
persona
00:23:27
tiene estos atributos
00:23:28
y tiene un método disponible
00:23:33
mirad, si creamos aquí otra clase
00:23:37
por un momento
00:23:44
vamos a poner la clase humano, por ejemplo
00:23:47
podríamos decir también que un alumno
00:23:51
es
00:23:58
un tipo de humano, ¿verdad?
00:23:59
Y que un profesor es un tipo
00:24:03
de humano, viene a ser algo equivalente
00:24:05
a la clase persona. Entonces
00:24:07
podríamos estar tentados de coger y decir
00:24:09
fijaros, la clase
00:24:11
humano, pues un humano también podría
00:24:12
tener un nombre.
00:24:15
Y un humano
00:24:19
también podría saludar. Voy a hacer copia y pega
00:24:20
de este saludar.
00:24:23
Fijaros que el programa
00:24:34
me compila perfectamente. Bueno, pues si está en una clase humano
00:24:35
podríamos darle un nombre y podremos llamar al método saludar
00:24:38
de la misma forma que podemos hacerlo con la clase persona.
00:24:41
La clase alumno, dentro del diseño de nuestro programa,
00:24:45
hemos decidido que herede de persona. Pero podríamos decir
00:24:47
oye, un alumno, las características, imaginaos
00:24:50
que los alumnos, los humanos, yo que sé,
00:24:54
que deciros, pues tienen un método también aquí
00:24:57
que es el método respirar.
00:24:59
Lo hemos implementado justo
00:25:03
a ver, voy a ponerlo siguiendo el formato que tenemos con minúscula, que si no, así, pues en la clase humana resulta que también definimos el método respirar y aquí pondríamos el código correspondiente a la acción de respirar, el que estuviera definido en nuestro programa, código en Java para respirar.
00:25:05
Entonces podríamos decir, oye, si un alumno también es un humano
00:25:37
y me apetece tener disponible el método respirar que se ha definido en la clase humano,
00:25:41
entonces podríamos tener la tentación de coger aquí y decir, pues mira,
00:25:47
que herede de persona para heredar ciertas cosas y además herede de humano también para,
00:25:50
y así ya tengo la posibilidad de poder llamar al método respirar que lo tengo implementado en esta clase,
00:25:56
Ya que un alumno responde a esto de es un tipo de humano, pues esto no me deja, ¿verdad? Fijaros, dice que no le gusta esta coma, si quitamos la coma sigue sin gustarle y me dice por aquí que quite humano por aquí.
00:26:03
¿Cuál es el motivo? Pues que en algún lenguaje de programación sí que está permitido y bueno, y vete a saber cómo lo terminan gestionando, pero Java coge el criterio de decir que una clase no puede tener herencia múltiple.
00:26:22
La herencia es única y exclusivamente la que tengamos aquí definida de una clase padre solo. ¿Y cuál es el motivo que se argumenta? Pues el motivo que se argumenta es este, que una persona, la clase persona, tiene un método saludar donde sacaría un hola soy una persona y la clase humano está diciendo hola soy humano, el mismo método.
00:26:36
¿Qué sucede si hacemos una herencia múltiple de varias clases? Que si yo cojo y defino un objeto de la clase alumno y llamo al método saludar, por herencia, como él no lo tiene aquí escrito, por herencia intentaría localizar ese método saludar.
00:27:00
y resulta que tendría dos opciones y volveríamos a esas ambigüedades
00:27:16
que estamos ya acostumbrados a ver que Java no nos las acepta
00:27:21
porque diría, oye, si yo tengo un método saludar desde la clase persona
00:27:24
y un método saludar desde la clase humano, con esta ambigüedad, ¿cuál de los dos
00:27:28
utilizo? ¿Cómo lo resolvemos? Pues obligando
00:27:32
a que la herencia sea única. Si es única, ¿qué es lo que
00:27:36
pasa? Pues que ahora ya no hay ambigüedad. Si he decidido que herede la clase
00:27:40
persona y llamo al método saludar, me sacará este. Y si por el contrario he decidido que herede la clase
00:27:44
humano, fijaros como también me compila, también le vendría y llamo al método saludar, pues me saludará
00:27:51
como este sin amigudad ninguna. Con toda seguridad al heredar de humano diría hola soy un humano.
00:27:58
Bueno, esto lo enseño para argumentar que la herencia no puede ser múltiple. Leyendo la teoría,
00:28:06
Bueno, pues nos dice, y también lo he comentado yo alguna vez, que hay una herencia implícita, esta, bueno, aquí la ponemos de forma explícita de quién queremos heredar a través de la etiqueta stent, pero hay una herencia implícita, es decir, que toda clase disponible en Java siempre tiene un comportamiento de herencia desde la clase object.
00:28:15
que si tenemos, ya os digo, una estructura en árbol de padres, hijos, hijos, nietos, bisnietos
00:28:37
y todo esto es la que está arriba del todo, la clase object en Java.
00:28:44
Entonces, de esta clase object, características de esta clase heredan todas.
00:28:51
Todas las clases la tienen de forma implícita.
00:28:56
Es decir, eso de que solamente tenemos características heredadas desde una clase
00:28:59
que identificamos con la etiqueta stents es un poquito mentira
00:29:03
desde el momento en el que sí que tenemos
00:29:07
la posibilidad de utilizar cosas de forma heredada
00:29:09
desde la clase Object. Pero bueno, es
00:29:13
la clase Object y la que pongamos nosotros aquí.
00:29:16
Y no herencias a través de
00:29:20
más clases, pues, porque no
00:29:22
para que no se produzca esa situación que
00:29:24
hemos visto antes con el método saludar.
00:29:28
Y vamos a crear otra clase aquí que sea principal.
00:29:33
y en esta clase vamos a decir que meta el main
00:29:35
que yo creo que lo podemos identificar por aquí
00:29:44
aquí en Eclipse
00:29:45
aquí tenemos el main
00:29:47
de nuestro programa
00:29:51
entonces aquí podríamos coger y definir
00:29:53
un objeto de la clase alumno
00:29:56
mi alumno igual a new
00:29:59
alumno
00:30:05
como siempre el new para hacer la reserva del espacio de memoria
00:30:07
y llamamos a un constructor, como no hemos escrito
00:30:11
ninguno en la clase alumno, pues tiene uno por defecto
00:30:16
que es este, en cuanto escribamos uno el de por defecto desaparece y ya tenemos
00:30:20
que utilizar alguno de los definidos dentro de la clase
00:30:24
fijaros que la clase alumno la tenemos completamente vacía
00:30:27
aquí en cuanto a código, pero decimos que estamos heredando
00:30:32
vamos a poner de humano, vamos a poner de persona
00:30:36
humano lo había puesto, lo había creado para que vierais que no me dejaba
00:30:39
compilar con herencia múltiple
00:30:46
entonces como hereda de persona, aunque aquí no tengo nada definido, tiene heredado
00:30:48
todos los atributos y los métodos que tenga
00:30:54
la clase persona, entonces si yo pongo mi al punto aquí
00:30:58
punto, fijaros como me ofrece los atributos
00:31:04
que tiene la clase Persona. Fijaros, todos estos, Equals, GetClass,
00:31:07
HasCode, Notify, NotifyAll, Saludar, no, ToString, todos estos métodos,
00:31:12
¿por qué me los estará ofreciendo Eclipse para el objeto de la clase
00:31:17
alumno si no los tengo definidos aquí? Pues los estará recibiendo
00:31:22
a través de alguna herencia. En la herencia que tenemos aquí
00:31:26
identificada de la clase Persona, ¿tenemos definidos todos esos
00:31:29
métodos? No, solamente el método Saludar. ¿De dónde nos estarán
00:31:32
viniendo al resto de métodos de la clase object entonces cualquier objeto que pongáis tendrá estos
00:31:35
métodos ecuas get class has code notify notify all to stream por ejemplo to stream hemos hablado en
00:31:42
algún momento de que es convertir el ahora después trabajamos con él incluso convertir el objeto a
00:31:48
una cadena caracteres para que salga cuando llames al método y además este método es el que se llama
00:31:56
con el println de forma escondida.
00:32:01
Estos tienen que ver con gestión de hilos que estudiaréis
00:32:05
en la asignatura de programación de servicios y procesos el año que viene
00:32:09
probablemente. Todos estos otros métodos los tiene heredados
00:32:13
desde la clase object. En cualquier caso vamos a utilizar
00:32:17
el que tenemos identificado en la clase persona ahora inicialmente.
00:32:21
Entonces si ejecutamos
00:32:26
me dice hola soy una persona, ha utilizado el método
00:32:28
que él no tiene definido, pero en cambio
00:32:34
por herencia lo tiene disponible de la clase persona y precisamente
00:32:37
este código es el que nos ha mostrado aquí. Una de las características que
00:32:42
si cogemos y decimos que la clase profesor
00:32:49
también no es una
00:32:53
característica de una persona, un profesor, sino que es un tipo de
00:32:57
Y como es un tipo de persona, lo consideramos a través de la relación entre clases de herencia, pues la misma jugada de un profesor. Entonces, si cogemos aquí en el principal y ahora en lugar de definir un alumno, definimos un profesor.
00:33:01
tenemos el saludar también de forma heredada
00:33:20
y los dos efectivamente
00:33:34
llaman al mismo método, ninguno de los dos tiene definido el método saludar
00:33:39
los dos lo tienen disponible a través de herencia de la clase persona
00:33:43
con lo cual el código que ejecutan ambos dos para saludar es este
00:33:47
y nos sacan por pantalla hola soy una persona y aquí tenemos en la consola
00:33:51
como resultado dos veces el mensaje, una vez cuando ha saludado al alumno
00:33:55
y una segunda vez cuando ha saludado al profesor.
00:33:59
Bueno, pues está estupendo tener ese método, pero
00:34:03
resulta que puede ser que, digamos, mira, este
00:34:05
método me parece suficiente cuando saluda a un profesor,
00:34:10
pero me parece un poquito serio cuando saluda
00:34:15
a un alumno, que tiene a lo mejor un lenguaje un poquito más informal.
00:34:19
Pues, ¿qué podemos hacer en ese caso? Pues, podríamos coger, quitar la herencia directamente e implementar aquí el método saludar, pero si quitamos la herencia, perdemos este método porque lo queremos tener propio, pero también perderíamos estas características que pueden seguir interesándome en la clase alumno.
00:34:24
entonces podemos decir, oye mira, voy a mantenerme
00:34:43
efectivamente como una persona, voy a mantener la herencia de persona
00:34:46
porque me interesa de la clase persona estos atributos y otros
00:34:51
métodos más que pudiera tener por aquí, pero en cambio la forma de saludar
00:34:54
ya os digo que me parece un poquito seria para un alumno, pues
00:34:58
lo que puedo hacer es sobrescribir el método
00:35:02
saludar, cuando sobrescribimos el método saludar podemos poner
00:35:08
aquí una etiqueta, a ver si me acuerdo
00:35:13
como era, overwrite creo que es
00:35:16
si ponemos aquí una etiqueta overwrite
00:35:17
es decir, sobre escribiendo
00:35:25
o sobre escrito, y ponemos aquí un método
00:35:26
lo que estamos haciendo, si no aparece
00:35:29
el comportamiento en java es
00:35:31
el mismo, también nos funciona
00:35:33
ahora os cuento para que nos puede
00:35:35
en que nos puede ayudar poner esta etiqueta
00:35:37
en el código, entonces si yo
00:35:39
cojo ahora aquí dentro de la clase alumno y
00:35:41
sobre escribo
00:35:43
ponemos aquí hola qué tal así para que sea un poquito más informal como saluda el alumno yo
00:35:44
me vengo ahora ejecuto aquí y fijaros que como tengo sobre escrito en la propia clase el método
00:35:54
saludar en el momento que lo llamo antes de irse a buscar el método saludar que tiene disponible
00:36:00
por herencia desde la clase persona localiza a ver si tiene él un método saludar propio y si lo
00:36:06
tiene es el que utiliza. Entonces coge y llama al
00:36:12
método saludar propio y en cambio el profesor
00:36:16
que no ha implementado un método saludar, el único que tiene disponible es el de
00:36:20
por herencia desde la clase persona y por eso se mantiene aquí el mensaje
00:36:24
que nos mostraba el saludar de esta clase.
00:36:28
En cambio, el alumno muestra este otro. Esta es otra
00:36:32
de las características que tenemos en la programación orientada a objetos que es
00:36:36
la sobrescritura.
00:36:39
Si dentro de la clase persona,
00:36:52
imaginaos que, bueno, aquí simplemente es un mensaje
00:36:54
y estamos intentando que sustituya uno a otro,
00:36:56
pero imaginaos que,
00:36:59
bueno, imaginaos que, oye, pues
00:37:01
no es esto justo lo que quiero hacer, sino que
00:37:06
quiero utilizar el método saludar
00:37:08
de la clase persona, lo que tengan como
00:37:11
tal y como saluden las personas, pero además
00:37:12
de eso, quiero yo hacer más cosas aquí. Entonces, lo que
00:37:14
podemos hacer es sobreescribir el método y para que siga saludando como
00:37:18
la clase persona, podemos utilizar la etiqueta super.
00:37:22
Con la etiqueta super, lo que estamos diciendo es, llama al método
00:37:27
saludar, pero al método saludar de la clase padre.
00:37:30
Entonces, esto lo que ejecuta es el método saludar que tiene la clase padre
00:37:34
y luego como alumno, bueno, pues puedo hacer algunas cosas más.
00:37:38
lo que quisiera yo aquí con código Java.
00:37:42
Mejor escribir en una base de datos
00:37:47
cuando los alumnos saludan, aparte de mostrar el mensaje
00:37:50
hola, soy una persona, quiero que escriba en una base de datos
00:37:54
que ha saludado una persona o en un fichero o que
00:37:58
saque a través de un luminoso, lo que sea. Bueno, todo lo que podamos
00:38:02
programar aquí con Java lo podríamos poner. Para eso tenemos a nuestra disposición
00:38:06
en un método que estamos llamando en algún momento.
00:38:10
Aquí, bueno, para argumentarlo vamos a poner aquí otro mensaje
00:38:14
que sea, soy un alumno.
00:38:17
Entonces, si hacemos esta ejecución, fijaros cómo la ejecución
00:38:24
del saludar del alumno, como está sobrescrito, me llama
00:38:33
al saludar propio del alumno y el saludar propio del alumno
00:38:36
lo primero que hace a través de la etiqueta super que viene
00:38:39
a ser padre, llama al método saludar, me muestra lo que
00:38:43
hace el método saludar del padre y luego continúa ejecutando, dice
00:38:47
soy un alumno, por aquí, se acaba el saludar del alumno
00:38:50
y luego como saluda el profesor, ¿verdad? El profesor
00:38:55
que no tiene sobrescrito el método, pues el único
00:38:59
que utiliza es el que tiene disponible por herencia y me saca
00:39:02
el hola soy una persona. Bueno, pues para ver
00:39:07
la etiqueta super
00:39:10
el método este overwrite
00:39:12
fijaros
00:39:17
la etiqueta
00:39:18
el método no, la etiqueta esta overwrite
00:39:25
que ya os digo que no es imprescindible
00:39:27
imaginaos que yo pongo aquí public
00:39:29
estoy programando la clase alumno y digo
00:39:31
voy a sobreescribir un método
00:39:33
de la
00:39:35
en la clase alumno un método
00:39:35
de los que tenga heredados, en este caso
00:39:39
heredados de la clase persona
00:39:41
entonces si yo pongo aquí
00:39:42
saludor, en lugar de saludar, ¿vale?
00:39:45
¿Veis que se me queja? ¿Por qué? Porque le he dicho que este método
00:39:52
es un método que estoy sobreescribiendo de la clase padre y dice
00:39:56
la clase padre no tiene ningún método que sea saludor. Si quitamos este overwrite
00:39:59
no me compila por más cosas, vamos a poner aquí un public void
00:40:04
Si quitamos aquí este overwrite, fijaros que
00:40:11
ahora sí me compila. ¿Por qué me compila? Pues porque lo considera saludor
00:40:18
como un método de la clase alumno, no un método que está sobrescribiendo
00:40:22
de ningún sitio. Pero si pongo yo aquí el override, ya no me compila.
00:40:26
¿Por qué? Porque dice, está diciendo que lo siguiente que vas a identificar
00:40:31
es un método que vas a sobrescribir de la clase padre y la clase padre
00:40:34
no tiene ningún método saludor. No me gusta lo que estás haciendo.
00:40:38
Entonces, esta etiqueta, sin tener ninguna consecuencia
00:40:42
durante la ejecución en el programa, nos garantiza que si ponemos
00:40:46
el arroba overwrite, lo siguiente que estaremos poniendo es
00:40:51
un método que de verdad tiene heredado desde la clase padre y
00:40:55
nos evita un posible error como el que estoy cometiendo yo aquí
00:40:59
al poner saludor en lugar de saludar. Ya pongo saludar y ya me compila de nuevo.
00:41:03
¿Por qué? Porque saludar sí está disponible en el padre y en verdad lo estoy
00:41:07
sobreescribiendo. En relación a esta etiqueta
00:41:11
que os había puesto aquí, del overwrite.
00:41:16
más cosas que os puedo contar de esto
00:41:18
el super, el override
00:41:28
irme parando, si tenéis dudas o algo me vais diciendo
00:41:30
si alguna cosa no queda clara
00:41:34
las relaciones de composición y la relación de herencia
00:41:37
la herencia solamente puede ser desde una clase
00:41:41
aunque tenemos disponible herencia
00:41:45
desde la clase object
00:41:48
fijaros, aquí estamos utilizando
00:41:52
el método saludar, heredado por la clase, tanto profesor
00:41:55
alumno, desde la clase persona, podríamos poner
00:42:00
mi punto
00:42:04
a ver, mirad, string s
00:42:06
aus, ponemos aquí una variable auxiliar
00:42:11
ponemos aquí mi prof.toString
00:42:14
y ahora vamos a poner aquí un system.out.println
00:42:19
Println de SAUS.
00:42:24
Println, ahí está.
00:42:33
Fijaros, el método toString no está definido ni en el profesor,
00:42:35
ni en la clase que tiene identificada como herencia,
00:42:41
ni en la clase persona.
00:42:46
Pero en cambio, me compila.
00:42:47
¿Por qué me compila?
00:42:48
Pues bueno, porque toString lo tenemos disponible desde la clase
00:42:50
object.
00:42:54
A ver si no lo chiva por aquí.
00:42:54
Fijaros, aquí en esta primera parte nos dice que lo tiene disponible desde java.lang.object.toString, efectivamente, de la clase object.
00:42:55
Y dice, aquí devuelve un string que representa el objeto.
00:43:05
Este string lo hemos cargado en esta variable y lo vamos a mostrar aquí por pantalla.
00:43:12
Mirad, si le damos aquí a ejecutar, mirad lo que nos muestra.
00:43:16
nos muestra
00:43:20
que pertenece a un objeto de la clase profesor
00:43:22
y un código que probablemente tenga que ver
00:43:27
muy probablemente es un código identificativo
00:43:30
de este objeto y probablemente yo siempre digo
00:43:33
aunque no tengo una certeza al 100% que a lo mejor hasta tiene que ver
00:43:35
con la relación en memoria RAM de donde está
00:43:38
almacenada la información del objeto
00:43:41
gracias a que le hemos hecho un new por aquí
00:43:44
¿por qué nos muestra esto?
00:43:46
tan poco identificativo de lo que es un profesor.
00:43:50
Pues fijaos, nos muestra esto porque el método toString
00:43:55
lo está heredando desde la clase Object.
00:43:57
Entonces, y hemos dicho que cualquier clase que tengamos
00:44:01
en nuestro programa tiene disponible este método,
00:44:05
el método toString.
00:44:08
Entonces, pensad que el código que hayan implementado
00:44:10
en las librerías de Java para la clase Object,
00:44:14
en particular para el método toString,
00:44:18
Tiene que valer para cualquier tipo de objeto que se le ocurra hacer a cualquiera en Java.
00:44:20
¿Por qué? Porque cualquier tipo de objeto que se le ocurra a cualquiera en cualquier contexto en Java
00:44:27
tendrá heredado el método toString desde la clase Object.
00:44:32
En verdad, si buscamos algo que nos identifique a una persona con el toString o a un alumno,
00:44:36
a un profesor en este caso, pues estaríamos pensando más en alguna información de sus atributos.
00:44:44
En este caso no tiene ninguno profesor y por herencia tiene estos. Por ejemplo, el nombre. Pues diríamos, oye, que el toString nos devuelva mejor el nombre, ¿no? Y no esto. Porque esto, ¿qué me dice de un profesor en particular? Pues nada. O que me devuelva su edad, o que me devuelva el nombre diciéndome, tiene un nombre tal y su edad es no sé cuál, ¿vale? Pues eso sería algo más razonable para identificar un objeto de una persona que no esté dato.
00:44:49
pero si estamos utilizando
00:45:15
el toString heredado desde Object
00:45:19
no podríamos ir al código
00:45:21
de Object en las librerías
00:45:23
y decir devuélveme un nombre y una edad
00:45:25
porque en otro programa que también
00:45:27
tendrá un string heredado de ese mismo código
00:45:29
Object, pues igual estamos hablando
00:45:31
de algo que no tiene edad
00:45:33
o que no tiene nombre, yo que sé
00:45:35
de colores, es una clase colores
00:45:37
con los diferentes matices
00:45:39
o en esa decimal
00:45:41
justo si tendría
00:45:42
a lo mejor los colores un nombre
00:45:45
pero no tendría una edad
00:45:47
entonces si decidimos en la clase
00:45:48
object para que cuando herede
00:45:50
mi clase persona poner en el código
00:45:52
algo relacionado con la edad
00:45:55
de esa persona, ya no me valdría
00:45:57
ese toString para cuando lo esté
00:45:59
utilizando un objeto de la clase
00:46:01
colores que también hereda de la clase
00:46:02
object, entonces han tenido que buscar
00:46:05
en el toString
00:46:07
definido en la clase object algo que
00:46:08
me valga para cualquier clase en el mundo mundial.
00:46:11
Entonces, todas las clases con toda seguridad tendrán un nombre
00:46:13
y un identificador.
00:46:16
Para particularizar en mi programa este toString,
00:46:19
¿qué es lo que puedo hacer?
00:46:22
¿Qué es lo que he hecho para particularizar el método saludar
00:46:23
en la clase alumno respecto a lo que tenía el método saludar
00:46:26
de la clase persona?
00:46:31
Pues le he hecho una sobrescritura.
00:46:32
Entonces, yo podría coger aquí y decir overwrite.
00:46:34
Esto es opcional solo.
00:46:37
public string
00:46:38
to string
00:46:42
a ver de que se me queda
00:46:44
bueno, me está diciendo que devuelva
00:46:56
y por ejemplo puedo poner aquí un return
00:46:58
hola
00:47:00
que es lo que estoy haciendo
00:47:02
un alumno, perdón lo he puesto
00:47:06
en la clase alumno y en el otro sitio
00:47:09
lo hemos utilizado
00:47:11
con la de profesor, no venimos aquí a la profesor
00:47:13
la misma jugada
00:47:15
Un profesor, sabíamos que tenía este método disponible y antes de sobrescribirlo, lo tenía disponible heredado desde Object. Ahora, ¿qué he hecho con el profesor? Pues lo he sobrescrito y este toString que hace devuelve hola.
00:47:17
ejecuto por aquí, fijaros como ya en lugar de salirme ese código
00:47:33
ya utiliza en primer lugar la forma
00:47:40
en la que hemos puesto el toString para la clase
00:47:44
profesor, a ver vamos a poner aquí, no sé si
00:47:49
super para los, si mirad, si ponemos aquí un super de toString
00:47:52
pues se irá a buscar el del padre que en principio sería el de la clase
00:47:56
object, el toString de esta clase lo que estará
00:48:00
haciendo será devolver un string. Vamos a mostrarlo por pantalla.
00:48:09
En este caso la ejecución ahora la repasamos otra vez si es necesario.
00:48:25
Fijaros que ahora ya lo que hace es mostrarnos lo de la clase
00:48:30
object. Aquí en la clase profesor
00:48:33
el método toString lo que hemos dicho ha sido, oye, devuélveme
00:48:37
lo que devuelve el toString de la clase
00:48:41
Padre, que lo tiene heredado desde la clase Object.
00:48:45
Como devuelve un string, el toString, hemos dicho que lo muestre por pantalla.
00:48:49
Y luego lo que hemos hecho ha sido hacer un return de hola.
00:48:54
Este system out me ha mostrado esto
00:48:58
y este return de hola lo ha cargado
00:49:00
en esta variable souse y este otro system out es el que me lo ha escrito por pantalla.
00:49:04
Es decir, hemos cogido el control de lo que devuelve el
00:49:09
toString y lo hemos particularizado para lo que queremos que pase
00:49:15
cuando se llame al método toString de la clase Persona. ¿Cómo? Sobrescribiendo
00:49:18
el que tiene heredado, que en este caso era una herencia de la clase
00:49:23
Persona en la clase Profesor, sino lo tenía heredado desde la clase
00:49:27
Object. Vale, pues ya, hola, soy un profe. Vamos a poner aquí
00:49:31
soy un profesor. Ejecutamos
00:49:37
y efectivamente ya es algo
00:49:46
que nos dan más pistas de lo que diría
00:49:49
con el toString un profesor que si ponemos esto. Pero si tenemos
00:49:53
15 profesores y en el toString decimos hola soy un profesor
00:49:57
todos ellos me van a decir hola soy un profesor.
00:50:02
Entonces, ¿qué podemos hacer? Pues podemos aprovechar información de cada uno
00:50:06
de los profesores en particular. ¿Y dónde tenemos particularizado cada uno de los profesores?
00:50:10
En sus atributos. Entonces, si para este
00:50:14
profesor antes de llamar a saludar cogemos y le
00:50:18
decimos que su ese nombre si tuviéramos privadas estas estos
00:50:22
atributos lo daríamos con setters y getters pues decimos que es valeria su
00:50:27
nombre y mi prof punto y edad
00:50:33
Decimos que tenga 13 años, pues ahora cuando llamemos al método toString, por aquí, podemos coger y decir que, bueno, un profesor de 13 años hemos dicho, pero bueno, podríamos decir que lo que devuelva, en lugar de ser una cadena así directamente, pues sea un hola, soy.
00:50:39
Y aquí aprovecho y en esta cadena aprovecho y le meto información de sus atributos. Ese nombre y tengo y edad. Antes de hacer el retune del stream, pues aprovechará y hará esta transformación.
00:51:09
entonces si ejecutamos por aquí, fijaros como ahora ya dice
00:51:39
hola soy Valeria y tengo 13 años, ese toString inicial que teníamos
00:51:44
que decía que era de la clase profesor
00:51:48
y un identificador, hemos conseguido particularizarlo
00:51:52
para cada uno de los profesores
00:51:56
mediante la acción de identificar
00:51:59
en la programación orientada a objetos que es la sobrescritura de métodos
00:52:04
y particularizándolo de esta forma.
00:52:07
¿Qué hemos hecho? Hemos llamado un método toString
00:52:15
que devolvía un string,
00:52:17
que es como está identificado en la clase object.
00:52:20
En particular, el método toString ya hemos hablado
00:52:23
y lo que hemos hecho ha sido capturar lo que devuelve ese string
00:52:25
que devuelve el método toString en una variable
00:52:29
y luego mostrar la información de esa variable.
00:52:31
El método toString, en particular, aparte de esta función
00:52:35
que acabamos de ver que tiene es el que se utiliza
00:52:38
directamente Java
00:52:42
considera cuando nosotros ponemos aquí
00:52:45
el nombre de un objeto, miProf
00:52:48
ponemos esto solo, lo que hace es buscar
00:52:49
el método toString para cargarlo en el
00:52:54
System.out.println, entonces si ponemos esto fijaros como al ejecutarlo
00:52:57
me saca esa información
00:53:00
del toString, es decir lo mismo que habíamos hecho aquí en dos pasitos
00:53:03
que era, oye, tu string me devuelve lo que hayamos programado en ese método dentro de la clase profesor.
00:53:06
Lo voy a guardar ya que devuelve un string, que es lo que hemos puesto aquí, que devuelve un string.
00:53:13
Lo voy a guardar en una variable auxiliar string y luego escribo lo de la variable auxiliar.
00:53:19
Pues si directamente ponemos aquí la referencia a la clase profesor, aunque tengas más métodos identificados por aquí,
00:53:25
Java lo que hace siempre cuando integras una referencia dentro de un println es buscar el toString, que es precisamente lo que muestra aquí. Por eso es un método importante y por eso, por ejemplo, es un método disponible en toda clase que tengas, toda, toda lo tiene disponible, la forma de tenerlo disponible toda clase, aunque tú no lo escribas, es mediante enencia de object, porque cualquier referencia la puedes poner en el println.
00:53:32
Y si no estuviera disponible por herencia desde object, los programas no nos compilarían. Más allá de que si no lo sobreescribimos, la información que nos dé no sea muy significativa en este caso de un objeto de la clase profesor.
00:54:00
Pero sí, al tenerlo de herencia, aunque sea una información muy general y no muy útil, permite, nos garantiza que a través de esa herencia cualquier println no va a funcionar porque lo que utiliza aquí es el método toString y lo tiene todo objeto heredado desde la clase object.
00:54:14
¿Sí? ¿Se entiende? ¿Más o menos? ¿No hay dudas de momento? No, vale. Vale, pues nada, esto tenemos con la herencia.
00:54:31
Otra de las características que tenemos en la programación orientada a objetos es el polimorfismo.
00:54:54
Morfismo. ¿Esto qué nos permite? Pues fijaros, si nosotros cogemos y definimos aquí en el main un objeto de la clase persona, en este contexto una persona, según el enunciado de un posible ejercicio que estuviéramos haciendo, pues diríamos, hay un ejercicio, en este ejercicio van a participar alumnos y profesores.
00:55:01
Ambos dos son personas con estas características en común. Estas características en común de alumnos y profesores serían las que podríamos poner en la clase persona, ya que los dos luego van a heredar de la clase persona, pues solo los escribimos ahí en un sitio.
00:55:41
Y luego el enunciado podría continuar diciendo, los alumnos tendrán su número de matrícula como atributo, mientras que los profesores tendrán su número de cuenta para cuando les ingresen la nómina.
00:55:55
Los alumnos, como desafortunadamente no cobran por estudiar, pues no tienen nómina y los profesores no tienen número de matrícula porque no se han matriculado en ningún curso. Entonces, todas aquellas cosas comunes las podríamos poner en la clase persona y las particulares en la alumno y en la de profesor. Por herencia, las comunes las tendrían desde la clase persona por herencia a través del Stents que hemos puesto aquí al definir la clase tanto en una como en otra.
00:56:06
Imaginaos que arrancamos el programa y este programa consiste en que solamente se va a conectar un alumno o un profesor, uno de los dos
00:56:35
Y a través de esa conexión va a saludar
00:56:47
Pero al principio podríamos no saber si va a ser un alumno o un profesor
00:56:56
Imaginaos una clínica veterinaria que cuida a gatos y perros y cada día le pueden venir, a lo mejor atiende hasta dos animales cada día y le puede venir un gato, un perro, dos perros o dos gatos.
00:57:01
Entonces, si yo cojo y defino aquí de forma directa alumnos, o lo que sería en el otro caso gatos, como va a ser uno solo, mi al igual a new alumno, pues ya mal iría, porque si quien saluda hoy es un profesor.
00:57:13
Y si defino un profesor, mal iría si lo que defino aquí es un alumno. Pero en cambio, tanto si es un profesor como un alumno, pues está claro que va a ser una persona.
00:57:32
Entonces, tenemos la posibilidad de definir una persona y que luego esta referencia a persona coja bien la forma de alumno o bien la forma de profesor para seguir ejecutando el programa.
00:57:43
Entonces, ahí viene el tema un poco de lo que definimos como poliformismo.
00:57:57
Bueno, normalmente lo que haríamos es que si, imaginaros que vamos a tomar aquí el criterio de selección que lo metemos por teclado, pero a lo mejor sería que leemos un fichero, bueno, el criterio de selección podría ser uno u otro.
00:58:02
Aquí vamos a decir si lo que entra es un alumno al final en la ejecución de este programa o es un profesor. En tiempo de ejecución, no en tiempo de desarrollo del programa ni en tiempo de compilación, sino ya en tiempo de ejecución vamos a meter por teclado, cuando estemos ejecutando el programa, si quien entra hoy es un alumno o un profesor.
00:58:27
Y así esta persona cogerá la forma de alumno o cogerá la forma de profesor. Esto que vamos a identificar es la forma que vamos a utilizar a través de teclado para identificar que es una persona, pues bueno, podría ser a través de, bueno, yo qué sé, de un lector de cámaras que de repente identifica si es un chico o una chica según tiene barba o no tiene barba o yo qué sé qué deciros o si lo lee de una base de datos y resulta que en la base de datos para el día de hoy justo la entrada dice que era un chico o que era una chica.
00:58:46
Como aquí no tenemos para leer de base de datos de momento ni la cámara para hacer una identificación, pues lo vamos a capturar desde teclado.
00:59:22
Entonces aquí cogemos y decimos un System.out.
00:59:30
Decimos para arrancar el programa, oye, mira, lo que quiero es que sea una persona.
00:59:40
Aquí pongo miper.saluda.
00:59:46
Fijaros que quien saluda es el objeto de la persona.
01:00:03
indica chico o chica
01:00:06
chico o chica no, es alumno
01:00:29
alumno o profesor
01:00:33
mi scan.nextline
01:00:36
y ahora aquí cogemos y hacemos un casting
01:00:47
al tipo de objeto que sea, entonces decimos
01:01:05
ese, si ese aus punto
01:01:07
compare to, si es
01:01:11
no vamos a validar mucho, vamos a decir chico en minúsculas
01:01:15
chico no, alumno o profesor
01:01:20
entonces aquí cogemos y decimos mi per
01:01:29
que sea, a ver
01:01:34
aquí no lo hacemos el new, vale, y aquí cogemos
01:01:41
y aquí decimos miper que sea igual a new
01:01:46
alumno
01:01:48
en lugar de compare tú vamos a poner equals
01:01:49
método equals
01:01:56
si no es un alumno, es un profesor
01:01:58
entonces lo que hacemos
01:02:08
es definir
01:02:09
me falta el new
01:02:14
lo que hacemos es definir
01:02:17
una referencia, una persona
01:02:20
no lo hacemos el new, había puesto el new persona antes
01:02:21
no se lo hacemos, y terminamos haciéndole un new
01:02:24
para decir, oye, esta persona, según el contexto
01:02:27
del programa, según haya ido, aquí lo estamos cogiendo por teclado
01:02:30
pero podría ser mediante algún otro mecanismo, ¿verdad?
01:02:33
Termina siendo un alumno esa persona
01:02:36
coge la forma, poliformismo, es la característica
01:02:39
de la programación orientada a objetos de la que estamos hablando
01:02:42
de un alumno o coge la forma de un profesor
01:02:45
¿Y quién saluda? Saluda mi per
01:02:48
Fijaros que este código es genérico
01:02:51
y en una ejecución resultará ser un alumno y en otra será un profesor.
01:02:53
Y aquí cuando lo hemos definido a la referencia también lo hemos hecho genérico.
01:03:02
Es decir, todo el código es genérico menos en el momento en el que tomamos la decisión
01:03:05
de si esa persona va a actuar como alumno o como profesor.
01:03:10
Va a coger una forma u otra.
01:03:12
Entonces le damos aquí, a ver, salvo por aquí, le doy aquí a ejecutar
01:03:16
Y digo que sea un alumno, y si digo que sea un alumno, pues entonces fijaros cómo ha llamado, a pesar de que hemos utilizado el objeto de la clase, perdonad un segundo.
01:03:22
Natalia, tenemos... Ah, vale, bueno.
01:03:38
No, no, en absoluto, en absoluto.
01:03:51
No, no, no me molestas, no, no te preocupes.
01:03:54
Continúo.
01:03:58
Pues nada, fijaros cómo aquí, en realidad, este saludar, si nos fijamos en este miper y vemos que hemos definido una referencia a la clase persona, lo previsible sería que el saludo dijese hola, soy una persona, ¿verdad?
01:03:59
Bueno, a ver aquí en el principal. Bueno, me ha mostrado los dos, en realidad. Hola, soy una persona y soy... No, a ver, perdón. Lo que ha hecho ha sido el alumno, porque tenemos aquí llamando al super.
01:04:19
Quito el super este, saludar, vuelvo a ejecutar, pues si es un alumno, lo previsible, en principio, si no estuviéramos considerando la característica de sobrecarga de la programación orientada a objetos,
01:04:30
al haber definido mi per como una referencia a persona, sería que este saludar, pues si no viéramos esta parte del código, tendríamos la tentación de coger y venirnos a la clase persona y decir,
01:04:47
Al saludar me va a decir, hola, soy una persona, pero nos ha dicho, hola, soy un alumno.
01:04:58
¿Por qué? Bueno, pues porque hemos decidido hacer el new de un alumno.
01:05:02
Entonces, el método que en realidad ha utilizado ha sido el método saludar de la clase alumno.
01:05:12
Si os fijáis, aquí le estamos haciendo como alternativa el new sobre la clase profesor.
01:05:20
Entonces, si hacemos una nueva ejecución, aquí ahora decimos que lo que queremos es que sea un profesor, nos dice hola, soy una persona. En realidad nos está saludando como saludan los profesores. Si nos vamos a la clase profesor, el método saludar no existe. Como no existe, ¿cuál utiliza? El que tiene heredado de la clase persona, entonces nos ha dicho hola, soy una persona, pero ha saludado como si fuese un profesor.
01:05:26
si en la clase profesor sobrescribimos el método
01:05:51
saludar de la clase persona para garantizar que
01:05:56
efectivamente está saludando como un profesor y no como una persona ya que nos ha sacado este texto
01:06:00
nos venimos por aquí, podemos poner la etiqueta
01:06:04
overwrite esta para garantizar efectivamente que no
01:06:09
nos hemos equivocado y si que estamos sobrescribiendo algo
01:06:13
y ahora en la clase profesor respecto al comportamiento que teníamos de la clase
01:06:16
persona, lo modificamos y decimos, hola, soy un profesor.
01:06:21
Entonces, hacemos una nueva ejecución y vamos a hacer el new.
01:06:27
Vamos a darle forma de profesor a algo que inicialmente
01:06:31
era una referencia a una persona. Le digo
01:06:35
profesor por aquí. Y fijaros cómo efectivamente ya su comportamiento
01:06:38
no es como el de una persona, sino el método
01:06:43
saludar actúa como lo tenemos sobrescrito. Dice, hola, soy un profesor.
01:06:48
Bueno, pues esto es otra de las características de la programación orientada a objetos que nos hace referencia a este tema y que tiene que ver con el polimorfismo, es decir, un objeto definido en el programa de una determinada forma puede coger las diferentes formas de objetos de aquellas clases que son hijas suyas.
01:06:53
Es decir, que la tiene identificada con Stents como hijas gracias a la etiqueta Stents, ¿verdad? De la clase padre.
01:07:18
Claro, sí. La idea de esto es, aquí yo tengo capacidad de que un objeto coja diferentes formas. Fijaros cómo estamos haciendo que coja la forma de alumno a través de la característica de polimorfismo de la programación orientada a objetos.
01:07:27
Que coja la forma de alumno o que coja la forma de profesor. Este if que he puesto aquí lo hemos capturado desde teclado mediante un objeto de la clase escáner, pero podría haber sido por diferentes medios. Imaginaros que los días lunes, miércoles y viernes saludan los profesores y los martes y los jueves saludan los alumnos.
01:07:56
pues aquí podríamos coger del sistema el día que es
01:08:17
y según una cosa, por decir, oye, pues si el lunes, miércoles o viernes,
01:08:21
que sea un alumno, y si el jueves o martes, que sea un profesor.
01:08:24
Aquí es donde tomamos la decisión de que un objeto tome una forma en particular.
01:08:29
Pero aquí el código es general y aquí el código es general.
01:08:34
Aquí yo no he puesto código particular para que sea un alumno
01:08:38
ni para que sea un profesor, ni aquí tampoco, en todo esto.
01:08:42
Entonces, ¿en qué momento se aplica el polimorfismo a un objeto que de inicio era un objeto de la clase persona?
01:08:46
Pues se aplica cuando hacemos el new al identificar que tome forma de alumno o que tome forma de profesor.
01:08:53
¿Sí?
01:09:04
Eso es, claro, claro.
01:09:10
Claro, ¿por qué?
01:09:13
Ahora intentamos a ver si nos deja Eclipse que compile si no es hija.
01:09:16
Vamos a intentarlo, yo creo que no nos va a dejar, pero bueno, vamos a buscar un poco un razonamiento antes de coger e ir con el código a ver si nos compila o no.
01:09:20
Fijaros que aquí lo que estamos llamando es a un método saludar que está disponible en la clase persona.
01:09:29
Si yo utilizo aquí un saludar y aquí le hago un new de algo que no sea su hijo, esa otra clase que no es su hija podría no tener el método saludar.
01:09:38
En cambio, todo aquel que sea su hijo, con toda seguridad, tiene el método de saludar porque o bien lo tiene sobrescrito o como poco lo tiene heredado de la clase padre.
01:09:49
Imaginaos aquí la clase humano. Tiene la clase saludar, el método de saludar. Se lo voy a borrar para que no exista.
01:09:59
saludar
01:10:06
si yo cojo y aquí cojo
01:10:08
y quiero que
01:10:10
esta referencia a la clase persona
01:10:12
en realidad se comporte como un humano
01:10:14
cuando llegase aquí y dijese
01:10:16
igual que aquí se estaba comportando
01:10:18
como un alumno, como un profesor
01:10:20
si al llegar aquí fuese un humano
01:10:21
cuando llamo al método saludar, el programa me diría
01:10:23
saludar, que saludar
01:10:26
si tú no tienes definido aquí saludar
01:10:28
ni lo tienes disponible por herencia
01:10:30
de ningún sitio, pues eso no me vale
01:10:32
¿lo veis?
01:10:34
vamos a intentar aquí a ver si nos deja hacer un new
01:10:38
pero yo entiendo que no
01:10:45
porque no, vamos, fijaros que directamente
01:10:47
ya no me deja el IDE, a ver que nos dice
01:10:51
dice no puedes convertir un humano a una persona
01:10:53
no puedes coger esa forma
01:10:56
no puedes utilizar la característica de poliformismo
01:10:59
por eso simplemente, directamente no nos deja
01:11:01
y si queremos buscar una explicación lógica, pues podría ser esta que te cuento
01:11:04
Un humano no podría saludar porque no tiene código para saludar, ni implementado ni heredado. En cambio, todo aquel que sí que herede de persona, obvio, lo tiene sobrescrito y ejecutará este código, pero si no lo tiene, lo tendrá disponible por herencia desde la clase principal, que es la clase para la cual hemos definido aquí la referencia al objeto, miper en este caso.
01:11:09
claro, es que este es el momento
01:11:36
en el que aplicamos polimorfismo
01:11:52
que haces el new para que se comporte como un alumno
01:11:53
o haces el new para que se comporte como un profesor
01:11:57
si no haces este new
01:11:59
¿qué es lo que tienes?
01:12:01
pues lo que tienes es
01:12:04
un programa normal sin polimorfismo
01:12:05
pues tendrías una persona que saluda
01:12:08
y como quien saludaría
01:12:11
pues bueno, aquí no me compila
01:12:12
porque no le he hecho aquí el new para que sea una persona, ¿verdad?
01:12:14
Pero como me saludaría como una persona y ya está.
01:12:17
Sería una persona sin polimorfismo ni nada.
01:12:20
Entonces la característica de polimorfismo es
01:12:22
no la proporciona en este momento hacer un new o hacer otro.
01:12:24
¿Sí? ¿Se entiende? Vale.
01:12:34
Bueno, pues aprovechéis los foros y volvéis a preguntar.
01:12:40
Acordaros que os respondo gustosamente,
01:12:43
pero aunque fuera un poco menos gustosamente me pagan por esto,
01:12:45
así que no me queda más remedio.
01:12:48
así que los aprovecháis y me preguntáis por ahí.
01:12:49
Bueno, mirad, introducido un poco el polimorfismo, hemos hablado en esta tutoría
01:12:53
de varias características de la programación orientada a objetos, polimorfismo ahora,
01:12:59
hemos hablado de la ocultación o, como lo decíamos, cuando teníamos el código oculto
01:13:03
y simplemente veíamos una clase daba la cara a una clase y, por tanto, los objetos,
01:13:11
cuando llamábamos a métodos y atributos, daba la clase a través de su protocolo, su interfaz.
01:13:16
También hemos hablado de la sobrecarga, que hemos sobrecargado el método saludar.
01:13:22
Cuando no estamos hablando de Java y estamos hablando de programación orientada a objetos
01:13:28
y te explican lo que son las clases, lo que son los objetos, lo que son las características,
01:13:32
pues hay cinco o seis conceptos que son los que de base definen la programación orientada a objetos.
01:13:36
Y estos tres, la extracción era este que te oculta la información para que no la veas y simplemente interactúes con los objetos a través de sus interfaces. Pues estos conceptos de programación orientada a objetos, los diferentes lenguajes, si quieren ser realmente lenguajes basados en este concepto, pues tienen que implementarlos.
01:13:41
y ahora estamos viendo, por ejemplo, cómo Java implementa algunos de ellos.
01:14:04
Y otra cosa que también habíamos hablado algún día
01:14:12
son las clases abstractas y de la mano de las clases abstractas
01:14:15
los interfaces, que vendrían a ser como unas especies de clases abstractas
01:14:20
un poquito más llevadas al último extremo.
01:14:25
Vamos a repasar un poco estos conceptos, que también os habla de ellos en este tema.
01:14:27
Tú dentro de una clase es posible que definas aquí
01:14:33
mediante algún método, mediante la etiqueta abstract, public, abstract, despedir y pones aquí un punto y coma.
01:14:37
A ver, tenemos que decir si devuelve algo, abstract, voy, despedir no devuelve nada, a ver, ¿por qué todavía no me compila?
01:14:50
Voy a ponerlo con minúscula, aunque ese no es el motivo por el que no compile.
01:15:01
vale, bueno, puedo definir un método abstracto
01:15:04
y aquí ahora mismo no me está compilando porque me dice, oye, si tú tienes en una clase
01:15:13
un método que sea abstracto, fijaros que no me compila tampoco, la clase también
01:15:17
tiene que ser abstracta, vale, ya me compila, fijaros que cuando he definido
01:15:21
el método despedir, como, y le he puesto la etiqueta
01:15:27
abstracta, el resto de etiquetas ya las conocemos, el public y el void
01:15:31
me ha obligado también a poner que la clase sea abstracta
01:15:35
He puesto, después de la asignatura o encabezado de este método, he puesto un punto y coma y no, como solemos hacer al uso, la apertura y cierre de llaves con el código que realmente se ejecuta cuando llamamos a ese método.
01:15:39
Es decir, aquí no he dicho lo que tiene que pasar cuando un profesor se despide.
01:15:52
¿Y para qué hago esto? Pues parece un poco inútil si no lo explicamos un poquito más, cosa que vamos a hacer ahora.
01:15:56
aquí lo que estoy diciendo es cuando haya algo que sea un profesor
01:16:05
pues quiero que mediante el método este sobre escrito
01:16:10
el toString se comporte de esta forma, tenga unos determinados
01:16:13
esperad porque esto, más que aquí lo quería meter en otra clase
01:16:17
voy a quitarlo de aquí y me lo voy a llevar a la clase, no profesor sino a la clase
01:16:22
persona, también podría estar en la otra pero para contarlo
01:16:26
me facilita la cosa tenerlo aquí, entonces cuando
01:16:36
algo sea una persona, yo podré saludar
01:16:40
mediante esto, tendrá estas características, pero el hecho de definir
01:16:44
la clase abstracta, lo que me permite es
01:16:48
definir métodos que sean abstractos, y estos métodos abstractos lo que hago es
01:16:51
no identificar el código que va a tener en respuesta a la llamada a este método.
01:16:55
¿Para qué sirve esto? Pues esto me sirve para que
01:17:01
las clases que sean hijas de la clase
01:17:03
persona, en este caso la clase alumno y la clase profesor, estoy de alguna
01:17:08
forma obligando a que estas clases, toda clase que quiera ser hija de la clase
01:17:12
persona, heredará sus atributos y sus métodos
01:17:16
pero además tienen que firmar conmigo un contrato, como si sacáramos
01:17:20
ahí un papel y delante del notario echáramos una firma, oye tú si quieres ser alumno
01:17:24
hijo mediante STEM de la clase persona, obligatoriamente
01:17:28
tendrás que ser capaz de despedirte, yo no te voy a decir cómo, pero sí
01:17:32
que quiero que te puedas despedir y si no, olvídate de ser
01:17:36
una clase hija mía, ¿vale? ¿Cómo te tienes que despedir? Yo no te lo estoy
01:17:40
diciendo. ¿Cómo tienes que saludar? Si no lo escribes, saluda así.
01:17:44
Esto sí, pero el despedirte no te lo voy a decir,
01:17:48
pero sí que quiero que tengas esa posibilidad de despedirte. Fijaros cómo desde el
01:17:52
momento en el que hemos metido el método despedir como clase abstracta,
01:17:56
la clase alumno ha dejado de compilarme y la clase profesor también ha dejado de
01:18:00
compilar. ¿Por qué? Porque ahora son hijas de una clase abstracta con algún
01:18:04
método sin implementar. Y es eso en lo que consiste
01:18:08
la clase abstracta. Es un acuerdo de, no te voy a decir
01:18:13
cómo, pero despídete. ¿Por qué? Pues porque
01:18:17
toda persona en el programa en general, cuando instancie un objeto de la clase
01:18:20
alumno, tendrá que tener a través del interfaz de la clase alumno la posibilidad
01:18:25
de despedirse. Si yo no te pongo aquí esto como abstracto,
01:18:29
como no lo tienes heredado, si tú no lo implementas aquí en tu código,
01:18:33
luego igual alguien que instancie un alumno y quiera llamar al método de despedir
01:18:37
no va a ser capaz. ¿Por qué? Porque ni existe en la clase alumno ni lo tiene disponible
01:18:41
por herencia. Pero si lo pongo así, pues ya te obligo.
01:18:45
Entonces, si vengo aquí a la clase alumno ahora, nos ayudamos
01:18:50
del IDE, que siempre nos ha hecho una mano estupenda para estas cosas,
01:18:53
pues fijaros cómo al ponerme sobre el error me dice que
01:18:58
añada los métodos que están sin implementar.
01:19:01
Entonces, le doy aquí ahora, ¿y qué método me añade?
01:19:05
El despedir. ¿Por qué?
01:19:07
Porque a través de la herencia he firmado como alumno,
01:19:08
al ser su hija, un acuerdo para implementar aquellos métodos
01:19:12
que la clase persona tiene definidos como abstractos.
01:19:16
Entonces, voy a ir aquí a salvar.
01:19:20
Fijaros cómo la clase alumno ya me empieza a compilar.
01:19:21
Ahora tendré que meter aquí el código de cómo se despiden los alumnos, ¿verdad?
01:19:25
por herencia no tengo ningún método
01:19:28
ningún código disponible desde la clase padre sobre cómo despedirme
01:19:32
pero al ser abstracto me ha obligado a implementar un código
01:19:36
de cómo se despiden los alumnos, con lo cual cuando para un alumno
01:19:40
llamemos al método de despedir pues ya hará el código
01:19:44
que tengamos puesto aquí, system.out, vamos a poner aquí un system.out
01:19:49
y decimos, bueno pues
01:19:52
algo sencillo, soy un alumno y me despido
01:19:58
¿Qué nos sucede en la clase
01:20:01
profesor que todavía no nos compila? Pues lo mismo
01:20:09
que nos estaba pasando en la clase alumno
01:20:10
hereda de persona y
01:20:12
aquí, en el momento que ha dicho
01:20:15
que heredo, ha firmado un acuerdo
01:20:17
con la clase persona
01:20:19
de que todos aquellos métodos
01:20:20
que tenga como abstractos, los tendrá que
01:20:23
implementar, porque en el contexto
01:20:24
de este programa, todo aquel que sea una persona o un hijo
01:20:26
de una persona tendrá que tener la posibilidad de despedirse porque desde clases terceras
01:20:30
por ahí a lo mejor vamos a querer que los profesores, en un momento haremos una llamada al método
01:20:34
de despedir. Pues nada, si me pongo aquí sobre el profesor, fijaros que lo que
01:20:38
me requiere aquí el IDE es de nuevo que meta los
01:20:42
métodos que no están implementados, pues ya está, me pone el despedir, fijaros
01:20:46
como me pone la etiqueta override, ¿por qué? porque estamos sobrescribiendo
01:20:50
el despedir de la clase Persona, que en verdad no tenía código, pero lo estamos sobrescribiendo.
01:20:55
Voy a hacer copy de esto por escribir menos.
01:21:02
Y aquí decimos soy un profesor.
01:21:06
Y ya está, pues ya tenemos otra vez el programa en marcha. Fijaros como
01:21:12
esto ya está en marcha, ya va bien. Hemos introducido
01:21:15
otro nuevo concepto que es la etiqueta ASTRAD para los métodos
01:21:22
que viene a identificarnos. Métodos sin
01:21:26
métodos donde no indicamos
01:21:28
cómo, qué código Java tiene que ejecutarse
01:21:32
cuando lo hacemos, pero sí que nos obliga a que los hijos de esta clase
01:21:36
tengan que implementarlos.
01:21:40
Aparte del astrat este, fijaros en el método, me ha obligado a poner que la clase
01:21:44
es astrat. ¿Y qué significa que la clase sea astrat?
01:21:48
Pues lo que me va a suponer ahora es que ya no voy a poder instanciar
01:21:52
objetos de la clase persona desde el momento en el que
01:21:56
se abstracta. ¿Y por qué sucede
01:21:59
esto? Pues nada, intentamos buscar la explicación yendo al sentido
01:22:02
común de nuevo. Si yo defino una persona
01:22:05
cuya referencia sea miPer y ahora cojo y pongo
01:22:07
miPer.despedir, vas a ver
01:22:11
ese objeto de la clase persona que hacer
01:22:14
si el método es abstracto y no tiene el código Java de cómo
01:22:16
se tiene que comportar, pues no. Entonces, como no existe
01:22:20
esta posibilidad, en el momento que la clase
01:22:23
es abstracta, ya no podemos instanciar objetos de esa clase y el motivo
01:22:26
es este. Una persona debería ser capaz
01:22:30
de despedirse y no tengo código de cómo hacerlo.
01:22:34
Si vengo aquí ahora y yo cojo y digo
01:22:38
aquí en mi per igual a new persona
01:22:42
y le pongo el constructor, fijaros que directamente no me deja. Y si me pongo por aquí
01:22:44
dice no puedes instanciar un objeto de la clase
01:22:49
persona. ¿Cuál es el motivo? Que la clase persona es abstracta.
01:22:53
¿Y por qué es abstracta? Porque se entiende que hay métodos
01:22:57
que no tienen definido cómo comportarse.
01:23:00
Bueno, aquí me faltaba un new. Igual, bueno, en cualquier caso
01:23:08
sigue sin dejarme con el mismo motivo. ¿Dudas de la clase abstracta?
01:23:12
¿Método y clase abstracta? ¿Para qué nos sirve esta etiqueta?
01:23:19
De alguna forma fijamos comportamientos
01:23:26
en la clase abstracta a través de los métodos
01:23:28
acciones que todo objeto de otras clases hijas
01:23:33
sí o sí dentro de este programa tienen que desarrollar,
01:23:38
tienen que implementar, porque si no, te bloqueo que seas hija
01:23:42
de la clase persona en este caso. Eso para la etiqueta
01:23:45
abstracta en el método. Y para la etiqueta abstracta en la clase, lo que estamos diciendo
01:23:49
es, como tienen métodos no implementados, no vas a poder instanciar
01:23:53
un objeto de esta clase, como hemos visto antes en la clase principal.
01:23:57
¿Bien? ¿Sí? Bueno, fijaros, las clases abstractas
01:24:05
tienen características, tienen métodos desarrollados
01:24:12
y métodos abstractos. Cajón desastre, nos permite tener
01:24:16
de todo. Alguien que sea hijo de una clase
01:24:19
abstracta, la clase alumno, por ejemplo, tendrá esos atributos
01:24:23
disponibles, podrá utilizar por herencia directamente
01:24:28
los métodos que no sean abstractos y que estén desarrollados y estarán obligados
01:24:31
a implementar aquellos que en la clase de padres hayamos
01:24:35
utilizado la clase abstracta. Si queremos dar
01:24:40
un pasito más y considerar
01:24:43
una clase en las cuales, bueno, vamos a decir una clase de momento
01:24:47
en las cuales todos sus métodos nos obliguen a las clases hijas
01:24:51
a desarrollarlos, es decir, que todos sus métodos sean abstractos
01:24:55
y en principio no dispongan de atributos, lo que desarrollamos
01:24:59
es una interfaz. Una clase abstracta puede tener
01:25:04
métodos desarrollados y métodos abstractos. Una interfaz solamente
01:25:08
tendrá métodos abstractos. Vamos a crear una interfaz aquí
01:25:12
en el proyecto. Mirad, nos venimos por aquí,
01:25:16
venimos a New y típicamente nos venimos siempre aquí a clase, pero
01:25:20
fijaros cómo nos da la opción también de, bueno, nos da muchas opciones por aquí
01:25:24
y una de ellas es la de interfaz, le damos aquí al interfaz
01:25:28
vamos a darle un nombre, vamos a poner
01:25:31
yo que sé, que deciros, trabajador
01:25:35
bueno, aquí me define un interfaz
01:25:40
y vamos a, esto es un interfaz, vamos a hacer intentos de hacer cosas
01:25:45
que no nos deje, por ejemplo, vamos a definir un public
01:25:50
void fichar, pues el trabajador tiene que fichar
01:25:54
y para fichar, cogemos y decimos
01:25:59
system.out.println, lo que sea, ¿vale?
01:26:02
system.out.println, fichando
01:26:05
y que dice, se me queja, y hay que ver que nos dice
01:26:12
mirad, a la que voy, la que me interesa
01:26:16
es este removeMethodBody, dice, quita el método
01:26:20
ya lo pongo aquí, y ya me deja
01:26:23
fichar y
01:26:29
cobrar también, mal vamos si no cobramos, si fichamos y trabajamos
01:26:33
y no cobramos, pues esto otro método, fijaros que en el interfaz
01:26:37
en el momento que en uno de los métodos he intentado meter código, no me ha dejado
01:26:41
en cambio lo que me permite es definir
01:26:45
diferentes métodos que todos ellos
01:26:49
serían métodos en verdad abstractos, como se meten
01:26:54
de hecho
01:26:58
bueno, vamos a ponerle
01:27:00
abstract incluso
01:27:03
le apetece que no lo ponga
01:27:04
no lo permite sin ponerlo, pero bueno
01:27:07
vamos a ponérselo incluso
01:27:09
¿Cómo hemos
01:27:10
definido que una clase sea
01:27:13
hija de una clase padre?
01:27:15
Pues hemos utilizado el stents
01:27:17
para los interfaces tenemos otra etiqueta
01:27:18
en la clase
01:27:21
vamos a decir hija de momento, aunque
01:27:22
el tema hijo y padre está relacionado con la herencia
01:27:25
y no con los interfaces, que es la etiqueta implement.
01:27:27
Y aquí es donde ponemos el nombre del interfaz.
01:27:31
Hemos dicho que el interfaz se llamaba trabajador.
01:27:33
Entonces decimos, implementa el interfaz trabajador.
01:27:37
Y en el momento, aparte de la herencia que hemos dicho
01:27:41
que implementa un interfaz, lo que nos obliga es que metamos
01:27:44
los métodos que no están implementados.
01:27:49
fijaros como me obliga a meter el método fichar
01:27:51
y el método cobrar. ¿Qué es lo que hemos conseguido con un interfaz?
01:27:55
Pues hemos firmado un acuerdo, como habíamos hecho antes
01:27:59
en la parte de la herencia para los métodos que eran abstractos
01:28:03
de la clase persona, al ponerlo abstracto este método y no poner su código
01:28:07
firmamos un acuerdo ahí para que las clases
01:28:12
hijas obligatoriamente tuvieran que implementar esos métodos, el despedir
01:28:16
A través de la herencia. Si lo que definimos es una interfaz, los interfaces se parecen a las clases abstractas un poquito en tanto en cuanto define un conjunto de métodos que son todos abstractos, no nos deja implementar ninguno.
01:28:19
Es decir, es un acuerdo puro y duro en el cual se definen una serie de métodos abstractos, no desarrollamos ninguno, en ninguno decimos cómo se tiene que comportar alguien que pretenda ser un trabajador, pero sí decimos que todo aquel que implemente el interfaz trabajador tendrá dentro de su código que meter este método y desarrollarlo, de la misma forma que tiene que hacer con el método cobrar.
01:28:34
Entonces ahora el alumno hereda de la clase persona lo que herede,
01:29:02
si tiene la clase persona algún método abstracto lo tiene que desarrollar
01:29:06
y dice que implementa la clase trabajador, el interfaz trabajador,
01:29:10
con lo cual tiene obligatoriamente que desarrollar todo esto.
01:29:16
Imaginamos que tenemos un proyecto grandote y se pretende que todo aquel
01:29:20
que sea considerado en un momento dado un trabajador, es decir,
01:29:25
implemente esta interfaz, desde diferentes sitios del código
01:29:29
se le podrá llamar a un método fichar y un método cobrar.
01:29:33
Un alumno, que en un momento dado puede ser un trabajador, si no le pongo esto
01:29:37
y le implemente este, no estoy firmando un acuerdo con nadie, pues podría coger
01:29:40
y no implementar el método cobrar. Y si luego desde clases por ahí terceras
01:29:45
alguien dice, como es un alumno y el
01:29:49
diseño general, un requisito general del proyecto es que
01:29:52
sea capaz de cobrar, pues dice, pues vale, pues si me han dicho que los alumnos
01:29:57
en el diseño general del proyecto pueden cobrar, voy a llamar al método cobrar.
01:30:01
Y resulta que si no le he obligado a través de una firma que he hecho ahí
01:30:05
con una interfaz a que lo implemente, he podido, yo que soy
01:30:09
el programador de esta clase en particular, no desarrollarlo. Entonces coge y no me compila
01:30:13
el programa por otros lados. En cambio, si he llegado al acuerdo de que los
01:30:17
alumnos puedan llegar a ser trabajadores,
01:30:21
pues lo que hago es implementar el interfaz
01:30:24
trabajador que no dice cómo hacer nada
01:30:27
pero me obliga a que los alumnos tengan aquí
01:30:30
un código para que pueda ser llamado
01:30:33
a través del método cobrar o a través del método fichar. Entonces aquí
01:30:36
pondremos qué es lo que tiene que pasar cuando un alumno
01:30:39
pues tiene que cobrar, pues yo que sé, que le tienen que dar una pasta
01:30:42
como debería ser. Entonces estos
01:30:44
son los interfaces. Mirad, sobre los
01:30:48
interfaces, otra cosa más. Vamos a definir un segundo
01:30:51
interfaz, aquí
01:30:54
yo que sé, vamos a llamarlo vacaciones
01:30:56
pues oye, vacaciones está bien
01:31:03
y definimos
01:31:06
un método public abstract
01:31:09
void
01:31:11
que sea
01:31:13
viajar
01:31:14
si intentara meter código aquí
01:31:16
por ser una interfaz, no me dejaría
01:31:19
simplemente digo que
01:31:21
todo aquel que
01:31:23
quiera implementar el interfaz
01:31:24
vacaciones que se esté obligando en su cabecera a través del interfaz vacaciones tendrá que hacer
01:31:27
un desarrollo del método viajar y luego pues vamos a poner otro método publicastrat void disfrutar
01:31:33
vale pues también si oye si coge vacaciones olvídate de irte a aburrirte tienes que irte a
01:31:41
disfrutar decimos cómo es el código cualquiera de estos dos métodos 2 3 4 5 20 o 1 no porque
01:31:46
Porque es una interfaz. Y además, fijaros que aquí, aunque sea un poco pesado, cuando estamos de vacaciones también tenemos que fichar.
01:31:54
No sé buscar un contexto real en el que tengamos que fichar, pero también vamos a poner fichar aquí en vacaciones.
01:32:06
Alguien que implemente el interfaz vacaciones tiene que viajar, disfrutar y fichar.
01:32:13
Y alguien que implemente el interfaz trabajador tiene que fichar y cobrar.
01:32:18
bueno, venimos aquí a la clase alumno
01:32:22
que hereda de la clase persona y ya está implementando
01:32:26
trabajador y ponemos aquí una coma y decimos
01:32:29
que también implementa el interfaz vacaciones
01:32:32
ha dejado de compilarme, ¿por qué? pues porque
01:32:35
vacaciones tiene aquí, firma un contrato con el
01:32:38
interfaz vacaciones que tenemos que tener
01:32:41
código desarrollado para estos tres métodos y resulta
01:32:44
oye, pues que no, que es que ahora mismo no tengo
01:32:47
tengo fichar, cobrar, que son los de trabajar. Fichar coincide
01:32:50
con el trabajar, pero vacaciones tiene aquí definidos
01:32:53
dos que todavía no están implementados.
01:32:56
Entonces, vengo aquí y me dice
01:32:59
que añada los métodos
01:33:02
no implementados. Aparecen aquí
01:33:05
disfrutar, viajar, con el override, porque estoy
01:33:08
sobrescribiendo desde la interfaz y ya me compila.
01:33:11
¿Y a dónde he querido llegar al meter dos interfaces?
01:33:16
Pues, ¿qué os decía antes de la herencia?
01:33:19
Una clase en Java, hay algún lenguaje que lo gestiona como sea, hace yo creo recordar, Java solamente permite herencia desde una clase padre. ¿Por qué? Pues porque en las clases padres podemos tener métodos con el mismo código.
01:33:22
Entonces se produce una situación de que si llamamos a ese método no va a saber de qué clase padre si hereda E2 coger el método, el comportamiento que tiene que tener a la hora de ejecutarse para desarrollar ese método.
01:33:37
En cambio, la implementación, si os fijáis, más allá de la herencia esta que os decía de algunos métodos comunes para todas las clases, desde la clase Object que está en la parte de arriba del árbol de todas las clases en Java.
01:33:53
Pero, en cambio, la implementación sí me permite implementar dos interfaces diferentes y podríamos decir, pero claro, si tienes el mismo método definido en dos interfaces, ¿cuál de los dos interfaces considera?
01:34:06
Pero, claro, los interfaces, que es el caso, el interfaz trabajador tiene fichar y el interfaz vacaciones tiene fichar. Es decir, se da esa situación que nos impedía la herencia múltiple en Java.
01:34:22
Pero como fichar no lo tenemos desarrollado de cómo se tiene que comportar, no tenemos ningún problema. Hemos firmado por dos lados que la clase alumno va a tener que implementar, va a tener que desarrollar el método fichar, lo hemos firmado por dos lados.
01:34:39
pero como no tenemos compromiso
01:34:55
de comportarnos de ninguna de las formas
01:34:57
desde ninguno de los dos interfaces
01:34:59
el único método
01:35:00
fichar que de verdad desarrollamos
01:35:03
es decir, el comportamiento no tiene
01:35:05
ambigüedades, es este, por mucho
01:35:07
que este fichar se nos esté
01:35:08
obligando a tenerlo desarrollado
01:35:11
desde dos interfaces distintos, en cambio
01:35:12
cobrar solamente desde uno, pero no me importa
01:35:15
el código es único, no hay ambigüedades
01:35:17
oye, pues te dejo
01:35:19
que implementes más de una interfaz
01:35:20
¿Sí? ¿Se entiende?
01:35:23
¿Alguna cosilla por ahí?
01:35:31
¿No?
01:35:39
Pues, bueno, el tema, como comentabais, el tema 7 es bien largo,
01:35:42
pero las ideas así principales que os quería contar eran un poco estas.
01:35:48
La sobrecarga, la encasulación, la sobrescritura, las clases abstractas,
01:35:52
los interfaces, que no es cosa de poco.
01:35:58
Luego, hasta que consiguierais digerir un poquillo todo esto que os he contado hoy,
01:36:01
Vais a tener que echar algún ratín. Si no tenéis alguna duda por ahí en particular, yo en principio no os quería contar mucho más por hoy, por no marearos más tampoco en exceso.
01:36:06
No sé si tenéis alguna duda de todo lo que hemos visto, de alguna otra cosa. Hay dos situaciones. Un poco el concepto entre clase, padre e interfaz.
01:36:19
Pues lo que os he comentado, la clase padre te permite tener desarrollado algunos métodos y algunos abstractos, algunos que le obligas a firmar el contrato de tienes que implementarlo.
01:36:59
Las interfaces no tienes desarrollado ninguno. Es así. Y luego, la herencia, claro, la herencia te resulta muy útil porque puedes utilizar ya código que tienes disponible en la clase padre, mientras que a la hora de implementar los interfaces tienes que desarrollar obligatoriamente los métodos.
01:37:15
pero tienes el inconveniente de que la herencia es única
01:37:39
entonces si tú te ves en la situación de que el alumno en verdad en su definición general
01:37:45
pues tiene que tener las características que tienen las personas
01:37:53
pero además quieres obligar a que cumpla todo lo que tienen que hacer los trabajadores
01:37:56
En las vacaciones, pues tienes que elegir uno como obligatoriamente, uno como clase padre y el resto como interfaces, porque como no nos permite herencia múltiple, si nos permite herencia múltiple, nos olvidábamos de este implements y poníamos esto aquí, poníamos estas clases abstractas y las desarrollábamos.
01:38:02
Pero como no es posible hacer herencia desde diferentes clases, obligatoriamente tienes que hacerlo así. ¿Cuál puedes utilizar de, yo qué sé, en este caso, a ver, a ver, claro, por ejemplo, según el criterio que utilizábamos antes, decíamos, ¿un alumno es una clase de persona?
01:38:22
Y decíamos, sí, ¿os acordáis para la composición y la herencia? ¿Un alumno es una clase de trabajador? Sí. ¿Un alumno es una clase de vacaciones? Pues vacaciones, quedaría un poco raro la herencia de vacaciones, ¿sabes? También, porque no responde un poco a esta pregunta que nos identifica la relación de herencia.
01:38:48
En definitiva, tendrías que elegir una de ellas como clase padre, aquella que te proporcione más código que utilizar desde los métodos que tiene desarrollados y las otras tendrías que utilizarlas como interfaces.
01:39:05
No recuerdo exactamente cómo lo argumentan en el código. Si me das una pista, a lo mejor te puedo...
01:39:21
El concepto en líneas generales, si ahora un poco después de ver el concepto que os cuento, al leerlo de nuevo en el tema no lo entiendes,
01:39:32
pues pon en el foro una pregunta e intento aclarártelo, no sé, dentro de lo que sea capaz te lo intento aclarar, ¿vale?
01:39:46
Pero un poco la idea de base es esta, la herencia es única y te permite tener a tu disposición los métodos desarrollados y te obliga a implementar los abstractos.
01:39:52
Los interfaces directamente tienes que desarrollar todos y eso sí te permite definir diferentes interfaces,
01:40:08
Te permite definir diferentes firmas de, me comprometo a que si soy un alumno e implemento esta interfabia, te voy a disponer de estos métodos desarrollados para que desde otras zonas de código sean capaces de utilizarlos, porque si no he firmado ese contrato, compilaría la clase alumno directamente, aunque no tenga alguno de ellos, como es lógico.
01:40:16
Pero en el momento que pongo esto, ya no me va a compilar, a no ser que tenga todos esos métodos que son candidatos a ser llamador desde clases terceras desde el programa.
01:40:36
ya te digo, un poco con lo que os he contado
01:40:44
que vamos, desde mi punto de vista es como enfocar
01:40:51
la clase abstracta y las interfaces
01:40:54
si vuelves a releer el tema y no entiendes cosas
01:40:56
ponme una consulta ahí en el foro e intento aclararla
01:40:59
porque no me acuerdo, francamente no me acuerdo
01:41:02
como lo describe en el tema, esta parte
01:41:05
vale, bueno pues nada
01:41:08
si no me preguntáis nada más, vamos cerrando
01:41:19
os subo la
01:41:22
tutoría esta por si la queréis echar un ojillo
01:41:25
si os aburrís mucho y tenéis otro rato
01:41:27
para verla y bueno
01:41:29
para los compañeros que no hayan podido asistir a la
01:41:31
tutoría
01:41:33
la dejo ahora subiendo
01:41:33
y bueno la tendréis, si no se me olvida
01:41:37
como la semana pasada algún día y me lo tenéis que
01:41:39
recordar, luego esta noche o mañana por la mañana
01:41:41
os la pongo ya disponible el enlace
01:41:43
en el aula virtual
01:41:45
Bueno, pues buena tarde a todos
01:41:46
Venga, hasta luego
01:41:51
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- JM
- Subido por:
- Jose Manuel M.
- Licencia:
- Dominio público
- Visualizaciones:
- 37
- Fecha:
- 24 de febrero de 2025 - 19:23
- Visibilidad:
- Clave
- Centro:
- IES ALONSO DE AVELLANEDA
- Duración:
- 1h′ 41′ 55″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 182.51 MBytes