Teoría Herencia parte1 - 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:
Vale, este vídeo es una grabación, por lo tanto si decidís de hablar, automáticamente me dais el consentimiento a que se grabe vuestra voz, ¿vale?
00:00:00
Hoy vamos a hablar de un tema nuevo que es la herencia, ¿vale?
00:00:11
Entonces, ¿qué es la herencia así en plan definición básica?
00:00:16
Pues es un mecanismo para la reutilización de software, ¿vale?
00:00:24
La idea es que una de las cosas importantes cuando yo voy a trabajar y a desarrollar aplicaciones y cosas por el estilo
00:00:28
es que mi código debería ser reutilizable, ¿vale?
00:00:37
Muchas veces en un proyecto o en un proyecto nuevo, las cosas que necesito,
00:00:44
Algunas clases, algunas herramientas que me permiten conectarme a otro sistema
00:00:50
A una base de datos o cosas por el estilo
00:00:57
Ya están desarrolladas anteriormente
00:00:59
Y muchas veces no necesito volver a reinventar la rueda
00:01:04
Para decir, mira, voy a crear otra vez la conexión a la base de datos
00:01:08
Porque tengo ya una clase que hace los métodos que necesito
00:01:13
Pero lo hago otra vez
00:01:16
Hay momentos en el desarrollo de un sistema en que esto puede ser necesario o útil
00:01:17
Si hay una clase que se usa ya desde 20 años
00:01:22
Que usa un Java antiguo y que funcionaba hace 20 años y hasta ahora ha funcionado
00:01:26
Y ahora me viene un momento en que la necesidad me dice
00:01:32
Mira, esta clase hay que rehacerla nueva para que sea más eficiente
00:01:34
Y cosas por el estilo, pues se rehace desde cero
00:01:37
Fenomenal
00:01:39
Pero en general la idea es que yo pueda utilizar componentes o módulos o clases o paquetes de otros proyectos
00:01:40
Si es que esos me sirven para el proyecto nuevo que estoy haciendo
00:01:50
Y esto todo es como idea general de utilización de software, de coding
00:01:53
Pues la herencia es un mecanismo que me permite eso
00:01:59
Es un mecanismo que me permite estructurar de forma más organizada lo que es mi código
00:02:04
Para que yo luego pueda heredar, pueda pillar el código ya creado y reutilizarlo fácilmente
00:02:13
Permite sostancialmente definir una clase a partir de otras clases reutilizando su código
00:02:22
Un ejemplo básico para entender de lo que estamos haciendo es este de aquí
00:02:30
Imaginaos que yo tenga una clase Persona
00:02:36
La clase Persona tiene un string nombre y un ente edad
00:02:39
Y cualquier persona tiene estos datos
00:02:42
A mí me interesa en mi sistema el nombre de las personas y la edad de la persona
00:02:46
A partir de aquí mi sistema me pide, por ejemplo, que cree una clase Profesor
00:02:50
Ahora, el profesor es una persona
00:02:57
La clase profesor debería tener nombre, debería tener edad
00:03:00
Y además algo más que estas informaciones para que haga algo más
00:03:05
Que puede ser un método más, puede ser un atributo más
00:03:11
Por ejemplo, me interesa un array de string que me diga las asignaturas que imparte este profesor
00:03:14
La idea es que si yo no tuviera este nuevo mecanismo que ahora vamos a ver
00:03:21
Pues debería crear una nueva clase profesor
00:03:26
Donde vuelva a escribir que tiene string nombre
00:03:30
Tiene int edad
00:03:33
Y además tiene string asignatura impartida
00:03:34
La idea es que evite esto
00:03:38
Y simplemente le diga a la clase profesor
00:03:41
Oye, mira profesor
00:03:43
Tú, en algún modo, heredas
00:03:44
Tienes una relación con persona
00:03:48
Tú, profesor, eres una persona
00:03:51
Por lo tanto tendrás todo lo que tiene persona
00:03:55
Y además de eso, algo más que hace que tú seas un profesor
00:03:57
Y yo luego con un profesor puedo pedirle su nombre, puedo pedirle su edad
00:04:02
Y además puedo pedirle esa cosa extra
00:04:07
O por ejemplo, puedo crear un estudiante
00:04:10
Y también el estudiante es una persona
00:04:14
Entonces yo pondré que también estudiante es hereda de persona
00:04:18
Y además de todo lo que tenga persona, pues le añado sus notas
00:04:23
Por ejemplo, una red de int que son sus notas
00:04:28
Entonces aquí yo tengo tres clases, ¿vale?
00:04:31
Que se relacionan entre ellos
00:04:34
Yo puedo crear una persona cualquiera que no es ni profesor ni estudiante
00:04:35
Tendrá solo nombre y edad
00:04:39
O puedo crear un profesor que tendrá todo lo que es la persona más lo propio del profesor
00:04:41
O crear un estudiante que tendrá todo lo que es una persona más las notas
00:04:47
La cosa interesante es que antes, en una situación como esta, entre personas, profesores, estudiantes, repitiendo todo, si yo quería hacer un cambio en, por ejemplo, cómo se maneja el nombre o la edad de las personas, tenía por triplicado este código.
00:04:53
Que tenía que ir en tres clases distintas a cambiar, a modificar, a actualizar el código que tenía
00:05:10
En vez de ahora, en cierto sentido, tengo el código una sola vez en persona
00:05:18
Y las otras dos clases heredan de esta persona
00:05:24
Si yo hago un cambio en cómo se gestiona el nombre, la edad o los atributos que tiene una persona
00:05:28
Automáticamente las otras clases que heredan de ellas adquirirán estos cambios
00:05:34
¿Cuándo y para qué se usa la herencia?
00:05:40
Hay dos escenarios posibles en que la herencia nos viene muy bien
00:05:51
Uno es el caso de especialización
00:05:56
Por ejemplo, la clase coche como especialización de vehículo
00:05:58
Esto es en el caso en el que yo quiero desarrollar una nueva clase
00:06:02
Una clase extra en mi sistema
00:06:07
Y que esta clase se parece mucho a otra clase ya existente
00:06:09
Que buena parte del código de esta clase nueva ya está en otra clase
00:06:14
Entonces, que ya existe
00:06:20
Entonces, en vez de estar a escribir otra vez el mismo código
00:06:22
Y a duplicar el código, que si luego me doy cuenta que hay un error
00:06:27
Lo tengo que cambiar en 2, 3, 4, 50 clases
00:06:31
Pues lo que hago es extender la clase que ya existe
00:06:34
Pues en este caso existe ya vehículo
00:06:39
Y yo extendo la clase vehículo con coche, que es un vehículo, por lo tanto tendrá todo lo que tiene este vehículo, y además algo más, una característica o un método o las dos cosas adicionales para especificar cuál es la diferencia entre un coche y un vehículo.
00:06:41
Entonces, la solución de un escenario como ese en el que ya tengo una clase y quiero crear una clase nueva
00:06:59
Que esta clase nueva comparte muchísimo de la clase anterior, pero extiende en algo
00:07:09
Es crear una subclase, o clase liga o clase derivada, ¿vale? Así sea
00:07:14
¿Qué es? Creo esta clase nueva, hago que se refiera a la clase anterior
00:07:19
Pilla todo lo que había en común con la clase anterior y es como si lo duplicara
00:07:24
Y además añado el específico de esta nueva clase
00:07:29
La segunda opción en que la herencia es útil es el proceso al revés
00:07:32
Es la generalización, ¿vale?
00:07:38
O sea, crear la clase vehículo como generalización de coche, moto, patinete y bicicleta
00:07:41
Esto pasa cuando como escenario tenemos un conjunto de muchas clases
00:07:48
Y nos damos cuenta que en estas clases de mi sistema hay algo en común
00:07:54
Hay muchos elementos que son parecidos
00:08:02
Si pensáis, por ejemplo, yo tuviera la clase coche, la clase moto y la clase patinete
00:08:07
Pues a lo mejor todos tienen, qué sé yo, número de ruedas, tienen velocidad máxima
00:08:14
tienen algunos atributos y métodos, o moverse como método y cosas por el estilo, que se parecen mucho.
00:08:19
Entonces puede llegar un momento en que digo, vale, en vez de tener este código muy parecido,
00:08:28
por triplicado, cuadruplicado y cosas por el estilo en varias clases, la parte común de todas estas la pongo en una clase única,
00:08:34
que es una clase que generaliza el concepto que estoy modelizando.
00:08:44
para luego dejar las clases que tenía ahora como hijas, como clases que heredan, como subclases de esta clase generalizada,
00:08:49
poniendo solo en cada uno la parte distinta con respecto a todos los demás.
00:08:59
Entonces, la herencia normalmente se piensa desde arriba hasta abajo, o sea, yo tengo ya una clase hecha y creo una clase hija que extende,
00:09:08
añade algo a la clase
00:09:17
que existía. Pero si yo estoy
00:09:20
haciendo una realización o
00:09:22
llego en una empresa nueva o
00:09:23
un proyecto viejo o
00:09:25
un sistema que ya
00:09:27
está construido, pues puede ser útil
00:09:30
hacer un análisis y ver si
00:09:32
alguna de las clases que ya existen en realidad
00:09:34
comparten mucho código y este
00:09:36
código se puede agrupar
00:09:38
en una única clase, mejorando
00:09:40
mucho lo que es
00:09:42
la mantenibilidad
00:09:44
De este sistema
00:09:46
¿Vale?
00:09:47
Porque ahora no tengo que ir en 7 puntos distintos
00:09:47
Cada vez que quiero hacer un cambio
00:09:50
Los tengo todos centralizados en una clase
00:09:51
Que luego se hereda en la otra
00:09:53
Vale
00:09:55
Este es un ejemplo más
00:10:00
Directo, entre comillas
00:10:02
Para entender de qué estamos hablando
00:10:05
No sé si se ve bien
00:10:07
Vamos a ver
00:10:08
La situación sin herencia
00:10:11
¿Vale?
00:10:14
Entonces, imaginémonos que estamos en una situación parecida a esta
00:10:15
Nosotros tenemos tres clases
00:10:18
Tenemos la clase recurso, que es un recurso genérico
00:10:20
Y luego tenemos la clase aula y la clase ordenador
00:10:23
Que son recursos de mi escuela, por ejemplo
00:10:26
¿Vale?
00:10:29
Entonces, recurso tiene un nombre, una descripción
00:10:30
Un método que es tu nombre, de qué recurso eres
00:10:33
Y decir descripción, ¿vale?
00:10:38
Es exactamente un osguete
00:10:40
¿Vale?
00:10:41
Vale, fenomenal
00:10:43
Cuando voy al aula
00:10:43
El aula es un recurso también en general, ¿vale?
00:10:45
Pero que tiene su nombre, su descripción, su decir nombre, su decir descripción
00:10:49
Y además tiene localización y decir localización, ¿vale?
00:10:53
Aquí si yo veo, la parte en azul es sustancialmente código redundante
00:10:58
Código que ya existía antes y que he vuelto a escribir en esta clase aquí
00:11:04
Y que será muy parecido
00:11:08
Pero tiene también la parte negra, digamos, que es la parte nueva
00:11:10
Son cosas que un recurso genérico no puede decir
00:11:14
Mientras que un aula sí
00:11:18
Lo mismo pasa con el ordenador
00:11:19
El ordenador tiene nombre, descripción y los métodos relacionados
00:11:21
Que igualmente, porque es un recurso y me sirve para identificar el ordenador
00:11:24
Pero también tiene el sistema operativo que tiene instalado
00:11:30
Entonces, en una situación como esta
00:11:32
La herencia me sirve
00:11:35
Porque lo que puedo hacer es pasar a esto
00:11:39
Es decir, crear a este punto una clase padre o superclase
00:11:42
O clase... no sé, hay varios nombres, ahora lo veremos
00:11:51
Que está por arriba, digamos, de recursos
00:11:55
Es una clase generalizada, es una idea general de recursos
00:11:58
Todos los recursos están hechos así
00:12:02
Hemos visto que tanto aula como ordenador tenía estas cosas
00:12:03
Por lo tanto, un recurso genérico tiene que tener un nombre, una descripción
00:12:07
Decir su nombre, decir su descripción
00:12:10
Y luego hago que aula y ordenador hereden de esta clase de cursos
00:12:12
Entonces este concepto de herencia que estamos viendo hasta ahora
00:12:20
Lo que está haciendo es como si el código de recurso lo copiara dentro de aula
00:12:24
Y luego añadiera lo extra
00:12:30
Pero en realidad no lo está haciendo
00:12:33
Esto es una cosa interesante porque si mañana
00:12:36
Quiero añadir algo a un recurso genérico
00:12:40
O quiero modificar, por ejemplo, decir nombre, decir descripción
00:12:42
Para que haga algo distinto y haga algo más formal
00:12:46
O resolver un error o encontrar un algoritmo que hace algo de forma más eficiente
00:12:50
Lo tengo que cambiar solo en recurso
00:12:55
No en todas las clases que antes tenían estos datos
00:12:57
Y automáticamente, como todas las otras clases se heredan de esto
00:13:01
Los opinios
00:13:05
Dudas
00:13:07
En general, cuando se habla de una cosa así de herencia
00:13:09
Se dice que la clase debajo, esta clase hija
00:13:20
Extiende o hereda la otra
00:13:23
Hereda en referencia a la herencia, el concepto de herencia
00:13:26
Que es inheritance en inglés, creo
00:13:32
Y extiende porque veremos que la palabra que se utiliza
00:13:34
Para, digamos, relacionar las dos clases es extends
00:13:39
En un cierto sentido es como si pillara esta clase
00:13:43
Y la extendo con más información
00:13:46
¿Dudas?
00:13:50
Esto es nomenclatura, ¿vale?
00:13:53
Imaginémonos que tenga dos clases
00:13:56
La clase taxi y la clase vehículo
00:13:58
¿Vale?
00:14:02
Claramente vehículo será la clase que está arriba
00:14:03
Y hago una clase taxi a partir de este vehículo que es más genérico
00:14:05
Entonces, para indicar la relación entre estas dos clases
00:14:11
Puedo decir todas estas cosas
00:14:15
Es decir, que taxi hereda desde vehículo
00:14:17
O que taxi extiende vehículo
00:14:20
O que taxi es subclase de vehículo
00:14:23
O que taxi es clase derivada
00:14:26
O es clase hija
00:14:29
Todo esto es para decir que taxi
00:14:31
De alguna forma está relacionada con vehículo
00:14:33
Porque importa todo lo que está allí
00:14:36
Y añade algo más
00:14:38
Y al revés
00:14:40
Yo puedo decir que vehículo es superclase de taxi
00:14:42
O es clase base de taxi
00:14:46
O es clase padre de taxi
00:14:49
¿Vale?
00:14:51
Este es hija, este es padre
00:14:52
¿Sí?
00:14:53
Además, una cosa realmente interesante
00:14:55
Es que la herencia crea un vínculo
00:14:57
Una relación es un
00:15:01
En inglés, is a
00:15:04
¿En qué sentido?
00:15:06
Cuando yo digo que taxi hereda de vehículo
00:15:09
Estoy diciendo que, sustantivamente, taxi es un vehículo
00:15:12
La relación que tengo aquí
00:15:16
Esta que me une, por ejemplo, taxi con vehículo
00:15:20
Es que me está diciendo que taxi es un vehículo
00:15:24
Pero algo más
00:15:26
O aquí es autobús, es un vehículo
00:15:28
Pero algo más
00:15:31
El hecho que es un vehículo
00:15:32
Me está diciendo que hace todo lo que puede hacer un vehículo
00:15:35
Más algo más
00:15:38
¿Dudas?
00:15:41
Esto está relacionado también con una cosa que veremos dentro de un rato
00:15:46
Que es el operador instance of
00:15:49
Que me permite saber si un determinado objeto
00:15:51
Es un instante de una determinada clase
00:15:55
¿Vale?
00:15:57
Si yo hago un objeto taxi
00:15:58
¿Taxi es una instancia de la clase taxi?
00:16:02
¿Taxi es una instancia de la clase vehículo?
00:16:09
Porque taxi es un vehículo
00:16:12
Por lo tanto, también
00:16:16
Y esto me servía para saber
00:16:19
Qué puedo hacer con una clase o no
00:16:21
Si yo entiendo el taxi como vehículo
00:16:25
Podré hacer las cosas que hace un vehículo
00:16:28
Y si yo entiendo el taxi como un taxi
00:16:30
Podré hacer todo lo que hace un vehículo
00:16:33
Y algo más
00:16:34
¿Vale?
00:16:35
Está claro que si yo he declarado un objeto vehículo
00:16:36
Un objeto vehículo no puede hacer lo que hace taxi
00:16:38
Porque vehículo es una instancia de vehículo
00:16:40
Un objeto vehículo es una instancia de la clase vehículo
00:16:45
Pero un objeto vehículo no es una instancia de la clase taxi
00:16:48
Lo que tú quieras
00:16:52
Es que tú tienes que
00:17:00
Si tú estás hablando de taxi
00:17:02
Pues creará todos tus taxis
00:17:05
Sí, pero a un cierto momento
00:17:07
y tienes un vehículo extra que no es ni un taxi ni un autobús
00:17:08
y quieres simplemente tratarlo como vehículo genérico
00:17:12
porque en tu sistema solo los taxis y los autobús tienen un comportamiento extra
00:17:15
todos los otros vehículos son todos iguales
00:17:20
pues entonces lo crearás como vehículo
00:17:22
no es que tienes que
00:17:25
tú puedes hacer las tres, los tres son objetos
00:17:28
está claro que si yo creo un vehículo y luego le intento decir algo propio
00:17:33
De taxi, como por ejemplo
00:17:37
El getNumeroLicencia
00:17:40
El vehículo no tiene número de licencia
00:17:42
Es el taxi que tiene el número de licencia
00:17:44
Según lo que está escrito aquí
00:17:46
Cualquier vehículo le podré preguntar
00:17:48
GetMatricula
00:17:53
Pero solo los taxis tienen el número de licencia
00:17:54
Entonces, si yo creo un taxi
00:17:56
Le podré preguntar
00:17:59
Si hay el número de licencia
00:18:01
O tratarlo como si fuera un vehículo cualquiera
00:18:02
Y decirle, dame tu matrícula
00:18:04
Porque el taxi es un vehículo
00:18:06
Si creo un vehículo genérico
00:18:08
No le puedo la guayera a dir
00:18:11
Dame tu número de licencia
00:18:12
Porque tú no eres un subtaxi
00:18:13
A revés no va
00:18:15
¿Verdad?
00:18:16
Sintaxis de cómo creo una clase
00:18:23
Muy fácil
00:18:26
¿Vale?
00:18:26
Simplemente en Java
00:18:27
¿Vale?
00:18:28
Tengo mi clase
00:18:29
Public clase
00:18:30
Lo que sea
00:18:31
La clase hija
00:18:32
Extends
00:18:34
¿Vale?
00:18:35
Clase padre
00:18:36
¿Vale?
00:18:37
Estoy diciendo simplemente
00:18:38
Que la clase hija
00:18:39
Extende la clase padre
00:18:40
Esto sería taxi
00:18:43
Extends
00:18:44
Vehicle
00:18:45
Y a partir de aquí
00:18:48
Yo desarrollo mi clase
00:18:51
Normal y corriente de toda la vida
00:18:52
Pero aquí dentro
00:18:54
En automático es como si
00:18:57
Hubiese en un cierto sentido
00:18:59
Copiado la clase padre
00:19:01
Aquí arriba y luego desarrollo
00:19:03
El resto
00:19:05
Entonces, si la clase padre tiene matrícula
00:19:07
Pues aquí dentro, dentro de esta clase
00:19:13
Puede utilizar matrícula sin necesidad de declararla
00:19:16
Porque ya existe
00:19:19
Existe heredada desde la clase padre
00:19:20
¿Entienden?
00:19:23
Es como si fuera un atributo de la clase
00:19:27
¿Vale?
00:19:30
Esto siempre a nivel de declaración
00:19:31
Imaginaos una estructura de este tipo
00:19:34
Que hay una persona en general
00:19:36
La persona puede ser empleados o alumnos
00:19:38
Y los empleados pueden ser profesores
00:19:40
¿Vale?
00:19:43
Entonces a nivel de declaración
00:19:44
Sería una cosa de ese estilo
00:19:46
Tengo un public class persona por algún lado
00:19:47
Que me define la persona
00:19:49
Una clase alumno que estende persona
00:19:50
Y una clase empleado
00:19:54
Que estende persona
00:19:56
Y luego tengo una clase profesor
00:19:57
Que estende empleado
00:20:00
Entonces un profesor
00:20:01
Por ejemplo
00:20:04
Tendrá todo lo propio de un profesor
00:20:05
Todo lo propio de un empleado
00:20:07
Y todo lo propio de una persona
00:20:09
Un profesor es un empleado
00:20:11
Y el profesor también es una persona
00:20:16
¿Se entiende?
00:20:19
Preguntas
00:20:27
Vale
00:20:28
Siempre una clase en Java
00:20:31
Puede extender solo una clase
00:20:38
¿Vale?
00:20:40
Entonces no hay lo que se llama herencia múltiple
00:20:41
Hay lenguaje de programaciones que permite herencia múltiple
00:20:44
Como por ejemplo C++
00:20:46
Pero en Java está limitado
00:20:48
Tú puedes extender una sola clase
00:20:51
Si tú tienes que extender dos clases
00:20:53
Tienes un problema
00:20:56
A ver cómo se hace
00:20:57
O haces en cadena
00:20:59
Esta extiende esta, esta extiende otra
00:21:01
O haces utilizando otro mecanismo
00:21:02
Que veremos más adelante
00:21:06
Que son las interfaces
00:21:07
¿Las dudas?
00:21:08
Vale, entonces este es un ejemplo de subclase
00:21:17
Por ejemplo la clase alumno
00:21:20
Esta sería toda la clase alumno que tiene sus atributos y métodos, ¿vale?
00:21:22
Y la clase alumno tiene sus propios atributos y sus propios métodos aquí debajo
00:21:26
Que son propios de la clase alumno, pero como hereda de la clase persona
00:21:30
Pues incluye la parte aquí de arriba que está heredada directamente desde persona
00:21:36
Entonces todos los atributos de persona y todos los métodos que tiene persona, ¿vale?
00:21:42
Estos métodos de aquí, la parte
00:21:48
Digamos, heredadas, no aparece en la clase
00:21:50
Lo que yo pongo en la clase alumno
00:21:53
Después de haberla declarada así
00:21:55
¿Vale? De public class está en persona
00:21:56
Es solo la parte de abajo
00:21:59
Porque la parte esta de aquí
00:22:01
Se da por hecho, se da como si
00:22:02
Existiera porque por algún lado
00:22:04
Tendrá que haber la clase persona
00:22:06
Donde hay el declarado
00:22:08
Y todo el código que permita ver
00:22:10
Lo que hace una persona
00:22:12
Entonces yo
00:22:13
En un main
00:22:16
Creando un alumno
00:22:18
Puedo pedir por ejemplo
00:22:19
El apellido del alumno
00:22:20
Y eso existe
00:22:22
Hasta si en el código del alumno mismo
00:22:23
En ningún lado he puesto string alumno
00:22:26
Porque ya existe dentro de eso
00:22:30
Pero allí ya
00:22:32
Es un poquito más complejo
00:22:41
Y vamos hacia otros temas
00:22:43
Como polimorfismo
00:22:45
Que todavía no sabemos muy bien
00:22:46
Pero sí, en principio sí
00:22:48
Como un alumno es una persona
00:22:50
Si yo tengo un array de personas
00:22:52
Puedo poner en un array de personas alumnos
00:22:53
Lo que
00:22:55
En un array de alumnos
00:22:58
No puedo poner personas
00:23:05
La alumna es una persona
00:23:07
Una persona no es un alumno
00:23:13
No tiene por qué ser un alumno
00:23:14
Si yo tengo un array de alumnos
00:23:16
Asumo que todos los objetos dentro de alumnos
00:23:18
Pueden hacer, por ejemplo
00:23:21
Imprime grupo
00:23:23
Sin embargo
00:23:24
Si yo le pongo una persona
00:23:26
Personas no tienen imprimir grupo
00:23:28
Entonces me diría, ¿qué es esto?
00:23:29
Claro
00:23:32
Tú dices que un alumno es una persona
00:23:33
Una persona no es un alumno
00:23:36
Puede no serlo
00:23:37
¿Sí?
00:23:39
Vale, vamos a ver un ejemplo
00:23:41
Con código
00:23:43
¿Vale? De esto, para ver
00:23:45
De qué estamos hablando
00:23:47
¿Vale? Aquí estamos creando la clase
00:23:49
Persona
00:23:51
Y aquí tengo
00:23:52
Por ejemplo
00:23:57
Unos atributos
00:23:59
Atributos nombre, apellido
00:24:02
Y año de nación
00:24:04
Fijaos
00:24:05
Que para este caso
00:24:07
Es puesto que los
00:24:09
Los atributos
00:24:11
Son protected
00:24:14
Nosotros hemos visto nada
00:24:15
Hemos visto public
00:24:17
Y hemos visto private
00:24:19
Este es otro
00:24:21
Modificador
00:24:23
Protected
00:24:26
Que sostancialmente me dice
00:24:27
Que estas cosas son visibles
00:24:28
O dentro de la clase
00:24:30
O dentro de
00:24:33
Clases que heredan
00:24:35
De esta clase
00:24:38
¿Vale?
00:24:38
Además que dentro del paquete
00:24:39
¿Vale? Entonces
00:24:41
Otras clases del paquete
00:24:42
Otra clase
00:24:44
Esta misma clase
00:24:45
Y
00:24:47
Clases que heredan de esta
00:24:47
Si yo heredo desde esta clase
00:24:50
Como si nombre fuera mío
00:24:52
Y lo puedo utilizar
00:24:53
¿Sí?
00:24:54
Esto no lo vimos antes
00:24:56
Porque cuando lo vimos os lo nombré
00:24:58
Pero os dije, claro, hasta que no sepamos
00:25:00
Que es la herencia, esto no tiene sentido
00:25:02
Ahora que empezamos a entender
00:25:04
Que puede ser la herencia
00:25:06
Pues entonces eso tiene sentido
00:25:08
Sabemos que hay clases que estenden estas
00:25:09
Y yo puedo decirle aquí un private
00:25:11
Entonces una clase que me estende
00:25:13
No tiene acceso a estas cosas
00:25:16
O protected
00:25:18
Entonces una clase que me estende
00:25:19
Si tiene acceso directo a estas cosas
00:25:21
Aquí tengo un public persona
00:25:22
Public persona con nada
00:25:26
¿Vale?
00:25:29
Si yo creo una persona sin darle ningún tipo de parámetros
00:25:29
Me crea una persona que no tiene edad
00:25:34
No tiene apellidos
00:25:37
Y de nombre se llama anónimo
00:25:38
Esto sobre escribe el constructor por defecto
00:25:39
Y luego tenemos un constructor un poquito más complejo
00:25:46
Que es persona con
00:25:50
Dame nombre, dame apellido y dame edad
00:25:53
Y yo crearé una persona
00:25:55
Que como nombre tengo el nombre que me has dado
00:25:58
Como apellido tiene el apellido que me has dado
00:26:00
Y como año de nacimiento
00:26:02
El año de nacimiento que me has dado
00:26:03
Con esto torbático y todo
00:26:05
¿Dudas?
00:26:06
Y una persona puede hacer esto
00:26:11
Imprimir, ¿vale?
00:26:13
Cuando una persona se imprime
00:26:15
Ves que no es estático
00:26:17
Este método, por lo tanto
00:26:20
Se llama sobre un objeto
00:26:21
Y lo que hará es inscribir todos los datos personales
00:26:22
De esta
00:26:25
De esta persona
00:26:26
Pillando los valores
00:26:28
De la persona propia, ¿vale?
00:26:30
Entonces dice, nombre personal
00:26:32
Datos personales, el nombre
00:26:34
Seguido del apellido
00:26:36
Seguido del año de nacimiento
00:26:38
Los datos de esta persona
00:26:40
¿Dudas?
00:26:42
Hasta aquí
00:26:46
Poco más, ¿vale?
00:26:47
Estaríamos en esta parte de aquí en un cierto sentido
00:26:49
¿Vale?
00:26:52
Hemos definido la parte persona
00:26:52
Hemos definido todo lo que llega aquí
00:26:55
Ahora vamos a extender esta clase en la clase alumno
00:26:57
Es aquí la parte nueva
00:27:01
Esta es la clase alumno
00:27:04
Fijaos que la clase alumno extende persona
00:27:17
Entonces, este alumno es una persona
00:27:21
Este alumno puede hacer todo lo que hace una persona
00:27:24
Y tiene todos los datos de una persona
00:27:27
¿Vale?
00:27:29
Pero además tiene
00:27:31
Grupo
00:27:33
Y tiene horario
00:27:34
¿Vale?
00:27:36
Cosas que uno se me...
00:27:38
Primera cosa nueva
00:27:39
¿Qué es esto?
00:27:43
Tengo un constructor
00:27:52
Public alumno
00:27:53
Sin datos
00:27:54
¿Vale?
00:27:56
Y de allí, súper
00:27:58
¿Qué hará este súper?
00:27:59
¿Qué hará el constructor?
00:28:07
¿Qué sentir?
00:28:08
Lo que está haciendo este súper es
00:28:12
Llama el constructor de mi superclase
00:28:13
Con los parámetros que te pasan
00:28:18
Entonces, este señor
00:28:21
Cuando crea un alumno sin darle nada
00:28:23
¿Qué alumno creeré?
00:28:26
El nombre anónimo sin nada
00:28:29
Nombre anónimo
00:28:34
Y todo el resto con datos por defecto
00:28:35
Pero la idea es que
00:28:37
Aquí por ningún lado dice que su nombre es anónimo
00:28:41
Pero como esto
00:28:44
Está tirando de esto
00:28:46
¿Vale?
00:28:48
Super sin parámetros sería este constructor
00:28:51
Este constructor
00:28:54
Lo que me define es que su nombre es anónimo
00:28:55
Por lo tanto
00:28:58
Este código de aquí
00:28:59
Llama el constructor
00:29:00
Más arriba
00:29:02
Sin parámetros está llamando ese constructor de ahí
00:29:04
El nombre será anónimo
00:29:07
Todo el resto se deja vacío
00:29:08
O con valor por defecto
00:29:11
Nul o cero
00:29:13
O falso o lo que sea
00:29:15
¿Se entiende?
00:29:17
Entonces, esto es como
00:29:19
Desde la clase hija
00:29:20
Desde la subclase
00:29:23
Llamo a constructores
00:29:24
De la clase madre
00:29:27
De la superclase
00:29:29
¿Vale? Utilizando super
00:29:30
Tened en cuenta, ahora tanto lo repitiré
00:29:32
Pero que este super, si lo uso
00:29:35
Tiene que ser el primer
00:29:37
Comando del constructor
00:29:39
La idea es que yo
00:29:42
Si quiero crear un alumno
00:29:44
Antes creo la persona
00:29:45
Usando un constructor de la persona
00:29:47
Y a partir de allí construyo todo lo que es un alumno
00:29:49
Pero en un cierto sentido
00:29:52
No puedo construir un alumno
00:29:54
Sin construir una persona
00:29:56
Porque un alumno es una persona
00:29:57
¿Cutas?
00:29:58
Veamos un ejemplo
00:30:05
Una pizca más complejo
00:30:06
Si yo hago un alumno al que le paso
00:30:07
Nombre, apellido y año de nacimiento
00:30:10
Estos son justo los datos
00:30:12
De
00:30:15
Una persona
00:30:16
¿No? Pero nada más
00:30:19
Que esto
00:30:20
Esto debería ser
00:30:21
El constructor
00:30:23
¿Vale?
00:30:28
Dis.nombre, igual a nombre
00:30:29
Dis.apellidos, apellidos
00:30:31
Dis.nacimiento, nacimiento
00:30:33
Pregunta, pero nombre, apellido, nacimiento
00:30:34
En alumno nos parece
00:30:37
¿Cómo puedo hacer dis?
00:30:38
Porque esto es extendiendo
00:30:41
¿Vale? Y como lo desestendo
00:30:42
Pues accedería
00:30:45
Oye, pregunta, ¿pero esto lo puedo hacer siempre?
00:30:46
¿Puedo hacer siempre dis.nombre desde alumno?
00:30:49
Si está protected y no private
00:30:51
Si está protected o public o lo que sea
00:30:53
Si está private, por ejemplo, allá
00:30:56
Pues no
00:30:59
Esto me daría un error
00:31:00
Me diría, no, no estás en la clase correcta
00:31:01
Pero en vez de estar a reescribir otra vez
00:31:04
Un código que ya está en persona
00:31:10
Y cuidado, el constructor normalmente
00:31:13
Para nosotros son constructores sencillos
00:31:14
Pero podría ser
00:31:17
Que yo tenga que hacer comprobaciones
00:31:19
Sobre estos datos que me han dado
00:31:22
A lo mejor no me están dando directamente el nombre
00:31:23
Me están dando un código
00:31:25
Que yo lo tengo que ir a buscar en una base de datos
00:31:27
Y en esta base de datos encontraré una ficha
00:31:29
Donde está su nombre, de ahí lo pillo
00:31:32
¿Vale?
00:31:34
Entonces este código de aquí podría no ser trivial
00:31:35
No ser fácil como el que hacemos nosotros
00:31:38
Podría ser mucho código
00:31:40
Y yo no lo quiero volver a reescribir aquí
00:31:41
El mismo código de una clase que heredo
00:31:44
Que ya tengo
00:31:46
Y entonces
00:31:47
Hago esto
00:31:49
Super
00:31:52
Llamo
00:31:53
Al constructor
00:31:56
De la clase superclase
00:31:58
Pasándole
00:32:00
Los parámetros
00:32:02
Lo que hará
00:32:04
Java, Java Tutor Machine
00:32:06
Es ir a mirar la clase superior
00:32:08
La clase padre
00:32:11
Mirar si hay un constructor
00:32:12
Que pilla justo estos tipos
00:32:15
De atributos, de parámetros
00:32:17
Y si lo hay
00:32:19
Que si lo hay, es el segundo constructor
00:32:20
Pues usa ese constructor
00:32:22
Hace todo lo que tiene que hacer
00:32:24
Vuelve aquí
00:32:26
Y como se ha acabado el constructor, se ha acabado
00:32:28
El concepto de
00:32:30
Ahorrar
00:32:37
Reutilizar código
00:32:39
¿Vale?
00:32:42
No lo estoy reescribiendo aquí
00:32:43
Y si mañana me doy cuenta que un error lo tengo
00:32:45
Tanto en persona como en alumno
00:32:47
Como en todas las clases de alumno
00:32:49
Utilizo super
00:32:50
Si lo arreglo en persona
00:32:52
Automáticamente todos los que heredan y usan super
00:32:54
Pueden solucionar
00:32:57
Otra pregunta
00:32:58
Hemos dicho que aquí
00:33:01
Si nombre es privado
00:33:04
No funcionaría
00:33:08
Si nombre es protected o public
00:33:10
O lo que sea
00:33:13
Pues entonces sí funcionaría
00:33:13
Pregunta para vosotros
00:33:15
Si nombre, apellido y anonimación son privados
00:33:17
¿Esto funciona?
00:33:20
Porque yo desde aquí no estoy tocando esos parámetros
00:33:24
Esos parámetros son propios de la superclase
00:33:34
Para tocarlos yo estoy llamando un constructor de la superclase
00:33:37
Y al llamar al constructor de la superclase
00:33:42
Él sí puede toquetear sus propios parámetros
00:33:45
Porque estamos dentro de esa superclase
00:33:48
Entonces
00:33:50
Un método, una forma de
00:33:52
Crear objetos de la superclase
00:33:55
Sin tener acceso a sus atributos
00:33:58
Es utilizar super
00:34:00
¿Tudas?
00:34:02
¿Preguntas?
00:34:06
¿Sigo?
00:34:08
Entonces, ahora vamos a ver
00:34:10
Otro, un tercero constructor de alumno
00:34:12
Que pilla todo
00:34:14
Nombra, apellido, año de nacimiento
00:34:16
También el grupo y el horario
00:34:18
Entonces, ¿qué hago?
00:34:19
Pues, lo que hago es
00:34:21
Pillar el
00:34:22
¿Cómo se llama esto?
00:34:25
El
00:34:27
Constructor de la clase superior
00:34:28
Para hacer la parte
00:34:31
Que es de persona
00:34:33
¿Vale? Lo mismo que he hecho ahora
00:34:35
Entonces, este se irá
00:34:37
Al otro constructor
00:34:39
De la clase persona
00:34:41
Hará todos los trabajos que son
00:34:42
Incluidos si tiene que hacer
00:34:45
en la base de datos, mandar un picture
00:34:47
hará todo lo que hace el otro
00:34:49
constructor, al haber hecho
00:34:51
eso, una vez que ha creado la persona
00:34:53
volverá aquí
00:34:55
y seguirá adelante, y por ejemplo
00:34:57
aquí, lo que hará es llamar
00:34:59
el método ponGrupo con
00:35:01
parámetros grupo y horario, y ahora
00:35:03
veremos que es, este es un método
00:35:05
de esta misma clase
00:35:07
entonces, la idea sería esa, yo lo que voy
00:35:08
a hacer es crear
00:35:11
una instancia, entre comillas
00:35:12
llamar al constructor de mi superclase, una vez que he creado la parte de superclase,
00:35:14
pues añado la parte mía. Os recuerdo que esto, que la llamada a un supermétodo, a
00:35:22
un superconstructor, pues es la primera llamada que se hace dentro de un constructor. La primera
00:35:29
cosa que hago es construyo mi superclase y cuando mi superclase está construida, pues
00:35:35
y luego los métodos propios de este mes de este de esta clase vale que es un grupo que lo que hace
00:35:40
es aceptar el grupo aceptar el horario justo lo que me faltaba para poner aquí por lo tanto lo
00:35:57
usa aquí vale y imprime grupo que me escribe una cosa así está claro que una persona no puede ni
00:36:03
utilizar este método ni utilizar este método entre un alumno puede utilizar
00:36:10
estos dos métodos acceder a grupo de horario y hacer todo lo que pueda hacer
00:36:14
un pecho
00:36:20
aquí estamos definiendo esta parte de abajo
00:36:24
no está parte esta sala no definida en el otro
00:36:28
y listo la persona se define la parte de arriba y en en este de aquí se define este
00:36:34
entonces aquí hemos utilizado súper que es acceder a constructores o métodos de aspectos dudas
00:36:43
como pruebo esta cosa pues por ejemplo un mail creó una persona vale que la vecina que en un
00:36:51
persona luisa bla bla bla de 1978 y luego un alumno que es ahora puedo llamar por ejemplo
00:37:05
un alumno punto con grupo modificaría fijaos que aquí estoy utilizando el mismo constructor
00:37:16
que el constructor de persona vale no le estoy poniendo aquí el grupo el horario por lo tanto
00:37:23
Esto estaría utilizando
00:37:28
Este
00:37:30
¿Dónde está? Este de aquí
00:37:31
¿Vale? Que llama el constructor de persona
00:37:34
Pero en un cierto sentido
00:37:36
En estas dos llamadas
00:37:38
Estoy utilizando el mismo
00:37:40
Constructor
00:37:42
No es verdad, pero
00:37:43
Porque esto usa directamente el constructor de persona
00:37:45
Y esto usa el constructor de alumno
00:37:48
Que llama al constructor de persona
00:37:50
¿Vale?
00:37:52
Sin embargo, luego a un alumno
00:37:54
Puedo llamar las cosas de un alumno
00:37:56
Si hiciera vecina.pongrupo
00:37:58
Me daría un error
00:38:00
Me decía en la clase
00:38:01
Vecina es una
00:38:03
Instancia de la clase persona
00:38:05
La clase persona no está declarado
00:38:06
El método pongrupo
00:38:09
Si yo llamo vecina imprime
00:38:11
Y un alumno imprime me funciona
00:38:13
Y fijaos que imprime
00:38:15
Es un método definido donde
00:38:18
En persona
00:38:19
Pero
00:38:21
Vecina es persona y me vale
00:38:23
Un alumno es alumno, pero alumno es persona
00:38:25
Y por lo tanto me vale también
00:38:29
Además, alumno, un alumno puede llamar también en primer grupo
00:38:31
Lo que me saldría es algo así
00:38:35
La persona escribiría esta cosa aquí
00:38:38
El alumno escribiría lo mismo
00:38:42
¿Vale?
00:38:45
Porque sostancialmente aquí estaría tratando el alumno
00:38:46
Como si fuera una persona
00:38:49
Y luego después, un alumno punto en primer grupo
00:38:51
Me escribiría esta parte aquí final
00:38:55
¿Dudas?
00:38:57
Esto ya lo hemos hecho
00:39:07
¿Qué pasaría si el alumno
00:39:08
El atributo nombre fuera declarado private?
00:39:10
Ya lo hemos hablado
00:39:14
Y discutido entre nosotros
00:39:15
Que si yo intento hacer esto
00:39:16
Dentro de alumno
00:39:18
¿Vale?
00:39:20
Explotaría, porque me diría
00:39:22
No puedes acceder a él porque es privado
00:39:24
Sin embargo
00:39:27
Si llamo el super constructor
00:39:28
Pues entonces me funciona
00:39:31
Porque no lo estoy gestionando yo
00:39:33
Está gestionando él
00:39:35
Y os recuerdo que el constructor es public
00:39:36
Es un poco
00:39:38
Como cuando nosotros hacíamos
00:39:40
Un elemento, un atributo private
00:39:43
Y decíamos
00:39:45
No puede acceder al atributo
00:39:46
Pero si creo un método público
00:39:48
Get es atributo
00:39:50
O set es atributo
00:39:52
Si que puedo manejarlo
00:39:53
Pero la ventaja es que no lo manejo yo directamente
00:39:55
Y voy allí y lo cambio a lo que me da la gana
00:39:58
Sino que paso por un método
00:40:00
Proporcionado por la misma clase
00:40:02
Que me puede hacer los controles necesarios
00:40:04
Para que el valor que tú me has dado
00:40:07
Sea un valor correcto
00:40:09
Si alguien me intenta poner como edad
00:40:10
Menos 7
00:40:12
A lo mejor dentro del método
00:40:13
De creación me dice
00:40:17
Si edad es negativo
00:40:18
Pues ponle que no puede ser
00:40:20
O explota o manda un error
00:40:22
O ponle 0 por defecto
00:40:24
O lo que sea
00:40:26
Constructores private
00:40:27
Ah si existen constructores private
00:40:35
en un futuro
00:40:37
un método private está pensado
00:40:38
para que yo lo use solo dentro de esa clase
00:40:44
entonces a otras clases
00:40:46
incluidas las heredadas no lo pueden llamar directamente
00:40:48
pero imagínate que yo
00:40:51
llamo un método público y dentro
00:40:52
de este método público
00:40:54
usa este método privado
00:40:55
pues como yo desde fuera estoy llamando el método público
00:40:57
me funcionaría, solo que luego
00:41:00
hace cosas dentro
00:41:01
un método sería
00:41:03
privado cuando tú quieres
00:41:06
estar seguro al 100%
00:41:08
que se ejecute ese método
00:41:10
cuando alguien te llama, ¿vale?
00:41:12
Entonces dices, cuando tú
00:41:14
los dejas públicos, uno desde fuera
00:41:16
podría utilizarlo o no. Si tú
00:41:18
dices, cuando a mí me llaman, siempre
00:41:20
llama a este método aquí que es privado interno
00:41:22
aquí, pues ya no das
00:41:24
opciones.
00:41:26
Entonces esto
00:41:31
esto es el error que os daría, ¿vale?
00:41:32
Si fuera
00:41:38
si desde alumno
00:41:38
llamáis nombre
00:41:40
y le decís que es
00:41:42
que es private
00:41:44
pues os diría, oye mira
00:41:46
este atributo
00:41:48
no es visible
00:41:51
fijaos que dice de persona
00:41:52
porque estamos hablando
00:41:54
de persona
00:41:56
hacemos un ejercicito
00:41:57
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 6
- Fecha:
- 24 de enero de 2023 - 14:09
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 42′ 07″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 352.32 MBytes