20250113 Herencia - 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:
Voy a grabar esta clase, por lo tanto, si habláis, me dais el permiso de grabar vuestra voz y que se grabará en esta grabación. He dicho grabación 20 veces.
00:00:00
Vale, entonces, después de haber visto los conceptos de objeto y de clase y la diferencia que hay, que repasamos muy rápidamente, la clase es como una idealización, una generalización, una abstracción de un concepto que estoy modelizando.
00:00:11
Y luego a partir de esta abstracción puedo crear instancias concretas, réplicas de este molde que he creado, creando objetos.
00:00:28
Entonces la clase Persona me dirá que todas las personas tendrán un nombre, un apellido y un DNI.
00:00:38
Y luego tendré un objeto concreto que tiene un determinado valor en nombre, un determinado valor en apellido, un determinado valor en DNI.
00:00:44
Y podré hacer cuantos objetos me da la gana a partir de este molde general que es la clase
00:00:51
Vamos a ver algunos conceptos un poquito más avanzados de la programación orientada a objetos
00:00:58
¿Qué son estos conceptos? Son herramientas, son opciones, son posibilidades que me proporciona la programación orientada a objetos
00:01:05
para que pueda lograr aprovechar mi código de una forma mejor, digamos así.
00:01:14
¿Es obligatorio utilizarlas? No, ¿vale?
00:01:26
Según qué proyecto hacemos, todos los proyectos que hemos hecho hasta ahora,
00:01:30
todos los ejercicios que hemos hecho ahora, pues no necesitan de estas cosas
00:01:33
porque son proyectos muy, muy sencillos.
00:01:36
Pero nosotros tenemos que, con ejemplos sencillos, aprender a utilizar estas herramientas porque luego en proyectos más complejos o en varios proyectos, en una empresa que desarrolla muchos proyectos, etc., pues estas herramientas nos proporcionan grandes ventajas como principalmente reuso de código.
00:01:39
La idea de que cada vez que empezamos un nuevo proyecto tengamos que reinventar los mismos conceptos o remodelizar conceptos que ya hemos utilizado en otros proyectos no es una cosa positiva.
00:01:59
A veces es necesario, a veces yo me doy cuenta de proyectos anteriores que, como había modelizado la persona, pues no es eficiente porque me provoca varios problemas, pues entonces rehago el concepto de personas de cero aprovechando del conocimiento que he ganado en los proyectos anteriores.
00:02:18
Pero no siempre es así. Muchas veces una empresa que se dedica a un determinado aspecto, entonces es experta en un determinado problema, en un determinado contexto, pues ya ha creado su conjunto de clases que se reutilizan en proyectos distintos y quiere reutilizar lo que antes había.
00:02:37
Sin embargo, muchas veces reutilizar cosas anteriores puede que no sea posible al 100%, que a lo mejor el nuevo proyecto tiene que añadir algo, quitar algo o modificar algo.
00:02:56
Y entonces existen estas técnicas para que esto sea más fácil y sea más interesante, sea más productivo para las empresas.
00:03:08
el primer mecanismo que vamos a ver es el mecanismo de herencia
00:03:19
un poquito la herencia, ya lo hemos visto
00:03:24
porque cuando en episodios anteriores de programación
00:03:27
hemos visto el concepto que existe una clase objeto
00:03:31
y que todas las clases que habéis creado vosotros son objetos
00:03:34
y que tienen los mismos métodos de la clase object
00:03:38
pues en realidad allí eso es la esencia de la herencia
00:03:41
Lo que hemos dicho las otras veces es que vuestros objetos se heredan de object
00:03:47
Pero vamos a formalizar un poquito más este concepto
00:03:53
Mirando aquí que nos dice la transparencia
00:03:58
Es un mecanismo para la reutilización del software
00:04:01
Permite definir a partir de una clase otras clases que reutilicen todo o parte de los atributos o métodos de la clase que heredan
00:04:05
Ejemplo, yo hago una persona
00:04:14
Esta persona tiene un nombre y una edad
00:04:16
A partir de este concepto de persona
00:04:19
Yo podría crear dos clases nuevas
00:04:22
Una que es profesor y una que es estudiante
00:04:25
Ahora, tanto profesor como estudiante
00:04:28
Comparten un nombre y una edad
00:04:30
Porque tanto profesor como estudiante son personas
00:04:33
Entonces la idea es que yo
00:04:36
En vez de crearme una nueva clase entera
00:04:39
Donde le diría, el estudiante tiene string nombre
00:04:41
El estudiante tiene int edad
00:04:44
más, por ejemplo, aquí tiene un array de int de sus notas, pues lo que voy a hacer es que le voy a decir,
00:04:46
mira, el estudiante es una persona, el estudiante hereda de persona, importa en un cierto sentido,
00:04:52
hasta si importar es un término feo porque existe import, que es un poquito distinto,
00:05:00
pero recibe desde persona todo lo que persona tiene y a partir de allí puede hacer cosas,
00:05:05
Puedo añadir nuevas características
00:05:15
Por ejemplo, puedo decir que una persona no tiene un grupo
00:05:19
Pero un estudiante sí que pertenece a un grupo
00:05:23
Vosotros perteneces a uno
00:05:26
Entonces podría ser que al estudiante le ponga string grupo
00:05:28
Pero seguramente el estudiante es una persona
00:05:32
Por lo tanto tendrá nombre y edad
00:05:35
Y además su grupo y además sus notas
00:05:37
Ahora, también el profesor es una persona
00:05:40
Entonces también el profesor tendrá nombre y edad
00:05:42
Pero además tiene un array de string que es las asignaturas que imparte. Por ejemplo, o podría tener un array de asignaturas siendo asignatura otra clase.
00:05:45
esto lo está haciendo como ejemplo muy básico
00:05:55
solo con atributos
00:06:00
pero cuando se hereda, se heredan también los métodos
00:06:03
entonces si la persona tenía un método saludar
00:06:07
que decía hola soy y su nombre
00:06:09
pues ahora también los profesores y los estudiantes
00:06:12
tienen ese método
00:06:15
si una clase A hereda de una clase B
00:06:17
Quiere decir que la clase A puede hacer todo lo que hace una clase B
00:06:22
Y posiblemente más
00:06:26
O, y lo veremos un poquito más adelante
00:06:28
Puede hacer lo mismo de la clase B
00:06:31
Pero de forma distinta
00:06:34
¿Vale?
00:06:35
Ejemplo de esto lo hemos hecho
00:06:38
¿Os acordáis del equals?
00:06:39
Que perdimos un buen rato el viernes mirando ese ejemplo
00:06:40
Pues cuando yo he creado mi clase que era tarea
00:06:43
Y que heredaba el método equals desde object
00:06:46
Y lo hemos probado antes sin hacer nada
00:06:52
Y hemos utilizado el mismo método de object
00:06:54
Y luego hemos creado un equals dentro de tarea
00:06:56
Y hemos creado que hace lo mismo
00:06:59
Porque puede utilizar el método equals
00:07:01
Pero lo hace de una forma distinta
00:07:03
Ahora en vez de equipararse como hace object
00:07:05
Se equiparaba de otra forma
00:07:07
Entonces más o menos estas ideas
00:07:09
Ya las hemos trabajado
00:07:11
Para que hoy cuando la veáis
00:07:13
La formalicemos
00:07:15
Pero no suenen como es la primera vez que lo escucho
00:07:16
Vale, cuando hablamos de herencia podemos aplicarla, podemos utilizarla o nos sale a la mente y nos viene útil en dos posibles contextos. Uno es especializando y uno es generalizando.
00:07:20
¿Qué quiere decir? Por ejemplo, un ejemplo de especialización es cuando uso la clase coche especificándola, especializándola desde vehículo.
00:07:42
Imaginaos que yo ya tengo la clase vehículo, que es una cosa genérica, y yo digo, vale, a partir de vehículo creo coche.
00:07:53
Entonces, coche es un vehículo. Entonces, coche herederá de vehículo.
00:08:01
Todo lo que puede hacer un vehículo lo puede hacer un coche, pero el coche tendrá algunas características extra más específicas para el coche mismo, ¿vale? Por ejemplo, el tipo de ruedas, que por ejemplo un vehículo como un barco no tiene tipos de ruedas, ¿sí? Y cosas por el estilo.
00:08:05
Esto sería parecido a lo que hemos hecho aquí. Persona es genérico y luego lo que he hecho es especializarlo en un profesor, que es una persona con algo más, más específica, y estudiante, que es otra persona, pero más específica de otra forma.
00:08:24
Entonces, el escenario en el que utilizamos la especialización es que tenemos que desarrollar una nueva clase que se parece mucho a una que ya tenemos, pero que necesita información como características o comportamientos adicionales.
00:08:39
¿Sí? Tengo un vehículo, este ya está existente, tengo que crear coche, que es algo más específico que vehículo, pero mucha parte, por ejemplo, moverse, por ejemplo, parar, por ejemplo, acelerar, pues son todas cosas que puede hacer un vehículo y, por lo tanto, lo reutilizaría en coche.
00:08:54
¿Sí?
00:09:10
La solución de este escenario con especialización es que creo una subclase, ¿vale? Esta nomenclatura se puede llamar subclase, se puede llamar clase hija, se puede llamar clase derivada, ¿vale?
00:09:11
que es una clase nueva a la que heredamos todo lo que está antes, pillamos todo el código
00:09:22
como si copiáramos todo el código que estaba en vehículo, en la clase superior digamos
00:09:31
lo copio sin tener que copiarlo en esta subclase y luego me pongo a añadir y a modificar
00:09:36
las cosas puntuales que quiero modificar para este nuevo elemento concreto
00:09:43
El segundo caso es en caso de generalización
00:09:49
O sea, crear la clase vehículo como generalización de coche
00:09:54
¿Qué quiere decir esto?
00:09:59
El escenario es, imaginaos que yo tengo un conjunto de varias clases
00:10:00
Que en mi proyecto han surgido
00:10:05
Y antes estaba haciendo una parte, he creado varias clases
00:10:07
Luego he hecho otra parte, he pensado una escuela
00:10:09
Y he creado alumno para gestionar alumno
00:10:12
Luego he creado profesor para generar profesor
00:10:15
luego he creado, no sé, secretario para poner la parte de secretaría que está ahí,
00:10:17
y me he dado cuenta que todas estas clases que estoy creando comparten una parte.
00:10:23
O sea, en todas estas, en alumno, en profesor, en secretario,
00:10:28
todas tienen nombre, apellido, DNI y que pueden hacer operación de ejecutar su trabajo.
00:10:33
No lo sé.
00:10:40
Como me doy cuenta que todas estas clases comparten una parte,
00:10:42
yo puedo sacar esa parte
00:10:45
ponerla en una nueva clase
00:10:49
que sería una clase más general
00:10:51
que esta de aquí, como por ejemplo la clase persona
00:10:53
y a ese punto hacer que toda esta parte
00:10:55
que antes se replicaba en cada una de las clases
00:10:59
ahora está bonita, empaquetada
00:11:03
organizada en una única clase
00:11:06
de las que las otras heredan
00:11:09
es decir, es ver esto pero al revés
00:11:11
Es ver esto que en vez de decir yo había creado persona y ahora las especializo en profesor y estudiante
00:11:14
Yo tenía un proyecto en que tenía profesor y estudiante
00:11:21
Y me doy cuenta que tanto profesor como estudiante tienen nombre y edad
00:11:24
Y por lo tanto lo que hago es crearme una clase persona de la que luego profesor y estudiante heredarán
00:11:28
¿Por qué esto es útil?
00:11:36
Porque si yo tengo un método, el ejecutar mi profesión
00:11:38
Que está tanto en alumno como en profesor y que hace lo mismo en todas. Y ahora de repente me doy cuenta que hay un error, que quiero que haga una cosa distinta, etc. Debería entrar en todas las clases y modificarlo.
00:11:42
Sin embargo, si yo he podido extraer estos datos, meterlos en una única clase, superclase
00:11:58
En una clase padre, en una clase superior
00:12:07
Y este método está allí, cuando yo modifique este método
00:12:11
En automático lo estoy modificando para todas las clases que heredan de esta clase superior
00:12:15
¿Se entiende?
00:12:20
Entonces, el mecanismo de herencia es único
00:12:22
Es eso, yo puedo pillar una clase y decir que otra clase hereda de esta aquí, ¿vale? Entonces estaría como copiando esta clase aquí y luego añadiendo cosas o modificando cosas.
00:12:25
Sin embargo, cuando se utiliza, la forma de pensar a cuando voy a utilizar la herencia tiene estos dos casos. Tiene el caso de tengo una cosa general y la quiero especializar en cosas con información adicional o al revés, generalización.
00:12:36
Tengo muchas clases que coinciden en algunas partes, entonces la parte que coincide en todas, pues la extraigo, la pongo en una clase superior y luego hago que todas las demás hereden de esta.
00:12:51
De esta forma, en vez de duplicar código en muchas clases, tengo un único sitio donde estoy poniendo este código compartido, digamos, entre las otras clases.
00:13:02
Cuando
00:13:14
Hago así, o sea, la clase
00:13:16
Superior, digamos, se puede llamar
00:13:18
Superclase, clase padre o clase
00:13:20
Base, ¿vale? Según la nomenclatura
00:13:22
Que utilicéis y como queráis
00:13:24
Llamarla, ¿vale?
00:13:26
Movemos el código que se repite
00:13:29
A un único sitio, a una superclase
00:13:30
Y luego las otras clases tiran de allí
00:13:33
Si hago una modificación a este código repetido
00:13:34
Automáticamente es como si lo estuviera
00:13:36
Modificando
00:13:38
En todas las clases
00:13:40
que heredan desde allí
00:13:42
¿vale? entonces, esto es un ejemplo
00:13:44
no hago zoom porque si no
00:13:47
se estropea la grabación
00:13:48
¿vale? pero os lo leo
00:13:50
más o menos, aquí tengo
00:13:52
una clase recurso, que representa
00:13:53
un recurso general, que tiene nombre
00:13:56
descripción, decir nombre, decir
00:13:58
descripción, ¿vale? un get nombre
00:14:00
un get descripción
00:14:02
y luego tengo como recurso un aula
00:14:03
o un ordenador, ¿vale? y me doy
00:14:06
cuenta que un aula tiene nombre, descripción
00:14:08
decir nombre, decir descripción, pero
00:14:11
además tiene localización y tiene decir localización mientras que un ordenador la
00:14:12
localización no me interesaba y tenía sistema operativo es decir sistema operativo pero me
00:14:18
doy cuenta que toda la parte azul es como una de estas tres clases de hecho está recurso podría
00:14:22
ser visto como una generalización de aula ordenador y no sé qué más cosa impresora y
00:14:30
y espacio y que se yo
00:14:35
proyector, que se yo, todos tienen que tener un nombre
00:14:39
en la descripción y sus métodos para llamar ese nombre a esa descripción, entonces que hago
00:14:44
pues pillo recurso, lo dejo con estos
00:14:48
datos que son los datos que todos los recursos tienen que tener
00:14:52
y lo hago como una super clase de la que aula y ordenador
00:14:55
heredan, a este punto en aula y ordenador no tengo
00:15:00
que volver a reescribir esta información
00:15:04
más solo añado
00:15:06
las dos informaciones
00:15:07
propias y específicas
00:15:10
de aula de ordenador
00:15:12
si lo veo como antes tenía
00:15:13
estos y a partir de esto
00:15:16
me he creado recursos y ahora
00:15:18
hago que hereda, estaría haciendo una generalización
00:15:20
si lo veo como no
00:15:22
tenía un recurso y luego a partir
00:15:24
de allí voy creando
00:15:26
mis varios recursos concretos
00:15:27
como aula, ordenador, proyector y que se yo
00:15:30
pues entonces lo estoy viendo como
00:15:32
Especialización
00:15:33
¿Dudas?
00:15:34
¿Cómo se hace esto
00:15:39
En Java? Es decir, ¿cuál es la sintaxis
00:15:41
Que me permite, dada una clase
00:15:43
Hacer que otra clase
00:15:45
Rede de ella? Pues con la palabra
00:15:47
Reservada extends
00:15:49
¿Vale? Extiende
00:15:51
En cierto sentido da esta cosa de
00:15:53
Voy a pillar todo lo que es esta clase
00:15:55
Y además la extiendo con algo más
00:15:57
Entonces
00:15:59
Yo tengo la clase recurso
00:16:00
public class recurso normal, con dentro esta cosa aquí
00:16:02
cuando voy a declarar la clase aula, public class aula
00:16:06
extends recursos, entonces
00:16:10
en este caso estaría diciendo que todo lo que está en recurso lo voy a añadir
00:16:14
a aula, más lo que esté dentro de aula
00:16:19
o public class ordenador extends recurso
00:16:21
¿dudas?
00:16:26
No necesariamente
00:16:28
No, puede extender clases de otros packages
00:16:35
Siempre que tenga acceso a ellas
00:16:39
Si la clase no es public
00:16:42
Entonces no puede acceder a otro
00:16:45
Los atributos y métodos que aparecen en azul de la clase padre
00:16:48
Se repiten en las clases hijas
00:16:54
¿Vale? Aquí, ¿veis?
00:16:55
Entonces no necesito repetir el código
00:16:57
Basta con decir que una clase extiende o hereda de la otra
00:16:59
Y ya está
00:17:02
¿Dudas?
00:17:03
Además, imaginamos que decir nombre lo quiera cambiar
00:17:06
¿Vale?
00:17:09
Aquí, en este contexto de aquí, yo lo debería cambiar en tres sitios
00:17:09
Aquí, aquí y aquí
00:17:12
Ahora, ¿con qué lo cambio aquí?
00:17:14
Pues ya, tanto en aula como en ordenador, he hecho el cambio
00:17:17
¿Se entiende?
00:17:20
¿Dudas?
00:17:23
Esto es como se llaman las cosas
00:17:24
Para entendernos cuando hablamos
00:17:31
Para que si yo digo una palabra
00:17:33
Pues vosotros entendáis que se está entendiendo
00:17:35
Entonces imaginamos una clase taxi
00:17:39
A partir de vehículo
00:17:41
Entonces taxi es la subclase
00:17:44
Y vehículo es la superclase
00:17:48
Entonces se puede decir que taxi hereda las variables y métodos de vehículo
00:17:51
O que taxi es tiende vehículo. Se puede decir que taxi es una subclase de vehículo. Se puede decir que taxi es una clase derivada o una clase hija de vehículo. Al revés, puedes decir que vehículo es una superclase de taxi o una clase base o una clase padre de taxi.
00:17:56
La herencia realiza una relación es un, es decir, que un taxi es un vehículo
00:18:14
Un vehículo no es un taxi, ¿se entiende?
00:18:23
Esto es un es interesante porque luego veremos que en determinados casos, y aquí entrará cosas como el polimorfismo, etc.
00:18:32
Yo puedo utilizar, allá donde me han dicho que puedo utilizar un vehículo, yo puedo utilizar un taxi, porque el taxi es un vehículo.
00:18:40
Entonces, no obstante su tipo sea taxi, pero como hereda todo lo que es vehículo, se puede portar como un vehículo.
00:18:52
Sin embargo, no puedo poner un vehículo donde he dicho que aquí va un taxi, porque el vehículo no es un taxi.
00:19:00
¿Se entiende?
00:19:07
aquí en un sitio donde me dicen
00:19:07
puedes usar un recurso aquí, yo puedo poner tanto un aula como un ordenador
00:19:14
porque los dos tendrán todo lo que hace falta de un recurso
00:19:18
por lo tanto si este método requiere un recurso y luego de este recurso
00:19:21
pilla, usa el nombre, decir nombre
00:19:26
o el método de decir nombre, pues tanto si es un recurso
00:19:29
como si es un aula, como si es un ordenador, tendrá este método
00:19:34
lo puede utilizar, ahora si yo te digo que aquí recibo un aula
00:19:37
como parámetro y luego dentro de este método usando este parámetro
00:19:41
aula uso decir localización, si tú me has pasado un aula
00:19:45
lo podrá hacer, pero si tú me has pasado un recurso no lo puede hacer
00:19:49
porque el recurso no lo tiene decir localización, entonces no funcionaría
00:19:53
mismo aquí, tengo una persona
00:19:56
y esta persona tiene que saludar, vale, yo si te paso una persona
00:20:00
tendrá el método de saludar y se saludará. Si te pasa un profesor, tendrá todos los métodos y datos de persona
00:20:05
y por lo tanto podrás saludar también un profesor. Al revés, si el profesor tiene asignatura y te digo
00:20:11
lístame tus asignaturas, un profesor lo puede hacer, pero si pongo un estudiante o pongo una persona,
00:20:17
como no tiene la lista de... no lo puede hacer. ¿Se entiende?
00:20:22
Entonces, hay esta relación de es un
00:20:25
Las subclases son un superclase
00:20:30
Entonces, mi clase animal es un
00:20:36
Mi clase animal es un
00:20:42
Exacto, object
00:20:50
Porque todas las clases se reten de object
00:20:58
Lo habíamos dicho
00:21:00
¿O no?
00:21:01
Pues eso
00:21:03
Es lo único que se puede decir
00:21:04
¿Puede ser un ser vivo? No lo sé
00:21:05
Depende, si se extiende de la clase
00:21:06
Ser vivo, sí
00:21:10
¿Vale? Entonces tendría que mi animal
00:21:11
Extiende de la clase ser vivo
00:21:14
Que extiende de object
00:21:16
Porque siempre subiendo, subiendo, subiendo
00:21:17
Llegaré a object
00:21:20
Que es la
00:21:21
Clase padre de todos
00:21:23
La superclase definitiva
00:21:25
¿Sí?
00:21:28
¿Dudas?
00:21:29
Sintaxis
00:21:34
En Java para indicar que una clase red
00:21:34
se usa extends, ya lo hemos dicho
00:21:36
vale, modificador, aquí podemos poner
00:21:38
public, private, lo que sea, class
00:21:40
el nombre de la clase, hija
00:21:42
extends, clase padre
00:21:44
y luego ya la defino, vale
00:21:46
entonces aquí
00:21:48
por ejemplo, esto sería persona
00:21:50
public class persona
00:21:52
aquí no pongo nada, pero es como si estuviera
00:21:54
poniendo extends
00:21:56
object, si no
00:22:06
pongo nada, aquí estoy poniendo
00:22:08
extends object
00:22:10
si
00:22:12
O sea que aquí arriba estaría object
00:22:13
¿Sí?
00:22:17
Tengo persona
00:22:18
Luego tengo public class alumno
00:22:19
Que extends persona
00:22:22
Entonces alumno
00:22:23
Es un
00:22:25
Persona
00:22:27
Un objeto alumno es un objeto persona
00:22:29
Que es un objeto object
00:22:32
¿Sí?
00:22:34
Public class empleado
00:22:37
Extend persona también
00:22:38
Y esto no necesariamente
00:22:40
se acaba aquí, yo puedo hacer public class
00:22:42
profesor que extensa empleado
00:22:44
entonces la persona tiene nombre
00:22:46
y apellido, el empleado tiene también
00:22:48
un sueldo, el profesor tiene también
00:22:50
además que un sueldo, que un nombre
00:22:52
que un apellido, tiene también una lista de asignaturas
00:22:54
¿se entiende?
00:22:56
y esto lo puedo hacer cuanto me da la gana, creando
00:22:59
una jerarquía de clases
00:23:01
es automático
00:23:04
lo hace él, si tú no me dices de quién
00:23:10
extendes, en automático extendes de obvio
00:23:13
eso es una buenísima pregunta
00:23:15
Y es no en Java
00:23:22
Porque hay otros lenguajes de programación que sí lo permiten
00:23:25
Java no permite multiherencia
00:23:29
Herencia múltiple
00:23:32
Siempre tú puedes heredar de una sola clase
00:23:33
Puedes hacer una secuencia
00:23:37
Te dices, mira, profesor necesita heredar de empleado y de persona
00:23:39
Vale, pues persona necesita de empleado, empleado de profesor
00:23:44
Eso sí
00:23:47
Pero no puedes decirle extend
00:23:47
Persona y extend
00:23:49
Animal
00:23:51
Por eso son animales
00:23:55
Solo en los exámenes
00:23:57
Y entonces
00:24:03
Si yo tuviera que crear una estructura
00:24:04
Como esta, estas serían
00:24:07
Claramente como son public
00:24:09
Cada una en su
00:24:10
Fichero
00:24:13
Esto en persona.java tendría esta definición
00:24:14
Aquí, en alumno.java
00:24:17
Esta definición aquí, etc
00:24:19
Esta es un poquito la idea
00:24:20
¿Vale?
00:24:30
Cuando yo tengo una clase alumno
00:24:32
Sería la
00:24:34
La estructura externa
00:24:35
Tengo todos
00:24:37
Los atributos, tanto de persona como alumno
00:24:39
Como los métodos de persona y de alumno
00:24:43
¿Vale?
00:24:45
En teoría es como si
00:24:47
El objeto de la subclase
00:24:49
Encrustara dentro un objeto
00:24:52
De la superclase
00:24:55
y veremos ahora cuando veremos
00:24:56
los constructores
00:25:00
cuando yo me creo un objeto alumno
00:25:02
antes me estoy creando
00:25:05
un objeto persona
00:25:07
y antes me estoy creando
00:25:07
un objeto object
00:25:09
¿sí?
00:25:12
¿dudas?
00:25:15
por eso un alumno puede tener
00:25:16
acceso a los nombres, apellidos, al año de nacimiento
00:25:18
a imprimir y además
00:25:21
a las cosas suyas, mientras una persona
00:25:22
sólo tendría acceso a estas cosas aquí. Duda. Te he contestado. Más dudas. Ejemplo. ¿Os acordáis los
00:25:24
modificadores que eran public, protected, package y private? Y nosotros decimos, bueno, protected no
00:25:42
sabemos qué es porque no lo entenderemos hasta que veremos las la herencia pues ahora ya hemos
00:25:54
visto la herencia según que es que es protected pues si os acordáis public esta clase o este
00:26:02
método esta variable es accesible desde cualquier lado no me importa private sólo desde dentro la
00:26:08
clase package sólo desde dentro la clase u otras clases que parte que pertenecen al mismo
00:26:16
package? Pues con protected es a otras clases que pertenecen al mismo package o que hereden
00:26:23
de esta clase. Si yo tengo una clase que está en otro package, que pero extiende esta clase
00:26:32
de aquí, pues entonces puede acceder a sus métodos y a sus variables. Son cuatro niveles
00:26:40
de protección, de privacidad
00:26:48
que tiene. Desde lo más privado posible, que es sólo esta clase puede utilizar
00:26:53
estas cosas, hasta lo más amplio posible, que es
00:26:57
todos lo pueden utilizar. Y con esto puedo jugar.
00:27:00
No tiene acceso a esas variables. Pues tú puedes utilizar
00:27:05
los métodos públicos, que es lo que se suele hacer.
00:27:32
Cuando tú pones el private, no lo pienses con herencia.
00:27:36
Cuando nosotros poníamos el sueldo de mi cuenta es private, pero luego el sacar dinero, meter dinero, pues lo ponías como público. Lo que tú querías es que la gente no atacara directamente la variable,
00:27:39
va a pasar por un método en el que tú haces los controlos necesarios para evitar que él saque 100
00:27:54
euros cuando tienen sólo 50 en el banco o sea que el método es público entonces tú heredas eso la
00:28:00
private te dice que no puedes acceder a la variable directamente pero puedes seguir utilizando los
00:28:06
métodos que tú tienes si tú la tienes protected como has heredado podrás acceder cosa que a lo
00:28:11
mejor una otra clase desde fuera del package no puede atacar porque es protect entonces eso luego
00:28:17
Luego, para los ejercicios que hacemos nosotros no valen mucho, pero luego en un programa más complejo donde la seguridad empieza a ser interesante, saber limitar el acceso a métodos o cosas así, o de todas formas hacer que el acceso sea controlado porque tú accedes desde un método particular y no del método que te da la gana.
00:28:24
Pero luego tú tengas métodos de apoyo
00:28:45
Que sí que utilizas dentro
00:28:48
Asumiendo que todo funciona bien
00:28:49
Porque lo has hecho tú dentro del package
00:28:51
No sé si me explico, pues eso lo puedes hacer
00:28:53
Entonces con eso tienes los varios niveles
00:28:55
De
00:28:57
De seguridad
00:28:58
No me sale
00:29:00
Visibilidad
00:29:02
¿Sí? Vale, entonces aquí
00:29:04
Tenemos una clase protected, vale
00:29:07
Tenemos public persona
00:29:09
Con nombres igual a
00:29:11
Anónimo, vale, public persona
00:29:13
que son dos constructores
00:29:15
vale, uno es sin nada, es constructor
00:29:18
por defecto, entonces me pone solo que el nombre
00:29:20
anónimo y no me pone nada en este de aquí
00:29:22
me pondrá null y me pondrá
00:29:24
cero aquí, y si no persona
00:29:26
con tres datos que accede
00:29:28
a ellos de ahí, vale
00:29:29
entonces public
00:29:31
void imprime que accederá
00:29:34
a estas cosas, el acceso
00:29:36
a los constructores y
00:29:37
al método
00:29:40
imprime es público, todo lo pueden
00:29:42
hacer, pero si quiero modificar estas
00:29:44
cosas, la puedo modificar solo desde el mismo
00:29:45
package, clase del mismo package
00:29:48
o clases que hereden
00:29:49
esta persona, vale, esto es
00:29:51
un poco, en cierto sentido
00:29:54
como meterlo privado, pero
00:29:55
permito a quien
00:29:57
estenda persona de poder
00:29:58
trabajar con estas variables
00:30:01
vale
00:30:03
en este contexto
00:30:08
vale, de protect
00:30:11
de cosas así
00:30:12
ahora veremos por qué
00:30:13
a la pregunta que has hecho tú. Existe una palabra reservada, que se usa en dos contextos
00:30:16
distintos, esto es para constructores o métodos, que es la palabra super. Super es algo parecido
00:30:25
al concepto de dis. ¿Os acordáis dis? ¿Qué era dis? Estoy hablando de una instancia,
00:30:33
pero sin saber cuál es la instancia. Es esta instancia. ¿Por qué? Porque estoy definiendo
00:30:45
una clase, todavía no tengo un objeto
00:30:50
creado, es la clase en general
00:30:52
pero tengo que decir que cuando tú tendrás
00:30:54
un objeto, pilla ese objeto
00:30:56
y haz algo con él, pero como no
00:30:58
tengo una referencia, no es x, no es
00:31:00
new objeto, porque todavía no lo tengo
00:31:02
pues entonces lo llamo this
00:31:04
pues super es algo parecido
00:31:06
pero se refiere no a mi
00:31:08
sino a mi super clase
00:31:10
es una referencia
00:31:12
a la clase de la que yo heredo
00:31:14
¿sí?
00:31:16
Ahora, superasís normalmente se suele utilizar en términos de constructor, ¿vale?
00:31:19
Y también de método, eso lo veremos después
00:31:28
Si vosotros miráis este es alumno que extiende persona, ¿vale?
00:31:30
Como alumno extiende persona, tiene su grupo y su horario, que son cosas propias de alumno
00:31:34
Pero tendrá también nombre, apellido y año de nacimiento, porque lo derivan desde persona, ¿sí?
00:31:41
Ahora, cuando yo creo un alumno vacío
00:31:47
Que no sé nada de él
00:31:51
Lo que quiero hacer es crear una persona
00:31:53
O sea, un alumno con nombre anónimo
00:31:57
Entonces, lo que estoy haciendo aquí, con esta línea de aquí
00:32:00
Es, vale, cuando creas un alumno
00:32:04
Llama al constructor de la superclase sin parámetros
00:32:07
Es decir, esto
00:32:13
Entonces, cuando yo estoy llamando alumno así, lo que hará él es llamar primero al constructor sin parámetros de arriba, porque lo estoy llamando aquí, a esto.
00:32:17
Entonces me pondrá, me creará todo lo que es una persona con sus atributos, me creará la parte esta aquí gris, ¿vale?
00:32:34
Poniendo en nombre anónimo, y aquí datos por defecto porque no los tengo.
00:32:42
Y después seguirá con este constructor
00:32:47
Y como este constructor no tiene nada
00:32:51
Lo dejará ahí, así
00:32:53
Entonces este constructor de aquí
00:32:54
La parte debajo del super
00:32:56
Crearía la parte blanca
00:32:57
Que pero como es un constructor por defecto
00:32:59
No hace nada
00:33:02
Pondría dentro group null
00:33:02
Y dentro echar
00:33:04
No sé qué carácter
00:33:05
Un carácter
00:33:07
Nulo
00:33:07
¿Están de acuerdo?
00:33:09
Vale
00:33:13
Fijaos en esto
00:33:13
A ver, pero alumno es una persona
00:33:15
Entonces, cuando yo creo un alumno
00:33:24
Antes de crear un alumno, tengo que crear una persona
00:33:27
Porque un alumno es una persona
00:33:30
Entonces, si no tengo una persona, no puedo crear un alumno
00:33:32
Entonces, esta cosa de aquí
00:33:34
Te está diciendo, vale, para crear un alumno
00:33:37
Porque este es el constructor del alumno
00:33:40
Haz, llama el constructor de mi clase padre
00:33:42
¿Vale?
00:33:47
Y como aquí no tiene parámetros, el que no tiene parámetros
00:33:48
Es decir, esto
00:33:51
Entonces, este de aquí
00:33:52
Lo que hará
00:33:57
Es construir la parte gris
00:33:59
El corazón
00:34:01
La parte que es persona
00:34:03
Y que pondrá en nombre
00:34:05
Anónimo, porque lo pone aquí
00:34:07
Y como en los demás no te hace nada
00:34:09
Pues pondrá en apellidos null
00:34:11
Y en año de nacimiento, cero
00:34:13
Y ahora he creado esta parte aquí
00:34:14
Pero no he creado un alumno
00:34:17
He creado solo la parte persona
00:34:18
Volvería aquí y seguiría con este
00:34:20
Constructor, que pero como no hace nada
00:34:24
Pondrá dentro de grupo
00:34:26
Y de horario valores por defectos
00:34:28
Y ya está, ya tengo mi alumno con la parte
00:34:30
Dentro y la parte fuera creada
00:34:32
¿Vale? Déjame explicar el próximo
00:34:33
Que a lo mejor es más claro
00:34:36
O sea, se clarifica algo
00:34:38
Pongamos un alumno, un constructor
00:34:39
De alumno que pilla solo nombre, apellido
00:34:42
Y no nacimiento
00:34:44
Pero no pilla ni grupo ni horario
00:34:45
¿Vale? Entonces yo lo que puedo
00:34:48
Hacer es, vale, muy bien, vete a
00:34:50
Llamar super de nombre, apellido y año nacimiento.
00:34:52
O sea, estoy buscando un constructor de mi clase superior que tenga estos tres parámetros, string, string, int.
00:34:59
Y voy a mirar y efectivamente tengo un constructor string, string, int.
00:35:13
Entonces, esta vez no estaré usando esto, estaré usando esto.
00:35:17
Y como hemos dicho que soy una persona, primero creo una persona y luego crearé la parte de alumno.
00:35:21
Y en la parte de persona pondré nombre dentro de nombre, apellido dentro de apellido,
00:35:27
y como luego no tengo nada más, pues la parte de alumno se quedará como vacía.
00:35:31
Se quedará con valores por defecto.
00:35:37
Esto es crear un alumno, pero sin saber las características de alumno.
00:35:41
Y luego finalmente tengo el constructor propio de alumno de verdad
00:35:45
Que sería alumno con nombre, apellido, año de nacimiento, su grupo y su horario
00:35:51
Entonces, ¿qué hará esto?
00:35:57
Pues primero construir una persona
00:36:01
Y para hacer una construcción de una persona, llamará el constructor super
00:36:03
Con los parámetros necesarios a crear una persona
00:36:07
Esto creará la parte gris
00:36:10
y después seguirá llamando, por ejemplo, este método que es ponGrupo al que le paso este grupo y este horario
00:36:12
y si os fijáis, ponGrupo lo que hace es rellenar dis.grupo y dis.horario, comprobando que el grupo no sea nulo.
00:36:24
Es un ejemplo. ¿Se entiende?
00:36:34
Entonces, si ahora aquí tengo tres constructores de alumnos, puedo hacer un alumno anónimo,
00:36:38
Puedo hacer un alumno que sepa los datos de personas, pero todavía no sepa su grupo y su horario, o puedo crear un alumno que sepa todo. Y lo que voy a hacer es usar los constructores ya existentes de la persona.
00:36:42
de la persona
00:36:58
ahora, la pregunta es
00:36:59
centrémonos en esto
00:37:02
¿no podría haber hecho esto?
00:37:04
es decir, ver que public
00:37:08
alumno con estos datos son los mismos
00:37:10
en vez de llamar super
00:37:12
bla bla bla, hacer que dis.nombre
00:37:14
es igual a nombre, dis.apellida es igual a
00:37:16
apellida, dis.nacimiento es igual a nacimiento
00:37:18
¿funcionaría?
00:37:20
funcionaría, sí
00:37:25
lo podría hacer perfectamente
00:37:29
en este caso
00:37:31
o sea que esto
00:37:33
O esto
00:37:35
Son idénticos en este caso
00:37:36
¿Vale?
00:37:39
Se suele usar esto
00:37:41
¿Por qué?
00:37:43
Primero porque es más
00:37:45
Más
00:37:46
¿Cómo se dice?
00:37:49
Conciso
00:37:50
Pero por otro lado
00:37:51
Tiene también otra razón
00:37:55
Que viene más adelante
00:37:57
¿Dónde viene?
00:37:58
Más adelante
00:37:59
Entonces la veremos más adelante
00:38:00
¿Vale?
00:38:02
Pero pasa por
00:38:02
Si yo esto lo meto private
00:38:04
Esta cosa de aquí ya no funcionaría
00:38:07
Entonces no podría crear la persona con los datos que le he pasado
00:38:11
Sin embargo, si uso super
00:38:15
Como el constructor sí es público
00:38:17
Sí lo puede hacer, en parte
00:38:21
No lo hemos visto todavía porque viene más adelante
00:38:30
Por algún lado viene esta cosa explicada
00:38:32
Pero, de algún modo es esto
00:38:34
Si tú aquí le pones privado
00:38:36
Entonces desde la subclase no puede acceder
00:38:39
Entonces, ¿qué hago? Pues uso cosas como esta. Por ejemplo, accediendo al super, pues entonces sí puede acceder porque super sí es accesible. El constructor. Fijaos que por ahora super aquí lo hemos usado solo como constructor. Tenemos dos otras formas de usar super, que es como referencia para acceder a sus variables o como método. Y lo veremos ahora en la próxima transparencia.
00:38:41
dudas hasta aquí
00:39:07
porque no estoy accediendo a la variable
00:39:08
estoy accediendo al constructor
00:39:16
y si tú querías hacer alguna protección o cosa por el estilo
00:39:17
has metido aquí la protección
00:39:21
no me está
00:39:22
permitiendo de acceder a año nacimiento
00:39:24
y poner menos 7
00:39:27
porque tú dentro de este constructor
00:39:28
habrás comprobado que año nacimiento
00:39:30
no puede ser negativo y que por lo tanto
00:39:32
no me meterá nunca menos 7
00:39:34
luego no lo has hecho pues el problema es tuyo
00:39:36
ok
00:39:41
Prueba
00:39:43
Vamos a ver
00:39:47
Esta es una clase prueba
00:39:50
Tiene un main
00:39:51
Persona vecina es igual a new persona
00:39:53
Con estos datos
00:39:56
Alumno, un alumno es igual a new alumno
00:39:57
Con estos datos
00:40:00
Un alumno.pongrupo le pasa dos cosas
00:40:01
Os recuerdo pongrupo es esto
00:40:04
Vale, entonces
00:40:06
Aquí en vez de utilizar este constructor
00:40:07
He usado este constructor y luego he rellenado
00:40:09
Estos dos utilizando su método
00:40:12
aquí
00:40:14
si ahora llamo
00:40:15
vecina.imprime
00:40:17
imprime es esto
00:40:19
es un método de clase persona
00:40:21
y lo que hace es decir
00:40:24
datos personales y luego pone su nombre
00:40:26
su apellido y su año de nacimiento
00:40:28
pues si yo llamo
00:40:30
vecina.imprime
00:40:32
lo que obtendré es
00:40:34
datos personales
00:40:36
Luis Asenjo Martínez
00:40:37
si ahora
00:40:39
hallamos un alumno.imprime, oye, en alumno no está imprime. Está imprime grupo, pero
00:40:43
no está imprime. Pero como extende persona, está importando, está copiando este de aquí.
00:40:51
Y entonces usará el imprime definido en persona, que fijaos, usa solo nombre, apellido
00:40:58
y año nacimiento, que son los datos que están en persona y que también alumno tiene. Por
00:41:06
Por lo tanto, el alumno podrá escribir datos personales Juan Ugarte López, 1985.
00:41:12
¿Sí? Exactamente como el otro.
00:41:20
Y luego dice, un alumno, punto, imprime grupo.
00:41:21
Es decir, sobre un alumno utiliza este método de aquí, que escribe el grupo y el horario.
00:41:25
¿Sí?
00:41:33
Y lo puede hacer porque el alumno está definido en primer grupo.
00:41:33
¿Podría hacer vecina punto en primer grupo?
00:41:39
¿Cuánto atrás?
00:41:50
¿Y podría hacer vecina punto en primer grupo?
00:42:00
No, ¿por qué no?
00:42:03
Porque alumno es una persona
00:42:06
Pero persona no es un alumno
00:42:10
Con el alumno puedo usar todo lo que está en persona
00:42:13
Pero en persona no puedo usar las cosas que están en alumno
00:42:17
¿Se entiende?
00:42:21
¿Dudas?
00:42:23
Vale
00:42:28
¿Qué pasaría si el atributo
00:42:28
Ah, sí, está aquí, que es lo que decía antes
00:42:30
Que el atributo nombre fuera privado, declarado private
00:42:32
Si yo aquí
00:42:35
El nombre lo pongo
00:42:36
Como private
00:42:38
Nombre
00:42:40
Si hiciera esto
00:42:41
De aquí, de alumno
00:42:44
Esto es el constructor de alumno
00:42:46
Y hago dis.nombres igual a nombre
00:42:48
Dis.apellidos, apellidos, etc, etc
00:42:50
Cuando hago esto
00:42:52
Se enfada
00:42:53
Me dice, tú no puedes acceder al nombre
00:42:55
Porque el nombre lo has declarado en persona
00:42:58
Y es privado
00:43:02
Entonces se puede usar solo dentro de persona
00:43:03
Solo dentro de esta clase
00:43:06
Sin embargo, si yo lo uso con super nombre, apellido
00:43:08
Yo no estoy accediendo a la variable nombre
00:43:13
Yo estoy usando el constructor de persona
00:43:16
Y el constructor de persona es público
00:43:20
Puede acceder tranquilamente a él
00:43:22
Y será él desde dentro de persona
00:43:24
Que accede al nombre
00:43:26
Entonces sí lo puede hacer
00:43:27
No accede directamente al campo privado
00:43:29
Si no llamo al constructor de la superclase
00:43:39
Que podría incluir controles adicionales
00:43:41
Sobre el campo que se ha declarado private
00:43:43
Y podría preguntarme
00:43:45
Que no sea null
00:43:47
Que sea al menos un carácter
00:43:49
Que no sé qué, no sé cuánto
00:43:51
¿Dudas?
00:43:52
Vale, vamos a darnos una pausa
00:43:59
Sobre la teoría
00:44:01
Y intentamos crear esta estructura de aquí
00:44:03
Vamos a crear una clase dispositivo
00:44:07
Que tenga dos otras clases
00:44:12
Que son la clase móvil y la clase ordenador
00:44:15
Las dos que hereden desde dispositivo
00:44:17
Tened en cuenta que aquí hay algunos metodillos
00:44:20
Como por ejemplo el método enciende
00:44:24
Que escribirá el dispositivo está encendido
00:44:25
Y que probablemente se terá el encendido a true
00:44:28
Apaga, apaga el dispositivo
00:44:32
Estado que dice el número serial
00:44:35
O sea, este dispositivo está encendido
00:44:37
O apagado, dependiendo de si
00:44:39
Está encendido o apagado
00:44:41
El móvil
00:44:42
Además que todo lo que hace un dispositivo
00:44:45
Añade su número
00:44:47
Número de teléfono
00:44:49
Y tiene estado móvil
00:44:50
Que fijaos
00:44:54
Es parecido a estado, solo que estado móvil
00:44:54
Lo que hace, te dice que
00:44:57
El móvil con número no sé qué
00:44:59
Y número serial no sé cuánto
00:45:01
Está encendido o apagado
00:45:02
Es una especificación de ese estado
00:45:04
Y aquí también estará ordenador
00:45:06
Que tiene un IP
00:45:08
Y dice estado del ordenador
00:45:09
Que dirá, escribe el móvil
00:45:11
No, el móvil no, será el ordenador
00:45:13
Con IP, IP
00:45:15
Y número serial está encendido o apagado
00:45:16
¿Lo hacéis vosotros?
00:45:18
¿No queréis que lo haga yo?
00:45:22
Haced vosotros
00:45:26
Haced vosotros
00:45:27
Venga haciéndolo vosotros
00:45:29
¿Cuánto tardáis en hacer esto?
00:45:32
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 10
- Fecha:
- 13 de enero de 2025 - 14:26
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 45′ 38″
- Relación de aspecto:
- 16:10 El estándar usado por los portátiles de 15,4" y algunos otros, es ancho como el 16:9.
- Resolución:
- 1152x720 píxeles
- Tamaño:
- 115.49 MBytes