2024-12-09-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 4 - Conceptos generales POO
vale ya estamos en marcha pues nada comentarme si tenéis alguna cosita como siempre antes de
00:00:00
arrancar alguna duda que tengáis que queréis aclarar a ver si podemos resolverla entre todos
00:00:07
nada en principio vale mañana empezamos un nuevo tema el tema 5 todavía todavía son conceptos bueno
00:00:11
no sé si se va haciendo duro por lo menos a los que estáis empezando a programar este año algunos
00:00:28
Ya os conozco del año pasado, entonces estos primeros temas supongo que los llevaréis razonablemente bien.
00:00:33
Los que estáis probando de nuevas, pues no sé si os estará costando más o menos.
00:00:39
El tema 5 todavía no introduce cosas muy nuevas.
00:00:43
Todavía estamos aterrizando en los conceptos de programación orientado a objetos y aplicados al lenguaje de programación Java.
00:00:48
Y como desde el día 1 ya estábamos utilizando las clases y los objetos,
00:00:56
entonces ahora estamos durante todos estos temas formalmente asentando esos conocimientos
00:01:02
entonces ya os digo que todavía el tema 5 pues seguimos un poco hablando de cosas con las que
00:01:08
venimos trabajando desde el día 1 bueno pues no vendrán seguramente para nada mal el repaso de
00:01:14
ello pero pero no tiene cosas nuevas no ya no sé si es el tema 6 o a partir del tema 7 ya dejamos
00:01:20
de trabajar sobre las cosas que todo programa Java
00:01:27
tiene, pues todos tienen clases, en todas hay estructuras de control
00:01:30
de bucle o de condición o de selección
00:01:33
y ya pues bueno, pues hablaremos de ficheros
00:01:36
pues unos programas tendrán ficheros y otros no
00:01:40
es una herramienta muy utilizada, siempre en todos los lenguajes de programación
00:01:42
leer y escribir en ficheros, pero no necesariamente
00:01:45
de hecho hemos hecho hasta ahora programas en los que no hemos escrito
00:01:48
en ninguno fichero, ni hemos leído de ficheros
00:01:51
bueno, pues conoceremos esa herramienta y aquello sí que será
00:01:53
digamos una cosa adicional nueva que veremos en ese tema
00:01:57
y no habremos hablado con anterioridad de ello
00:02:00
pero ya os digo, el tema que viene todavía
00:02:02
seguiremos profundizando en cosas de clases, programación orientada a objetos
00:02:04
conceptos, bueno, pues igual algunas cosas las repetiremos
00:02:08
de otras tutorías, pero bueno, no viene mal yo creo
00:02:11
mañana cerramos la
00:02:14
tarea del tema 4, la semana que viene
00:02:16
que ya es la última que tenemos antes de navidades
00:02:20
si no tenéis nada pendiente, bueno, pues podemos
00:02:23
dedicar para dejar totalmente cerrado este tema que tenemos ahora mismo abierto
00:02:26
hacer la tarea y alguna otra cosita
00:02:30
que nos surja y ya bueno, pues ya a partir de la semana
00:02:33
que viene ya os digo, ya luego tendremos un par de semanas en las cuales podréis descansar
00:02:38
un poco, por lo menos de mis charlas aquí en las tutorías
00:02:42
otra cosa es que si tenéis algún ratillo lo dedicáis a hacer algún programilla
00:02:45
bueno, dicho esto, en el guión que tengo yo aquí
00:02:49
que no sigue fielmente
00:02:54
justo los contenidos del tema, aunque más o menos
00:02:56
pues vamos hablando de lo mismo
00:02:58
para hablaros durante el tema 4
00:02:59
pues estuve contando unas cuantas
00:03:02
cosas la semana pasada
00:03:04
y bueno, mi intención es seguir contándoos
00:03:05
otras poquitas durante el día de hoy
00:03:08
así que vamos a ponernos manos a la obra
00:03:10
a ver, teníamos aquí un
00:03:12
proyecto que era tema 4, podemos
00:03:15
reutilizarlo para seguir trabajando con él
00:03:17
con dos clases
00:03:19
bueno, habíamos definido por aquí una clase persona
00:03:22
que tiene por ahí varias cosillas
00:03:34
Estuvimos hablando el otro día de la sobrecarga de métodos, si os acordáis, que era dar el mismo nombre a un método y podíamos diferenciarlos en función del número de parámetros que recibía.
00:03:35
Y de esta forma, cuando utilizábamos un método saludar u otro, el programa era capaz de entender si queríamos que ejecutara este código o este otro en función del número de parámetros y del tipo de los parámetros que recibía durante la llamada.
00:03:48
Supongo que por aquí tendremos llamadas, diferentes llamadas a saludar. Bueno, pues ya sé que se quedó eso ya perdido. Igual hoy volvemos a hablar otro ratito de todo eso.
00:04:05
Otra cosa de la que estuvimos hablando el otro día era, habíamos empezado a hablar de diferentes etiquetas que podemos poner a los métodos o a los parámetros. Y aquí tenemos tres de ellas. Creo que habíamos arrancado hablando de las etiquetas que tiene, por ejemplo, el método main, que también son válidas para otras.
00:04:17
Vamos a repasarlas. De esta, por lo menos, seguro que no habíamos hablado.
00:04:33
La etiqueta public tiene varias alternativas, que son excluyentes.
00:04:39
Podemos utilizar la etiqueta bien public, bien protective, bien privada, private, o no poner nada.
00:04:46
Es decir, sería el valor por defecto.
00:05:01
sería, bueno, justo en el método main no me lo permite, o sí, incluso si me compila el método main si no lo pongo, aunque el método main siempre suele ir con justo estas etiquetas, la de public, si no ponemos nada es equivalente a el tipo de etiqueta package, de paquete, mira cuando organizamos el código de un programa, os he enseñado en varias ocasiones como se guarda aquí en el sistema de archivos,
00:05:03
Eclipse en particular tiene una zona de trabajo
00:05:32
y a partir de esta zona de trabajo crea un directorio
00:05:39
para cada uno de los proyectos que estamos construyendo
00:05:42
si os fijáis estos proyectos, no sé si habremos borrado alguno
00:05:45
coinciden con los que tenemos aquí activos en Eclipse
00:05:48
cada vez que creamos un nuevo proyecto
00:05:51
construye un nuevo directorio
00:05:53
justo colgando el Workspace
00:05:57
justo en particular estamos trabajando sobre el proyecto
00:05:59
¿he dado a grabar?
00:06:03
Sí, está grabando. Justo ahora mismo estamos trabajando sobre el proyecto del tema 4 y os decía que tenemos la información distribuida del proyecto en dos carpetas.
00:06:05
la carpeta bin, que es donde están los puntos class con el base code compilado
00:06:19
de nuestras clases, este proyecto está compuesto de dos clases
00:06:23
la clase inicio java y personaje.java
00:06:26
con lo cual tenemos aquí dos ficheritos con código compilado
00:06:30
el base code de esas dos clases, y luego
00:06:34
el código source, por aquí, que estos ficheritos
00:06:38
son justo los que tenemos abiertos ahora mismo aquí en Eclipse, que si vamos de uno a otro
00:06:43
lo podemos ir viendo, pues justo está abriendo los ficheros que están colgando en la carpeta source.
00:06:47
Fijaros como aquí hemos dicho que este código se meta en un paquete que es el paquete de por defecto.
00:06:52
Resulta que es posible organizar, bueno, estos programitas que estamos haciendo son muy sencillos,
00:07:01
los metemos todos juntitos, digamos, en un mismo cajón, en un mismo paquete y ya está,
00:07:07
y tiramos para lo que estamos haciendo hasta ahora.
00:07:12
Pero suponed que estamos haciendo un proyecto grande,
00:07:15
imaginaos que es el proyecto de un banco,
00:07:17
y, bueno, pues a lo mejor el conjunto de ese proyecto
00:07:20
ya implica tener, yo qué sé qué decir,
00:07:24
por poner un número vamos a decir 80 ficheros.java.
00:07:26
Entonces, si del tirón ponemos los 80 ficheros.java
00:07:30
en un único directorio, a lo mejor es un poco caótico.
00:07:34
Entonces, ¿qué podemos hacer?
00:07:37
Pues mira, vamos a hacer una organización del código
00:07:38
y de los ficheros .java que soportan cada una de las funcionalidades,
00:07:41
vamos a identificar las funcionalidades.
00:07:46
Entonces podemos decir, pues el banco tiene una línea de trabajo,
00:07:49
una funcionalidad que tiene que ver con préstamos
00:07:53
y otra que tiene que ver con cuentas de ahorro
00:07:55
y otra que tiene que ver con lo que sea,
00:07:58
diferentes funciones que tenga la banca.
00:08:00
Si para con una de estas funciones necesitamos cinco .java,
00:08:04
cinco ficheros .java para poner todo su código,
00:08:07
estando todos juntos pues sería un poco un poco desorganizado digamos el intentar identificar en
00:08:09
qué ficheros tenemos código relativo a cada una de las funcionalidades entonces qué podemos hacer
00:08:15
pues podemos organizar en paquetes en bloques los ficheros punto java que dan cada una de esas
00:08:20
funciones es decir si decimos mira la parte de préstamos pues estos cinco ficheros vamos a
00:08:26
crear un paquete vamos a suponer que dentro un armario hacemos un cajoncito un apartado para
00:08:33
los préstamos y en ese paquete de préstamos
00:08:39
metemos los cinco ficheritos que tienen que ver
00:08:42
con préstamos. Entonces si cuando
00:08:45
tengamos que trabajar para hacer un mantenimiento
00:08:48
o meterle más funcionalidad a la parte
00:08:50
de préstamos, si lo tenemos todo así bien organizadito
00:08:54
cuando vayamos a trabajar sobre esto
00:08:57
nos iremos directamente a esos ficheros.java que están muy bien
00:08:59
organizados en esa sección de préstamos, en ese paquete
00:09:03
y de la misma forma podemos hacer con las cuentas
00:09:05
de ahorro y bueno, pues con otros servicios que pueda tener el banco
00:09:08
lo organizamos en paquetes. Y en cada uno de ellos metemos
00:09:12
los ficheros .java que tienen que ver con esa funcionalidad. ¿Cómo se organizaría
00:09:16
eso dentro del proyecto? Pues todo colgaría del
00:09:20
SRC y en el SRC, en Eclipse, tendríamos
00:09:24
un directorio por cada uno de los paquetes.
00:09:28
Entonces imaginaos que tuviéramos en Mecadir aquí, creamos un directorio
00:09:33
finanzas aquí tendríamos los ficheros punto java que están en el paquete por defecto que es el que
00:09:36
venimos utilizando en los ejemplos hasta ahora y todo lo que tuviera que ver con finanzas lo
00:09:45
meteríamos dentro de este directorio de finanzas podríamos tener otros directorios más y aquí
00:09:50
colgando también del src pues podríamos tener otro que fuera un directorio de cuentas corrientes
00:09:56
voy a borrar este finanzas aquí, ahí está borrado, entonces eso se organizaría aquí en el sistema de archivos
00:10:01
con esa estructura de carpetas y aquí pues también veríamos esa estructura de carpetas de la misma forma
00:10:17
y los ficheros .java los iríamos colocando en cada uno de esos paquetes
00:10:22
¿Cómo podemos hacer para que un código esté en un determinado paquete?
00:10:25
pues aquí en la cabecera podemos poner la etiqueta
00:10:34
package, vamos a hacerlo aquí para el inicio que es el que tiene el .me
00:10:38
vamos a hacerlo por ejemplo aquí para el de personas, no sé si me va a
00:10:44
crear Eclipse directamente el paquete, tenemos la posibilidad de crear
00:10:53
a ver, vamos a ver si lo creamos, vamos a crear
00:11:02
el paquete, un nuevo paquete aquí en el proyecto
00:11:07
new, fijaros aquí me da la opción de crear un nuevo paquete
00:11:10
veis, me ha creado aquí esta estructura, fijaros, colgando de source
00:11:14
aparte de estos dos, si nos vamos aquí, ponemos ls
00:11:24
y tenemos el directorio finanzas que me acaba de crear ahora
00:11:27
y si yo ahora cojo y creo aquí una nueva clase
00:11:31
vamos a llamarla clase finanzas
00:11:34
bueno, pues la he metido ahí y fijaros como lo que estaba yo intentando escribir
00:11:39
pero como no estaba en el paquete de finanzas, no me lo ponía
00:11:46
en la cabecera del fichero para identificar que se encuentra
00:11:49
en el paquete de finanzas, pues le ponemos aquí la etiqueta
00:11:52
esta package finanzas. Todo lo que tenga que ver
00:11:55
con código relacionado en Java con las finanzas
00:11:59
pues lo podemos poner en esta carpeta.
00:12:02
Esto las ventajas que tiene, ya os digo
00:12:05
si tenemos
00:12:07
muchos ficheros .java
00:12:10
de diferentes funcionalidades todos metidos aquí, igual nos resulta
00:12:13
más complicado localizar una actualización que tuviera
00:12:16
que ver con la funcionalidad de finanzas. Pero
00:12:20
si abrimos el proyecto, en un proyecto que sea muy grande, con
00:12:23
muchos paquetes y muchos ficheros, y sabemos que
00:12:25
tenemos que corregir una cosa relacionada con finanzas, pues convenirnos
00:12:28
a este paquete, si lo hemos estructurado todo bien,
00:12:31
en las dos o tres ficheros .java será donde tengamos
00:12:35
que tocar y no en otras zonas.
00:12:37
Otra de las ventajas que tiene esto, es que imaginaros que estamos
00:12:40
haciendo el organizar los proyectos por paquetes
00:12:43
Imaginaos que estamos haciendo un proyecto para un banco en particular, me da igual, el Santander digamos, y tiene todo su código aquí que da servicio a ese proyecto y de repente otro banco resulta que le interesa que le hagamos también un desarrollo.
00:12:46
no quiere el desarrollo completo de este primer banco pero sí que el paquete de finanzas le parece
00:13:06
que es muy interesante pues podemos coger todo el paquete de finanzas que lo tenemos muy bien
00:13:11
organizadito y metido aquí importar este paquete en el nuevo proyecto con lo cual toda esta parte
00:13:15
de código lo tenemos ya desarrollada y en principio incluso probada. Aquí tenemos la clase
00:13:22
finanzas que podemos poner, vamos a poner aquí un método public, public void, finanzas, public void, saluda, finanzas, vamos a poner, si este no es println, método simplemente que saque por pantalla algo, entonces si nos venimos aquí al inicio, fijaros el inicio está en el paquete por defecto, no está directamente metido en ningún directorio,
00:13:30
Si nosotros queremos construir aquí un objeto de la clase finanzas, ponemos finanzas, fin, igual a new, finanzas, el constructor, como os comentaba el otro día.
00:14:21
Y esto no me compila, esto de finanzas no entiendo, no sé yo lo que es.
00:14:38
Entonces, ¿qué tenemos que hacer? En cambio, si yo pongo aquí persona miper igual a new persona,
00:14:43
este persona no se me queja y se me compila.
00:14:55
¿Qué sucede? Que persona está en el mismo paquete que inicio, pero finanzas está en un paquete diferente que inicio.
00:14:58
¿Qué está intentando desde la clase inicio en el método main? ¿Dónde está intentando localizar el paquete, es decir, la clase finanzas para construir un objeto que se llame fin?
00:15:04
Pues lo está intentando localizar donde él se encuentra y como donde él se encuentra, que es en el paquete por defecto, no existe el fichero finanzas java, que es el que tiene el código de la clase finanzas, pues no me compila.
00:15:19
En cambio, persona, como si se encuentra en su mismo paquete, pues lo ha localizado y directamente me lo permite.
00:15:32
¿Qué tenemos que hacer si dentro de la estructura que hemos organizado por paquetes en mi programa
00:15:39
quiero tener acceso, en este caso, desde inicio que está en el paquete default a una clase que está en el paquete finanzas?
00:15:44
Pues necesito importarlo.
00:15:52
Entonces yo cojo y digo import finanzas aquí.
00:15:53
Vamos a decirle que nos ayude aquí para ponerlo.
00:16:07
aquí lo que me dice es, importa
00:16:09
del paquete
00:16:16
finanzas, la clase finanzas
00:16:18
es decir, desde la ruta
00:16:20
donde yo me encuentro
00:16:22
paquete finanzas, aquí lo tenéis
00:16:23
el paquete finanzas y dentro de ese paquete
00:16:28
metido en la clase
00:16:30
finanzas tenemos
00:16:36
metido en el
00:16:37
fichero finanzas.java tenemos la clase finanzas
00:16:40
entonces en el momento que ya se lo
00:16:42
identificamos aquí, decimos importa al proyecto
00:16:43
la clase finanzas que se encuentra
00:16:45
en el paquete finanzas pues ya coge y me funciona esto en realidad no es nada nuevo lo único que
00:16:47
estamos utilizando una clase de un paquete que hemos construido a nosotros pero ya en su caso
00:16:54
habíamos hecho escáner mi scan verdad en algunos ejercicios igual año escáner si está en punto in
00:17:00
y esto no me compila va porque no me compila va a escáner bueno pues porque no se encuentra
00:17:09
cargado dentro de mi proyecto. Entonces, ¿qué hacíamos aquí?
00:17:14
Le poníamos tal que aquí, decíamos import y fijaros
00:17:17
lo que me hace aquí. Impórtame del paquete
00:17:20
Java útil la clase
00:17:23
Scanner, que viene a ser el equivalente de importame
00:17:26
en nuestra clase, importame de finanzas
00:17:29
la clase finanzas. Un poquito lo mismo.
00:17:32
Es decir, ya lo estábamos haciendo en realidad, pero desde paquetes
00:17:35
que tenemos en las librerías de Java.
00:17:38
y luego es verdad que también se comentaba en algún momento que teníamos por ejemplo el método
00:17:40
system.out.println utilizamos este y decíamos oye este método no hemos importado nada y estamos
00:17:46
utilizando un método de algo bueno pues que está en el paquete system.out este paquete system.out
00:17:57
el método println donde está pues lo que sucede es que este este paquete está dentro de la librería
00:18:04
java lang y la librería java lang tiene funciones tan comunes en el uso de todos los programas de
00:18:12
java que para ahorrar ya que se entiende que son de uso muy común para estar ahorrando importarlas
00:18:19
automáticamente se importan en todos los proyectos entonces que tenemos que importar aquello que no
00:18:25
está en java lang y lo que no está en java lang pueden ser clases de paquetes no es propios o
00:18:31
clases de paquetes que se encuentran en la librería de java pero no en java lang en este
00:18:36
caso es java útil para escáner vale pues bueno contado esto de cómo podemos organizar nuestro
00:18:41
código en paquetes y un poco para qué nos puede servir tener estos paquetes nos facilita el
00:18:50
mantenimiento ya que tenemos más ubicado el código relacionado con ciertas funcionalidades y luego
00:18:57
hace que nuestro programa sea más portable si sólo queremos el paquete finanzas en un segundo
00:19:02
proyecto cogemos este directorio y sabemos que va auto contenido hay toda la información que
00:19:06
necesitamos para ese desarrollo pues regresamos un poco a esto que estábamos hablando del public
00:19:11
cuando nosotros estamos definiendo algo como public lo que estamos haciendo es que este
00:19:17
método al que está haciendo referencia este public pueda ser ejecutado desde cualquier sitio de todo
00:19:26
mi proyecto vamos a definir aquí un método mirad aquí public public saludar este método public
00:19:35
saludar puede ser ejecutado desde, vamos a ver, finanzas, mejor. Mirad, este public saludar finanzas puede ejecutarse
00:19:41
desde cualquier sitio en todo mi proyecto. Si yo, de hecho, yo me vengo aquí, ahora que tenemos un objeto de la clase
00:19:50
finanzas y digo fin objeto de la clase punto y llamo al método saludar si ejecuto me lo ejecuto
00:20:00
correctamente si yo esta etiqueta que tengo que definida como public la defino como private
00:20:14
lo que sucede es que estoy diciendo que este método solamente sea ejecutable desde otros
00:20:21
métodos de mi clase si yo tengo mirad como esto me deja
00:20:30
veis como ha dejado de compilar aquí porque por qué
00:20:35
la clase inicio lógicamente no es la clase finanzas el hecho de haber
00:20:40
definido este método como private es el ámbito de ejecución de este método es mi
00:20:44
clase con lo cual solamente podría llamar a saludar finanzas desde
00:20:50
cualquier otro sitio de mi propia clase y así yo comento aquí esto para que me
00:20:55
compile el proyecto y creo aquí otro método fijaros public
00:21:01
llamar saludar y aquí lo que hago es llamar este método digo que no devuelva
00:21:09
nada public voy llamar saludar fijaros como aquí a pesar de ser privado ya sí
00:21:26
que me compila me compila perfectamente porque porque la llamada la estoy
00:21:31
haciendo desde un método que pertenece a la clase de finanzas el hecho de que
00:21:34
este método sea privado, nos permite que llamadas desde su método sí le valgan, pero llamadas desde su clase sí me valgan, pero desde otras clases no.
00:21:38
Aquí si pongo fin, punto. Observad como ahora ya aquí al poner fin, punto, como ese método ya es privado, el id, si intento buscar saludar, ya no me lo ofrece.
00:21:50
¿Por qué? Porque es privado. Realmente desde este ámbito no está disponible el método saludar. El que sí que está disponible será el método llamar saludar. ¿Por qué? Porque el método llamar saludar, fijaros, lo he definido como público.
00:22:04
Entonces, si ahora llamo a llamar saludar, llamar saludar, sí que lo llama, ¿veis? Y llamar saludar está llamando a saludar finanzas, con lo cual el resultado es que me lo muestra por aquí por pantalla.
00:22:22
Podríamos pensar, ¿qué utilidad tiene el definir algo aquí privado?
00:22:37
Mirad, un ejemplo clásico que yo creo que es bastante ilustrativo.
00:22:43
Imaginaos que, vamos a la clase persona, tenemos aquí una edad, ¿verdad?
00:22:48
En principio se supone que es la edad que va a tener una persona.
00:23:01
Esta edad está definida como pública.
00:23:04
El concepto de público y privado para parámetros y para métodos es igual, es decir, el hecho de que este método, esta variable sea pública quiere decir que está accesible desde cualquier parte de todo el proyecto por ser pública.
00:23:12
Fijaros como aquí podemos poner persona miper igual a new persona, creo un objeto de la clase persona y pongo miper punto y edad y le digo que tenga 10 años.
00:23:25
se ha podido acceder a la edad de una persona esta edad justo aquí en persona está definida
00:23:42
como pública como podéis ver entonces está disponible en cualquier parte de todo el
00:23:50
proyecto desde cualquier paquete de todo el proyecto desde cualquier clase en todo el
00:23:55
proyecto si yo esta clase la defino como private privada esta clase no este parámetro este atributo
00:23:59
fijaros como ahora me deja de compilar porque me deja de compilar pues la misma jugada que hemos
00:24:07
tenido antes con saludar finanzas como ahora es privado el ámbito en el cual podemos modificar
00:24:12
la edad es única y exclusivamente desde la propia clase por ser privada antes que era pública
00:24:18
podríamos desde cualquier sitio que podemos decir y que utilidad tiene el hecho de que sea privado
00:24:24
pues mira una primera situación que podemos plantearnos es que imaginaos que esto es un
00:24:31
proyecto gigantesco y trabajan 60 personas y a ti te dan la responsabilidad de desarrollar
00:24:37
la clase persona entonces tú coges haces todo tu gesto a tu gestión de la clase persona y si
00:24:44
tú dejas y a lo mejor tu requisito es que las personas pueden tener una entre una edad entre
00:24:50
entre cero los recién nacidos hasta bueno por la persona más longeva vamos a poner que somos
00:24:57
generosos si llegamos hasta 150 años, ¿no?
00:25:04
Pero, oye, te dicen, mira, es impensable pensar que una persona
00:25:07
va a llegar a 300 años, es que eso no va a pasar, ¿no?
00:25:10
Entonces, no quiero que la edad pueda tener un valor mayor de 150 años.
00:25:13
Tú eres el responsable de la clase persona y casi estás un poco
00:25:22
comprometiéndote a que esta variable de edad nunca sea menor de cero,
00:25:25
porque no consideramos que sean personas pendientes de nacer
00:25:30
ni personas que tengan más de esta edad.
00:25:34
Si tú coges y lo dejas esto como público,
00:25:38
resulta que alguien ajeno a ti,
00:25:41
es decir, quien está desarrollando la clase inicio,
00:25:44
puede coger y decirte que una persona tiene 300 años
00:25:48
y durante la ejecución de tu programa
00:25:51
la edad de una persona resulta que está siendo 300.
00:25:52
Y eso, según los requisitos que te habían dicho a ti,
00:25:56
no era válido.
00:25:59
Entonces, ¿qué podemos hacer?
00:26:00
Pues podemos coger y decir, mira, yo voy a poner la edad aquí, privada, private, y así tengo el, ya que yo soy el que programo la clase persona, nadie más va a tocar este código, desde aquí nadie me va a poner una edad de 300 años, ¿por qué? Porque no se lo voy a permitir.
00:26:01
En cambio, como sí que necesito que desde diferentes partes del código se puedan ir asignando edades a personas, estamos dando de alta aquí personas y queremos asignar edades, pero queremos que estén controlados en ese rango de edad.
00:26:19
Entonces lo que puedo hacer es crear aquí un método que sea público, es decir, que tenga acceso desde todo el proyecto. Vamos a poner aquí asignar edad. Ahora después hablamos de estos métodos de asignar.
00:26:33
Vamos a decir, el otro día hablábamos que los métodos pueden recibir cierta información a través de parámetros, vamos a decir aquí que se reciba una edad int y e, vamos a llamarlo, esta variable va a ser una variable local al método asignar edad y se aplicará en el momento en el que hagamos una llamada a ese método.
00:26:50
Entonces tendremos la posibilidad aquí de coger y decir mi per, objeto de la clase persona, punto, aquí tengo accesible los métodos y los parámetros, quiero utilizar el método asignar edad y digo por ejemplo que quiero asignar la edad de 30 años.
00:27:25
¿Qué decíamos el otro día que sucede aquí? Voy a ponerme a ejecutar asignar edad, en particular de esta persona, pasándole como valor 30, con lo cual cuando vengo aquí a hacer la ejecución, en esta variable se carga la información que le estoy pasando en la llamada, con lo cual esta variable arrancará la ejecución del método asignar edad con el valor 30.
00:27:44
Y esta variable es una variable local al ámbito del método, con lo cual es local aquí a la apertura y cierre de llaves.
00:28:07
Justo el hecho de que todo acceso que vaya a hacer esta variable voy a obligar al resto del programa que lo haga a través de asignar edad, es lo que me va a permitir bloquear estos valores.
00:28:18
Entonces yo puedo coger y decir aquí, if, sí, y e, es decir, la edad que estás intentando asignar, que se lo has pasado aquí como parámetro, es menor que 0, aquí podría decir que y e sea igual a 0, con lo cual, si alguien aquí me está intentando cargar como edad una cosa que no tenía permitido en los requisitos de mi desarrollo de la clase persona, menos 30 años, resulta que esto se cargará, este menos 30 se cargará.
00:28:30
en y está allí al ser menor que cero lo estoy aplicando el valor cero
00:29:04
también puede decir el cif sí
00:29:10
y es mayor que 150 pues tampoco tampoco me gusta entonces que podría hacer pues podría
00:29:13
acoger y decir y es igual a 150 estoy bloqueando los valores y si no es ni esto ni es menor que
00:29:22
cero ni es mayor que 150 resultará que estará dentro del margen que me gusta con lo cual no
00:29:30
sobre escribo la variable y con ningún valor y aquí puedo coger y poner y edad igual allí de
00:29:35
esta forma he conseguido mediante el método público que está accesible desde cualquier
00:29:45
parte del programa proteger mi variable y edad para que el rango esté cubierto con
00:29:49
las posibilidades que me marcaba a mí el enunciado otra posibilidad habría sido imaginaos que ya
00:29:57
dependerá de en el enunciado en los requisitos que tengamos para el proyecto las condiciones
00:30:10
que tengamos a lo mejor podríamos poner mira vamos para mantener esto lo que vamos a hacer
00:30:17
base no va a ser bloquear el valor de la edad sino que si la edad no me gusta porque no es
00:30:21
un valor válido le devuelvo un mira la edad no ha sido asignada entonces fijaros podríamos decir
00:30:28
poner aquí un boolean por ejemplo es decir en lugar de no devolver nada también lo hablábamos
00:30:37
el otro día en la tutoría que mi método devuelva un boolean en el momento que tengo aquí un boolean
00:30:46
me obliga a poner un retorno por eso no me compila ya en el momento que ponga aquí que devuelve una
00:30:51
variable de cualquier tipo. Entonces aquí lo que podríamos decir es poner boolean b asignada,
00:30:56
suponer que la edad se asigna correctamente, inicializamos la variable asignada a que se
00:31:05
asigna de forma correcta y luego decir aquí y si la edad es menor que 0 o podemos poner y e es mayor
00:31:11
que 150 en cualquiera de los dos casos podríamos hacer que la edad no sea asignada es decir no
00:31:21
falsa la edad no se asigna y si resulta que ha sido correcta en ese caso podemos poner aquí
00:31:29
que sí que asigne la edad y luego hacer aquí un retorno así nada fijaros a todos los efectos aquí
00:31:37
lo que estamos haciendo es que solamente le estamos actualizando la edad en el caso de
00:31:53
que esté dentro del rango que me gusta si no está dentro del rango que me gusta no estoy modificando
00:31:57
la variable edad pero para que desde donde se llama tengan una idea de si se ha asignado la
00:32:03
edad que estaban proponiendo no bueno pues hemos añadido que el método sea capaz de volver una
00:32:09
información de tipo boolean que puede ser verdadera o falsa como he inicializado aquí a true si no
00:32:15
entro por aquí en el momento que lleguemos aquí esto se mantiene con la inicialización con lo
00:32:21
cual su valor será true y si resulta que el rango en la edad que intentaba aplicar no estaba dentro
00:32:27
del rango estaré modificando esta variable a falsa con lo cual el return de volver a falsa y esto que
00:32:32
devolvemos donde de dónde podemos sacar provecho aquí en la llamada y podemos poner asignar dos
00:32:40
y aquí podemos poner una edad que puede estar dentro del rango o fuera de él vamos a poner
00:32:51
en mil años no está dentro del rango y aquí podríamos justo en la zona donde estamos llamando
00:32:58
a ese método que es en la clase inicio en el método main podríamos definir una variable b
00:33:04
result que tenga el resultado esta variable b result se va a cargar con lo que devuelva este
00:33:13
método es decir se va a cargar con verdadero o si se actualiza aquí falso en qué momento en el
00:33:23
momento que termina el método porque es lo que estamos devolviendo es el valor que tenga aquí
00:33:30
asignada se cargará aquí en esta variable después de ejecutar el programa esta variable tendrá
00:33:34
verdadero o falso según se haya o no asignado la edad a la variable que tiene la persona y aquí
00:33:43
bueno pues dentro de el método main podríamos tener una referencia de cómo ha ido la ejecución
00:33:49
de la asignación de la edad
00:33:55
utilizando esta variable
00:33:57
boolean, entonces podemos decir
00:33:59
if si bresult
00:34:01
es igual a true
00:34:07
poner este bresult
00:34:09
es igual a true es equivalente a poner
00:34:13
si bresult
00:34:14
recordad que
00:34:17
if necesita algo que sea aquí
00:34:19
verdadero o falso, aquí decimos
00:34:20
si true
00:34:23
es igual a true
00:34:24
pues entonces devuelve true
00:34:26
pero como bresult da la casualidad
00:34:28
que que si es true ya es true directamente sería equivalente poner cualquiera de estas dos y si
00:34:30
ve result viene siendo falso pues false no es igual a true con lo cual se convertiría en false
00:34:37
que sería equivalente a la información que tendría en ese caso vea result entonces aquí por ejemplo
00:34:42
por ejemplo podemos poner System.out.println edad actualizada, correctamente, o lo que pongáis.
00:34:50
Else, si nos devuelve el false, decimos edad no actualizada.
00:35:10
Si ahora ejecuto este código, haciendo una llamada con 1000, fijaros como dice edad no actualizada.
00:35:24
porque porque este 1000 ha llegado por aquí inicialmente habíamos dicho por defecto que
00:35:33
fuera true pero como 1000 se pasa de 150 ha entrado por aquí no ha hecho el else con lo
00:35:40
cual no ha asignado la edad y sí que al venir por él por el if de asignada vale falso devuelve falso
00:35:47
que se carga en b result y este b result al no ser verdadero es el else y me dice edad no actualizada
00:35:56
si yo pongo aquí que tenga un añito pues me dice edad actualizada correctamente recapitulando un
00:36:04
momento que lo que hemos hecho pues fijaros hemos puesto esta variable este parámetro de form privado
00:36:17
con lo cual ya no está accesible desde todo el proyecto solamente está accesible desde la propia
00:36:24
clase, fijaros si está accesible este parámetro en la propia clase
00:36:28
que lo estamos actualizando desde un método que pertenece a la
00:36:33
clase, es decir, aquí sí que lo está, pero por ser privado ya solamente
00:36:37
está en la propia clase. Y nos ha permitido, entre otras
00:36:40
cosas, pues el tener un control del rango
00:36:45
que queremos que tenga de edad. Además, entre uno y otro
00:36:48
aquí, al devolver un void, otra de las
00:36:53
cosas que tenemos en los métodos de las etiquetas que vamos a ir repasando, este asignar edad en principio no devuelve nada, no devuelve nada para que tenga una gestión de cómo ha ido la cosa desde donde lo hemos llamado, asigna o no asigna la edad a iedad, siempre asigna la edad a iedad pero si era menor de 0 en este caso aplicaba un 0, si era mayor de 150 aplicaba el techo de edad que podíamos tener 150, en este caso bueno pues teníamos un requisito diferente a la hora de gestionar la edad y era
00:36:57
que solo se actualizase en caso de que estuviera dentro del rango.
00:37:29
Y además nos estábamos obligando a que este método informase de cómo había ido su ejecución
00:37:33
a través de un boolean en particular que nos devolvía true si la actualización había sido correcta
00:37:40
y false si no lo había sido.
00:37:46
¿Y cómo lo hemos capturado aquí?
00:37:48
Pues en la llamada hacia la izquierda del igual nos devuelve lo que hayamos puesto en el return.
00:37:51
Entonces, BRSUL se ha cargado con verdadero o falso y aquí hemos hecho una gestión que es la que nos ha parecido oportuno. Podría haber sido otra. Podría haber sido el programa. Si resulta que se actualiza la edad, tenemos que dejar un log en un fichero diciendo edad actualizada.
00:37:57
Pues en lugar de escribir por pantalla, si el denunciado nos dijese eso, tendríamos que abrir un fichero y escribir un registro. Y si no, en una base de datos de errores, dejar un log. Pues a lo mejor tendríamos que insertar en una base de datos en el else, en lugar de este system of println, pues poner el código equivalente al acceso a la base de datos, crear un registro y almacenar que se ha producido ese error en el log.
00:38:13
Ya lo que nos pide el programa, cuando la cosa va bien o cuando va mal. La cosa es que aquí tenemos el resultado de cómo ha ido la actualización de la variable.
00:38:35
Bien, pues como siempre vamos dando diferentes vueltas a cada cosa, pero el objetivo inicial es repasar los posibles valores que tenemos para la etiqueta public.
00:38:47
Entonces tenemos que cuando es público está accesible desde todo el proyecto. Cuando es privado, hemos visto que está accesible solamente desde la propia clase. Y nos queda por hablar de dos, la protective y la de no poner nada.
00:39:01
Bueno, que la llaman package o la llaman también friendly, amigable.
00:39:18
Cuando no ponemos nada en un método o en un parámetro, el ámbito del acceso es en el paquete.
00:39:27
Es decir, podemos acceder a esta variable desde la propia clase siempre y desde cualquier clase que pertenezca a tu paquete.
00:39:41
si acudimos y la edad la ponemos como y edad sin poner nada aquí es equivalente es él
00:39:51
esa etiqueta se considera friendly de si ponemos aquí mi per punto y edad fijaros que ya lo tengo
00:40:02
disponible donde lo tengo disponible lo tengo disponible en la clase inicio porque porque
00:40:14
persona e inicio están en el mismo paquete y edad ahora está aquí y ya si yo intento acceder a edad
00:40:21
así que la tengo disponible volvemos un momento a ponerlo privado y fijaros cómo ya no es no vale
00:40:33
para cualquier clase de todo el paquete sino que sería por privado en la misma clase y ya me deja
00:40:48
de compilar, lo quito, se convierte en su ámbito de paquete y puedo acceder desde cualquier clase
00:40:53
que esté en su paquete pero no desde otros paquetes, fijaros finanzas que está en un paquete
00:41:03
diferente de inicio, si definimos aquí una variable, vamos a ver si nos funciona, int y fin, vamos a llamarlo
00:41:07
vamos a suponer que necesitamos esta variable, si le ponemos private y nos venimos a inicio, recordad
00:41:18
que inicio está en el paquete de por defecto y finanzas está en el paquete finanzas como tengo
00:41:26
aquí el objeto fin si yo ahora pongo fin punto hemos definido y fin privada con lo cual solamente
00:41:33
debe estar disponible dentro de su propia clase entonces fijaros como no me ofrece esta variable
00:41:42
porque la hemos definido como privada si yo cojo y defino esta public estaría disponible en todo
00:41:51
el proyecto si yo ahora como pongo aquí y fin fijaros como ya me la ofrece porque porque es
00:41:58
pública accesible en todo el proyecto y si yo la dejo sin nada en principio su ámbito de alcance
00:42:05
del paquete fijaros como ya no la tengo disponible en la clase inicio el paquete que está en el
00:42:14
paquete por defecto ya que y fin le hemos definido sin ninguna etiqueta con lo cual está disponible
00:42:24
en su paquete no la tenemos aquí cosa muy diferente a lo que nos pasa con y edad que
00:42:34
edad fijaros como si la tengo disponible a pesar de no tener ningún identificador aquí la tengo
00:42:40
disponible en inicio ya que inicio y personas están en el mismo paquete si no ponemos nada
00:42:49
disponible en el paquete si ponemos privada solamente en su clase si ponemos protective
00:42:58
si ponemos pública en todo el proyecto y si ponemos protective bueno pues hay un hay un
00:43:02
concepto nuevo que tenemos que repasar aunque lo veremos luego en más detalle pero pero bueno lo
00:43:12
voy a enseñar aunque luego ya lo veremos otro día para ilustrar un poco la etiqueta en public
00:43:20
fijaros si vamos a crear una nueva clase aquí en finanzas a la clase no vamos a crear la mejor
00:43:28
aquí, en la de por defecto
00:43:48
yo creo
00:43:52
vamos a crear en finanzas
00:43:52
y la voy a llamar clase hija
00:44:04
ahora entenderéis por qué
00:44:15
y aquí voy a crear otra clase
00:44:16
y lo cuento
00:44:35
paso a paso
00:44:38
aquí voy a llamar una que sea clase 1, no tiene mucho
00:44:38
sentido estos nombres pero
00:44:42
es para que lo veáis, mirad
00:44:43
si yo cojo y pongo aquí
00:44:48
en la clase 1, defino un parámetro
00:44:49
int y valor 1
00:44:51
esta clase estaría dando el servicio que fuese
00:44:54
no lo hemos definido de ninguna de las formas, simplemente es para
00:44:58
contaros lo que quiero, voy a dar un nombre un poquito
00:45:03
a la clase un poquito más entendible
00:45:11
tenemos la clase persona y
00:45:14
un tipo de persona que tenemos son por ejemplo los alumnos
00:45:19
voy a crear la clase alumno, entonces los alumnos pueden tener una nota
00:45:23
int, vaya se me ha ido a la clase finanzas
00:45:37
a ver si arrastrándolo así al paquete por defecto, lo ha arrastrado a la clase paquete por defecto, tenemos en la clase paquete por defecto la clase alumno y el alumno tiene un identificador, un entero.
00:45:40
En Java tenemos una organización jerárquica de clases. Esto quiere decir que tenemos la posibilidad de, bueno, es una de las características de la programación orientada a objetos, que es la herencia.
00:46:07
hablaremos de ella en otro no sé si en el tema siguiente o más adelante pero lo introduzco un
00:46:22
poquito para contaros esto entonces la herencia lo que nos permite es definir clases a un nivel
00:46:30
de jerarquía superior vamos a poner la clase persona y decir que una por debajo colgando
00:46:36
digamos de la persona podemos decir que existe la clase alumno y por ejemplo la clase profesor
00:46:47
ambos dos son personas, es la característica que tienen.
00:46:53
Entonces, en la clase persona podríamos definir una serie de atributos,
00:46:57
por ejemplo, int y edad, y esta edad es común tanto al alumno como al profesor.
00:47:02
Si nosotros queremos que los alumnos tengan edad y que los profesores tengan edad,
00:47:08
podríamos definir en cada una de ellas un iedad,
00:47:12
con lo cual podríamos acceder a la edad del alumno y en el profesor un int y edad también,
00:47:16
y por ejemplo vamos a suponer que las personas pueden saludar public void saludar y los alumnos
00:47:22
efectivamente también pueden saludar y los profesores también pueden saludar claro tanto
00:47:32
los alumnos como los profesores tienen una edad y son capaces de saludar dar porque en realidad
00:47:45
bueno pues son personas ambos dos luego el profesor pues tendrá el mejor en habrá dado
00:47:50
un número de cuenta
00:47:57
y NUM cuenta
00:47:59
y a lo mejor el alumno
00:48:01
tristemente no cobra aquí por estudiar
00:48:02
y no tiene un número de cuenta.
00:48:05
En cambio el alumno sí que tiene
00:48:07
INT y
00:48:08
NUM matrícula.
00:48:09
Alumnos y profesores
00:48:17
por una característica que suelen ser
00:48:18
de las personas, tienen una edad.
00:48:21
Alumnos y profesores
00:48:23
por el hecho de ser
00:48:24
alguna característica que tienen por ser personas
00:48:26
son capaces de saludar y los alumnos tienen un número de matrícula
00:48:28
y los profesores tienen un número de cuenta, los alumnos no tienen
00:48:33
un número de cuenta, los profesores no tienen un número de matrícula.
00:48:37
Estas dos características que son comunes podemos coger y no definirlas
00:48:41
aquí inicialmente y aún así estar disponibles en el alumno y el profesor
00:48:46
si las pueden recuperar de forma heredada desde la clase persona.
00:48:50
Y en Java, para hacer eso, lo que se pone aquí es la etiqueta Stents. Les decimos que un alumno hereda todas las características que tenga una persona. Con lo cual, sin definirla en la clase alumno, resulta que está teniendo una edad y la posibilidad de saludar según se haya definido en el método de la clase persona.
00:48:55
Y si de la misma forma queremos que un profesor tenga esas posibilidades, cogemos y ponemos aquí Stents, Persona, entonces ambos dos, tanto el alumno como el profesor, tienen estas características de forma heredada desde la persona, es decir, somos capaces de asignarles una edad y de saludar según se haya puesto en la clase Persona, en los alumnos y los profesores.
00:49:18
Y luego aparte, los alumnos tienen sus propios parámetros y sus propios métodos que pudiéramos poner aquí. Un alumno le podemos asignar un número de matrícula y un profesor su número de cuenta.
00:49:44
Entonces si nosotros ponemos aquí extends persona, fijaros que esto es un alumno, nosotros podemos venir aquí, es una clase alumno, podemos instanciar aquí un objeto de la clase alumno, como siempre, ¿verdad? Con el new, el constructor, y ahora podemos poner aquí mi alum, punto, y fijaros como me ofrece aquí la edad, ¿por qué me ofrece la edad?
00:49:54
porque el alumno, aunque no tiene aquí definida una edad,
00:50:37
estamos diciendo que hereda de persona.
00:50:41
Y persona, hemos cogido y le hemos dicho que tiene aquí una edad,
00:50:43
como podéis ver.
00:50:47
Entonces, tiene disponible, gracias a la herencia,
00:50:48
la posibilidad de asignarle una edad.
00:50:50
A ver, entonces, si cogemos y a la edad que tiene la clase persona
00:51:14
le decimos que sea private,
00:51:20
cuando definimos algo privado, que hemos dicho que solo estaba disponible
00:51:28
en su clase. Entonces, si yo ahora pongo aquí
00:51:31
mi alumno y edad, esta edad
00:51:34
a pesar de que el alumno
00:51:39
hereda a través del Stance las características de la clase
00:51:42
persona, como hemos dicho que la edad es privada, solamente es modificable
00:51:49
por objetos de la clase persona.
00:51:53
Y por ese motivo, aquí ya coge y no me compila.
00:51:56
pero tampoco me va a compilar, yo creo que si le pongo
00:52:00
protective, que es lo que iba a decir
00:52:09
protective, tampoco me va a dejar
00:52:10
vale
00:52:12
así con protective ya sí, con protective
00:52:14
me deja porque
00:52:17
este valor ya está
00:52:18
disponible, tanto
00:52:21
está disponible para aquellos
00:52:23
objetos, para
00:52:27
aquella información que
00:52:28
está heredada, es lo que añade
00:52:30
el privado
00:52:32
el package al
00:52:34
A ver qué os digo. El protective lo que añade respecto al de paquete, las variables paquete están disponibles desde cualquier objeto que esté definido en el mismo paquete, desde cualquier clase que esté definida en el mismo paquete.
00:52:36
Y en cambio las que están protective están disponibles en el mismo paquete y para aquellas clases que heredan de una que esté en el mismo paquete.
00:52:55
Mirad, aquí la clase alumno, bueno, en realidad alumno y persona están en el mismo, con lo cual también le vale el package.
00:53:16
Vamos a hacer que la clase hija herede de la clase persona.
00:53:24
Stance, create, import, no me deja importar por estar en la clase persona, por estar en el paquete por defecto.
00:53:31
Mirad, la tabla como queda entonces es de la siguiente forma.
00:54:03
Si tenemos public, está accesible desde cualquier parte del proyecto.
00:54:06
Si está el otro extremo respecto a public, es private.
00:54:22
Está accesible solo desde la propia clase.
00:54:32
Luego tenemos no poner nada, que sería equivalente a la etiqueta package.
00:54:42
también le llaman friendly, en ese caso estaría disponible desde cualquier sitio en su propio paquete.
00:54:54
Y luego está la protective, que este sería igual que la de por defecto, sería la de por defecto,
00:55:17
efecto es decir desde cualquier sitio de su propio paquete más desde clases heredadas
00:55:29
para que sea esta situación si está en el mismo paquete que en realidad este ejemplo que estábamos
00:55:40
poniendo estaba en el mismo paquete alumno y persona estaría con protective en el mismo
00:55:47
paquete y para desde clases heredadas necesitaríamos que la herencia fuera desde una clase a otra que
00:55:54
estuviera en otro paquete tallesta en realidad son como muy comunes típicamente las clases heredadas
00:56:00
van a estar dentro del mismo paquete porque van a ser típicamente van a ser de funcionalidades
00:56:07
comunes y como los paquetes los solemos crear por funcionalidades van a estar el mismo paquete
00:56:13
entonces la de por defecto y la la y la protective son como muy parecidas y las que marcan más
00:56:18
diferencias son la privada y la pública se entiende se vale pues nada genial
00:56:24
hablando de paquetes y librerías ya lo hemos repasado un poquito lo tengo por aquí marcado
00:56:43
para contarlo los modificadores estos de public protect is el friendly o para casi el private
00:56:49
método main más cosas que tiene el método main static ya hemos hablado varias veces de ella
00:56:55
cuando definimos algo estatis bien sea un método bien sea un parámetro resulta que se convierte en
00:57:03
un método propio de toda la clase y para acceder a él no es necesario instancia instancia objetos
00:57:10
lo habíamos visto por ejemplo con más más punto apps de bueno el valor absoluto de un valor pues
00:57:19
accedemos directamente a un método de la clase math poniendo el nombre de la clase sin necesidad
00:57:28
de haber creado un objeto de esa clase típicamente desde un método estático si yo pongo aquí yo creo
00:57:34
aquí un valor que sea y valor si yo pongo aquí y valor igual a 5 ya os he comentado pues no me
00:57:49
compila. ¿Por qué no me compila? Porque en realidad, si yo instancio
00:58:00
diferentes objetos de la clase inicio, cada uno de ellos tendrá
00:58:04
en zona RAM su espacio diferente. Entonces, este iValor
00:58:08
me diría, sí, muy bien, quieres asignar iValor, pero
00:58:12
¿a dónde? ¿a cuál de ellos? De todos los posibles objetos que podríamos tener.
00:58:15
En cambio, si yo esto lo defino como static, como ya es único
00:58:21
para toda la clase y lo estoy ejecutando desde un método que es único
00:58:24
para toda la clase ya no hay lugar a dudas dice oye pues se debe referir a la única posición de
00:58:28
memoria que tengo para la variable y valor dentro de la clase para todos los objetos entonces aquí
00:58:33
lo tendría fijaros aquí en finanzas si definimos por ejemplo y fin o vamos a definir static
00:58:39
int y valor también, vamos a llamarlo
00:58:48
por ejemplo, si tuviéramos
00:58:53
como parámetro de clase un entero llamado y valor
00:58:55
y acordamos definirlo como estático
00:59:00
si nosotros venimos aquí, fijaros, podríamos acceder directamente
00:59:03
a ese valor que es estático con el nombre de la clase
00:59:08
aquí finanzas, punto, bueno me pide que le identifique el paquete
00:59:11
también en el paquete finanzas clase finanzas punto y valor porque no me deja acceder y valor
00:59:37
si lo he definido como estático a ver que vea por aquí no entiendo a ver bueno no me está no me lo
00:59:49
está ofreciendo precisamente por algo que hemos estado hablando antes fijaros este no le he puesto
01:00:19
ningún identificador ni de privado ni público ni nada con lo cual tiene la etiqueta friendly la
01:00:25
etiqueta friendly corresponde a su propio paquete y resulta que inicio está en un paquete y finanzas
01:00:32
está en otro justo estoy estaba sufriendo algo de lo que os estaba contando antes entonces para
01:00:39
poder acceder desde diferentes clases este y valor tendrá que ser public y ahora ya lo tengo
01:00:44
disponible ahora ya se me deja tener disponible y a lo que iba es que ha cedido a finanzas se ha
01:00:58
accedido a un valor que es estático sin necesidad de utilizar un objeto de la clase finanzas como
01:01:09
era este si quito esto también me va también me da como lo tengo importado aquí también me da
01:01:14
digo de la clase finanzas en sí antes distanciar incluso un objeto ya tengo disponible la variable
01:01:20
y valor porque porque es estática que es un poco lo mismo que como digo hacemos aquí con el math
01:01:27
cualquiera de todos estos métodos
01:01:34
o cualquiera de estos, el tau
01:01:37
debe ser un valor
01:01:39
vamos a ver que vale
01:01:41
println, vamos a mostrarlo
01:01:46
por pantalla, no sé que será
01:01:50
el tau este de matemáticas
01:01:57
vamos a ver
01:01:58
a lo que voy, tenemos disponible
01:01:59
este parámetro de la clase
01:02:03
matemáticas porque en la clase matemáticas
01:02:05
estará definido como estático
01:02:07
tau vale eso
01:02:09
parece que es el doble de pi
01:02:11
628, 31
01:02:15
doble más cosas que tenemos aquí en el método main pues tenemos el void voy también hemos
01:02:17
hablado de ello todo método exceptuando los constructores que no devuelven nada pero no
01:02:29
se indica haremos un constructor otra vez que hablábamos el otro día tienen que avisar de
01:02:34
si devuelven algo no devuelve nada puede ser que no devuelva nada aquí persona en este habíamos
01:02:40
dicho que no devolviera nada, no tenía un return, como no devolvía nada, tenía el void
01:02:49
y cuando lo hemos llamado por aquí, no hemos hecho ninguna gestión con
01:02:52
o no sé si lo hemos terminado de llamar, no hemos hecho ninguna gestión con la información que
01:02:56
devolvía porque de hecho no devolvía nada. O puede ser que devuelva
01:03:00
un tipo de datos, bien primitivo o bien referenciado. Puede devolver un
01:03:04
entero, un boolean, un string, lo que corresponda.
01:03:08
Si devuelve algo, acordaros que dentro del
01:03:13
método, este por ejemplo devuelve
01:03:16
un boolean, tendremos que poner un return
01:03:18
porque en el momento que devuelve algo
01:03:20
si no obtengo un return ya no compila
01:03:22
y lo que debe devolver es algo del mismo
01:03:24
tipo que tiene aquí
01:03:26
identificado en la cabecera, en este caso es un boolean
01:03:28
y esto lo devuelve
01:03:31
trae la ejecución
01:03:32
hacia la izquierda en la llamada
01:03:34
y me lo carga aquí en la variable
01:03:36
para que luego aquí desde el sitio de la llamada
01:03:41
pueda hacer la gestión que corresponda
01:03:44
coordinando lo que devuelve y lo que
01:03:45
esperamos que devuelva con lo que haya devuelto
01:03:47
Luego aquí tenemos el nombre del main y por aquí tenemos la posibilidad de pasarle parámetros para su ejecución.
01:03:54
Dentro de pasarle parámetros, el main es así, porque como es estrictamente así, ya que es el punto de entrada al programa,
01:04:01
pero aquí el otro día hablábamos de diferentes alternativas, fijaros, a la hora de pasarle parámetros.
01:04:09
El hecho de tener métodos con el mismo nombre es la característica de la programación orientada a objetos de sobrecarga,
01:04:16
En este caso es sobrecarga de métodos, pero para diferenciar y que en la llamada se ejecute un método u otro, diferenciamos uno u otro en función del número de parámetros y el tipo de los parámetros que reciba.
01:04:24
Aquí estuvimos haciendo sobrecarga del método saludar.
01:04:38
Y en el main habíamos dicho que recibe una serie de parámetros que justo se cargan en el inicio del programa a través de la llamada del intérprete de Java, cuando le ponemos el Java nombre del programa y le podemos pasar una serie de strings que separados por espacios se van cargando en este array para que luego podamos manejarlo.
01:04:41
Y desde Eclipse, recordad que habíamos hablado que lo teníamos, a ver si lo vemos, el otro día, era aquí, coverage configuration, a ver, sí, aquí, de hecho, aquí tenemos del ejemplo del otro día que decíamos que en el inicio de la ejecución los argumentos de inicio del main cargue, bueno, por dos palabras, hola, con un espacio aquí dos, habíamos puesto.
01:05:07
Y esto se cargaba, como os decía, como un array en el array de strings ARS, con lo cual si ponemos aquí system.out.println ARS0 y ARS1, hacemos una ejecución y fijaros como aquí nos sale el hola y adiós que corresponden a estos dos datos que tenemos puestos aquí.
01:05:36
Y bueno, pues esto es entendiendo un poquito en qué consiste el main y realmente todas estas funciones que son extrapolables a otros métodos por ahí.
01:06:07
Más métodos interesantes y un poquito diferentes, y hablando de cosas de métodos, en el siguiente tema volvemos a hablar de métodos, igual repasamos todo esto de nuevo.
01:06:24
Los métodos por convenio suelen tener nombre en singular, primera letra en singular, perdón, en minúsculas. Si el nombre del método tiene varias palabras, pues minúsculas y luego la siguiente palabra, saludar mucho, pues la segunda palabra si quisiéramos ponerlo, pues la ponemos en mayúsculas, si tiene varias palabras.
01:06:34
Y si tuviera otra palabra adicional, pues volveríamos a poner la primera letra en mayúsculas.
01:07:01
Más cosas de los métodos que contaros.
01:07:10
Vale, tenemos, decimos que los métodos siempre tenemos que indicar que devuelven, excepto los métodos constructores.
01:07:15
Recordad, los métodos constructores son los que llamamos cuando hacemos el new.
01:07:23
Entonces, en estos métodos se definen como públicos.
01:07:28
Persona justo no tiene ninguno, a ver.
01:07:34
aquí tenemos métodos constructores, son los que se llamamos con los news, no devuelven nada pero no se indica, ¿por qué? pues bueno, así lo definieron, esto en realidad sería como si tuviera un void,
01:07:37
pero si tiene un void no se considera ya el método constructor, sino que no hay que poner nada, y bueno, así que se va un poco de la regla de que los métodos empiezan con minúsculas,
01:07:52
porque como se tienen que llamar obligatoriamente igual que la clase y la clase nos obliga también la norma que la llamamos con letra mayúscula, pues los constructores tienen que ser con letra mayúscula.
01:08:04
Otros métodos que también se suelen utilizar y van un poco en relación a lo que os comentaba antes de definir, por ejemplo, los métodos private y que se pueda acceder a ellos solamente desde la clase,
01:08:19
de tal forma que protegemos los posibles valores que pueda terminar teniendo la edad.
01:08:31
Fijaros, en el momento que he puesto ya este y edad como privado,
01:08:36
me ha dejado compilar ya por aquí en un acceso que tenía directamente a la variable,
01:08:42
pues de esta forma nos estamos obligando a que los accesos se hagan a través de métodos públicos
01:08:47
que tenga la clase y en estos métodos públicos nos permite tener un determinado control,
01:08:53
Lo que os he contado antes. Pues estos métodos que están pensados no para hacer funcionalidades propias de la persona, como pueda ser saludar o si fuera un alumno hacer examen, estos cuya finalidad es gestionar el acceso a variables, a parámetros de clase, se los suelen llamar métodos de establecimiento o de recuperación o en inglés getter o setters.
01:08:59
getter o setter. Entonces estos getter o setter
01:09:25
lo que hacen es devolver el nombre
01:09:31
y si es para este sería devolver el nombre
01:09:35
el getter y el setter sería asignarlo. Y bueno, entre medias
01:09:39
puedes poner cierto código para controlar los posibles valores que tenga.
01:09:43
Entonces estos métodos getter o setter, como son
01:09:48
muy típicos, los ides ya tienen por aquí una función
01:09:50
que nos permite crearlos de forma bastante automática.
01:09:55
Vamos a intentar localizarlo.
01:09:58
Fijaros aquí en la opción Source.
01:10:00
De Clise tenemos Generate, Getter y Setter.
01:10:04
Si lo pulsamos, fijaros cómo nos localiza
01:10:08
las variables de clase que tenemos,
01:10:12
ese nombre y edad e iValor.
01:10:14
Y dice, selecciona para cuál quieres crear.
01:10:17
setters, getters
01:10:19
o
01:10:21
bueno, para
01:10:23
generarlos, entonces vamos a por ejemplo a generar
01:10:25
getter y setter de IEDAD
01:10:28
no vamos a marcar los otros dos, podríamos marcar todos
01:10:30
pulsamos
01:10:34
y por aquí abajo
01:10:35
o por aquí en medio
01:10:37
o no sé dónde
01:10:39
fijaros aquí como me ha creado un getter
01:10:40
y un setter, voy a subirlos arriba
01:10:44
para tenerlos localizados
01:10:46
aquí arribita, los he cortado y los he pegado
01:10:47
en realidad el programa
01:10:50
lo único que hace es, pues el getter
01:10:53
que lo que va a hacer va a ser devolverme la información de iedad
01:10:56
que en principio la hemos definido como privada para que no haya
01:11:00
acceso directamente a la variable
01:11:02
lo único que hace a la hora de generarlo de forma automática es devolver
01:11:04
precisamente ese valor y como iedad es
01:11:08
un parámetro de tipo entero
01:11:11
pues lo que hace es el método de devolver un entero
01:11:14
y en el caso de asignar el setter, no necesitamos que devuelva nada,
01:11:17
pero lo que queremos es asignar un valor a un parámetro de la clase,
01:11:24
con lo cual el valor que vamos a asignar lo recibe como parámetro
01:11:29
y se lo asigna la variable de clase.
01:11:32
Fijaros que este setter es muy parecido a lo que hemos hecho aquí antes,
01:11:36
recibir el valor y terminar asignándoselo a la variable aquí.
01:11:41
Lo único que bueno, aquí nosotros hemos añadido cierto código porque nosotros sí sabíamos lo que queríamos que pasara con la edad, Eclipse inicialmente no lo sabe, entonces este setter ahora podríamos nosotros actualizarlo, más allá de que no devuelva nada, podríamos actualizarlo para que asignase la edad en función de estos criterios.
01:11:49
Este asignar edad podría ser ese setter. La variable aquí se ha llamado iedad. Este método sería este otro que hemos puesto nosotros aquí, asignar edad, que habíamos hecho en realidad un setter, no se llamaba con el set, pero era lo que estábamos haciendo. Cierta lógica para asignar una información.
01:12:10
fijaros que aquí esta variable se llamaba y era una variable local a nuestro método
01:12:45
y esta edad si la marco fijaros como se me asigna justo a la edad que tenemos definida como parámetro
01:12:53
entre este no hay lugar a dudas este método la única variable y que conoce o la variable y que
01:13:02
conoce, es una variable local que la tiene en su propio ámbito
01:13:11
definida, con lo cual no hay lugar a dudas que es esta la que ejecuta, si marco
01:13:15
sobre ella, aquí lo tenemos, y si pulsamos sobre esta, esta variable
01:13:19
yedad disponible en el método asignar edad, como no la tiene
01:13:23
definida en su ámbito más local, que es en la definición del propio método, se va
01:13:27
al ámbito más grande, que es el de la clase, y fijaros como me está
01:13:31
marcando esta yedad. En cambio en el setter, esta
01:13:35
y edad es esta, la local, pero se lo está asignando
01:13:39
a esta variable, que si os fijáis
01:13:43
vuelve a ser esta, con lo cual en realidad no estaríamos actualizando la edad que tiene
01:13:46
la persona en la clase. Esto ha sucedido porque
01:13:51
tenemos coincidencia de nombre en la variable, entonces si la tenemos
01:13:55
definida en un ámbito más amplio, como en la clase persona
01:13:59
y en el ámbito también del método de forma local a través del
01:14:02
atributo de a través del parámetro de entrada la tenemos definida con el mismo nombre el método se
01:14:07
queda con la digamos más próxima a la más cercana que es esta otra como podemos hacer que esta edad
01:14:13
que se recibe aquí en realidad se asigne a la variable de edad de toda la persona utilizando
01:14:20
la etiqueta this this significa yo como objeto que estoy ahora mismo en ejecución este método
01:14:26
se estará ejecutando para un determinado objeto pues yo mismo mi variable y edad entonces si ahora
01:14:35
marcamos está fijaros como ya no se marca esta y sí que me identifica ese y edad no como la variable
01:14:41
local sino como la variable de objeto esto ha sucedido porque el set era hecho coincidir los
01:14:47
dos nombres de la variable en este caso no había lugar a dudas porque como no coincidía esta edad
01:14:55
está y edad no está definida en el ámbito del método y solamente está definido en el ámbito
01:15:02
de la clase, con lo cual no había problemas.
01:15:07
Igualmente podríamos haber puesto aquí
01:15:09
el dis, también hubiera sido
01:15:11
tampoco un problema, aunque
01:15:12
no había conflicto, pero bueno
01:15:15
con el dis todavía queda quizás
01:15:17
más claro que se está refiriendo a la variable
01:15:19
de la clase. A ver, ¿qué más cositas
01:15:21
por ahí tengo para contaros?
01:15:27
Public Protective, Friendly,
01:15:29
los Getter y los Setter. Entonces los
01:15:32
Getter y los Setter, pues son estos métodos
01:15:33
para asignar valores
01:15:36
y para recibirlos. Mirad,
01:15:37
aquí
01:15:41
en la edad, nosotros estábamos intentando asignar valores, pero si yo
01:15:41
cojo y digo system.auth.println
01:15:45
y digo voy a sacar por pantalla
01:15:51
la edad de mi pair, un objeto de la clase persona. Bueno, directamente
01:15:55
no me deja poner y edad, ¿por qué? Pues porque y edad está
01:16:02
definido como privado. Y la forma de saber la edad
01:16:06
la puedo obtener a través del getter, que es
01:16:10
público si yo pongo aquí y per punto get y edad cuando ejecutó este método se viene aquí y que
01:16:14
hace un retorno de edad del valor que tiene esta variable devuelve un entero lo devuelve digamos
01:16:27
hacia la izquierda es decir se lo devuelve al paréntesis del println y mostrará la edad que
01:16:33
si damos aquí una ejecución pues yo creo que estamos por aquí en este 0
01:16:39
vamos a comentar cosas por ahí para poder seguirlo más fácil
01:16:45
esto del tau que parece que era el doble de pi
01:16:52
vamos a comentar esto también
01:16:54
este o la 2 que uno lo está mostrando desde aquí también lo comentamos
01:16:58
y ya si ejecutamos lo primero que nos encontramos es el 0
01:17:10
que es esta edad
01:17:17
¿por qué nos ha dado de vuelto 0?
01:17:20
pues bueno pues los valores las variables numéricas por defecto se inicializan a cero
01:17:21
resulta que hemos intentado que asignar una edad llamando a este método asignar edad con valor
01:17:31
menos 30 y si nos ponemos aquí recordad que cuando llamamos a este método si el valor era menor de
01:17:35
0 directamente la asignaba como valor un 0 y vamos a poner que si el valor es muy pequeño
01:17:45
la asignó un 1 para hacer una proyección claro es como ya nos asigna el 1 y luego el get y edad
01:17:50
nos ha devuelto la información el getter nos ha devuelto la información de la variable y edad
01:17:58
que era este 1 y el sistema println no ha sacado por alguna duda mirad más cosas que os cuento las
01:18:03
términos términos que tenemos en java cuando llamamos ejecutamos métodos desde aquí del
01:18:24
inicio aquí por ejemplo estamos ejecutando estamos ejecutando el método llamar saludar
01:18:34
de un objeto fin que es de la clase de finanzas a nivel terminología cuando ejecutamos un método
01:18:46
lo que se dice es que estamos mandando un mensaje
01:18:54
desde el método main de la clase inicio
01:18:58
al objeto fin, es decir, poner en ejecución
01:19:03
un método es enviar un mensaje, eso es lo que luego por ahí
01:19:07
por el temario cuando veáis mensajes, es a lo que hace referencia
01:19:09
luego, las clases hemos dicho que tienen
01:19:14
atributos, aquí tenemos dos
01:19:18
o parámetros y tienen
01:19:22
métodos. Pues la forma de interactuar
01:19:25
con objetos de la clase finanzas desde otras clases
01:19:28
es enviándole mensajes, como os decía,
01:19:31
y a través de sus
01:19:35
métodos. Entonces, cuando los métodos, digamos
01:19:37
que es el interfaz de la clase. En un momento dado se dice
01:19:40
¿cuál es el interfaz de la clase finanzas? Pues son los
01:19:43
métodos saludafinanzas y
01:19:46
llamarsaludar, que en realidad saludafinanzas está bloqueado
01:19:49
su acceso porque es privado para que lo llamen desde otras partes, pero bueno
01:19:52
formaría parte de su interfaz aunque solo fuese para ser llamado
01:19:56
desde otros métodos de la propia clase. Entonces el interfaz es el conjunto
01:20:00
de métodos con el cual nos podemos comunicar con los objetos de la clase
01:20:04
finanzas. ¿Y cómo nos comunicamos? A través del envío de
01:20:08
mensajes, que básicamente es dar la instrucción de que se
01:20:12
ejecute un método del objeto de esa clase.
01:20:16
más cosas, los ámbitos de las variables que también hemos hablado de ellos
01:20:20
si nosotros tenemos aquí la variable, por ejemplo el método set y edad
01:20:29
esta es una variable, la que recibe como parámetro una variable local al método
01:20:34
y si nosotros definimos aquí una variable también local a este método
01:20:39
como está definido en este ámbito, cuando acaba este ámbito la variable desaparece
01:20:46
que desaparezca la variable quiere decir que deja de estar accesible desde otras partes del código
01:20:51
y que, como ya no está referenciada, nos interesa que se libere la memoria RAM que estaba ocupando.
01:20:56
Aquí, cuando hemos definido una variable, no hemos hecho el new porque es un tipo string,
01:21:05
está entre medias de primitivo referenciado, pero bueno, por la característica de tipo primitivo,
01:21:10
no hemos tenido que hacer el new, pero lógicamente se ha reservado un trocito de memoria RAM
01:21:15
para guardar su información, para que no se quede bloqueada de por vida en el momento en el que ya
01:21:19
No es una variable accesible desde el programa, es decir, si es una variable local al método, una vez que termina el método, lo que interesa es que se libere esa memoria RAM para que nuestro propio programa o cualquier otro programa que esté en ejecución en el ordenador sea capaz de utilizar esa memoria RAM.
01:21:24
¿Quién se encarga de hacer esto en Java? Pues no lo hacemos nosotros directamente
01:21:40
está el recolector de basura, así se llama, que se va dando cuenta de variables
01:21:44
que ya no están siendo utilizadas y que están bloqueando memoria RAM en el ordenador
01:21:51
y empieza a liberarlo, dice bueno pues ya como ya no se utiliza esa memoria RAM
01:21:57
te la devuelvo al sistema operativo para que la utilices convenientemente
01:22:01
con el programa que te interese, el recolector de basura
01:22:05
Si la variable está definida en este ámbito de la clase persona, pues ¿cuándo cobran vida estas variables de clase? Estas variables de clase cobran vida en el momento que hacemos el new y llamamos al constructor, cuando creemos una nueva persona.
01:22:09
entonces, ¿cuál es la existencia de estas variables
01:22:25
mientras esa persona exista? si nosotros definimos
01:22:29
dentro de un método una persona
01:22:32
aquí por ejemplo el objeto
01:22:37
mi alum de alumno, en este caso cuando acabe el main
01:22:40
como ya este alumno se va del ámbito de donde ha sido definido
01:22:44
ya deja de tener sentido, y si deja de tener sentido el recolector de basura
01:22:49
igual que había hecho antes con la variable ese no se dará cuenta que ya no se utiliza y como
01:22:53
no está referenciado liberar a esa memoria entonces bueno por ahí tenemos momentos en
01:22:59
los que se crean variables ámbitos en los que están disponibles y cuando son eliminados que
01:23:08
se encarga de ello el recolector de basura hay lenguajes como también orientados a objetos como
01:23:15
C++, que tienes que hacer también las instrucciones
01:23:21
equivalentes al new para hacer la reserva de memoria para tipos referenciados
01:23:25
pero luego no existe un recolector de basura, con lo cual si tú
01:23:28
cuando está acabando el ámbito en el que utilizas esa variable, no te preocupas de
01:23:33
liberar la memoria por código, ese código se va quedando ahí bloqueando
01:23:37
memoria RAM y bueno, imaginaos que está en un bucle que se ejecuta a menudo
01:23:41
en cada una de esas ejecuciones haría una nueva reserva de memoria
01:23:45
y los recursos del ordenador poco a poco se irían irían escaseando hasta que sí bueno si está
01:23:49
muchísimo tiempo pues igual terminaría el programa por dejar de funcionar porque no tendrían nueva
01:23:55
memoria ram disponible para seguir trabajando cosas que tenemos por ahí más con el tipo
01:24:02
referenciado ya hemos hablado las clases graper tengo por aquí apuntado acordaros para los tipos
01:24:12
primitivos necesitan ciertas funciones que nos las proporcionan las clases
01:24:19
grupper en una clase que sea referenciada como por ejemplo mat
01:24:24
nosotros ponemos aquí está escribiendo lo fuera de un método si ponemos aquí
01:24:31
más punto pues fijaron la clase más nos ofrece cosas por aquí todos estos como
01:24:43
una instancia de un objeto de la clase más serán todos ellos estáticos cambios
01:24:50
si nosotros ponemos aquí int y definimos una variable y ponemos aquí
01:24:55
un punto, si ponemos aquí y punto,
01:25:00
pues no me ofrece nada. ¿Por qué? Porque son los tipos primitivos, con sus
01:25:05
características que ya hemos hablado. No hay que hacer el new, pero no tienen cosas disponibles.
01:25:08
Entonces, hay definida una clase integer
01:25:13
que implementa
01:25:15
funciones que van de la manita de las variables de
01:25:20
tipo int para que tengamos disponibles
01:25:24
todas aquellas funciones que
01:25:26
la clase primitiva int no
01:25:28
tiene. Estas son las clases
01:25:30
Wrapper, ya hemos hablado de ellas otras
01:25:32
veces. Mirad, el método
01:25:34
toString. El método toString
01:25:39
hablaremos también de él
01:25:43
más veces, pero es
01:25:45
bastante interesante.
01:25:46
Cuando nosotros
01:25:49
y útil, habrá momentos en los que
01:25:49
tendremos que trabajar con él bastante intensamente
01:25:53
cuando hablemos de colecciones.
01:25:55
Os cuento un poco el toString.
01:25:57
claro en la clase finanzas tenemos el método si ponemos a punto intentamos utilizar tu string ya
01:26:00
no lo está ofreciendo cambio en finanzas no hemos definido ningún método tuestre que sucede que hay
01:26:23
una serie de características que toda clase en java va a tener siempre porque dentro de esa
01:26:30
estructura que os decía de jerarquías que iban de arriba abajo antes cuando se hablaba de las
01:26:36
herencias arriba del todo en la estructura ahí está la clase object y esta clase object de alguna
01:26:42
forma todas sus características son heredadas por cualquier clase que tenga todo programa en
01:26:51
java me da igual sea un programa mío sea de quien sea sea una clase sea otra sea de librerías todas
01:26:57
ellas tienen características que están definidas en object con lo cual todo objeto siempre va a
01:27:03
tener una serie de métodos disponibles y uno de ellos es el tu string el método como herencia
01:27:10
digamos desde hoy de las herencias hablaremos que la herencia tiene que ser única desde una clase
01:27:21
con excepción de esta herencia que os digo desde hoy pero ya hablaremos de herencia otro día
01:27:26
entonces el método tu string está disponible en todas partes nosotros cuando ponemos aquí
01:27:33
un system.out.println
01:27:37
pongamos lo que pongamos aquí, en realidad nos funciona y nos
01:27:40
saca información, si nosotros ponemos aquí un int i igual a 5
01:27:47
ponemos aquí un i, nos saca el 5
01:27:50
pero si ponemos aquí un string, ese info
01:27:54
igual a hola, nosotros ponemos aquí un system.out.println
01:27:58
y también nos funciona, y si ponemos un system.out
01:28:11
.println
01:28:18
de i más
01:28:20
pongo aquí
01:28:24
una sas yo directamente y pongo aquí
01:28:26
ese info, pues también
01:28:28
no va
01:28:35
entonces que pasa que
01:28:35
si este .println se traga aquí
01:28:38
cualquier cosa, pues si se lo traga
01:28:40
pero porque
01:28:43
para cada una de las cosas que pongamos aquí
01:28:44
lo que hace
01:28:47
es convertirlo antes
01:28:49
a un string
01:28:50
con lo cual esto que es un entero lo convierte primero en un string y luego lo que hace es concatenar ese string con esto que es otro string y si esto no fuera un string que ya lo es pues lo convertiría también un string fijaros si ponemos aquí más vamos a poner aquí unos espacios y ponemos aquí a recordad que a es el objeto de la clase de finanzas también me compila
01:28:57
recordad que antes hemos puesto aquí el tu string este y que devuelve tu string devuelve un string
01:29:24
entonces cualquier cosa que pongamos aquí lo convierte en un string y luego concatena todos
01:29:30
esos strings para sacar un resultado conjunto de lo que pongamos en el sistema println en el
01:29:36
que hay casos en los que está muy claro lo que lo que va a suceder si yo pongo aquí un entero
01:29:44
pues resulta que la clase, seguramente el grupper este integer, si ponemos aquí integer.toString, fijaros como lo tiene, recibe un entero y nos devuelve un string y conviérteme a string un valor entero, está claro que este método, esta clase integer tendrá escrito, estará sobrescribiendo lo que recibió de object,
01:29:50
Recordad que antes os he dicho que por herencia tenemos disponibles los métodos que estén definidos en las clases de las cuales se heredan.
01:30:19
Object, digamos que podría ser un estilo de herencia, todas las clases se heredan de object.
01:30:27
Entonces todas tienen un toString.
01:30:32
Pero resulta que, ¿cómo quiero que me convierta?
01:30:35
fijaros, si de object tiene la clase
01:30:40
wrapper integer
01:30:43
el comportamiento que esté definido en la clase object para el método
01:30:44
toString, es decir, el código toString de la librería
01:30:49
de la clase object, intentará
01:30:52
convertir un integer a algo
01:30:55
pero ese mismo código, porque el código es único
01:30:58
tendrá el mismo toString
01:31:01
y ese mismo toString estará heredado para
01:31:03
en este caso mi clase finanzas.
01:31:07
También mi clase finanzas por herencia.
01:31:11
Vamos a poner un poco entrecomillado la herencia, porque es así, pero
01:31:16
la herencia tiene que ser simple, ya os contaré.
01:31:19
Pero bueno, por herencia, la clase finanzas tiene el método toString
01:31:24
y el comportamiento de los objetos de la clase finanzas
01:31:28
será el que esté definido en la clase object.
01:31:33
entonces convertir un objeto de la clase finanzas a una cadena de caracteres
01:31:35
cuando tiene estas características puede ser muy diferente a convertir a un string
01:31:41
un objeto de la clase integer
01:31:46
entonces que es lo que habrá hecho la clase integer con el toString que tiene heredado de object
01:31:48
pues lo habrá sobrescrito
01:31:54
para que el comportamiento del método toString
01:31:56
cuando esté relacionado con la clase grupper integer
01:32:06
no sea el que esté ya predefinido en la clase object
01:32:10
porque queremos que convertir un entero sea diferente
01:32:14
a lo que haga la clase object cuando esté intentando convertir
01:32:18
un objeto de la clase finanzas. Tanto la clase finanzas como mi clase
01:32:22
tanto la clase grupper integer como la clase finanzas
01:32:30
de inicio tienen un código común definido en la clase object
01:32:36
para el método to string como convertir en una cadena de caracteres un objeto de la clase
01:32:40
finanzas y un entero es diferente java nos permite sobreescribir el comportamiento veremos ahora como
01:32:46
otro día nos permite sobreescribir el comportamiento entonces si yo en la clase íntegras digo mira ya
01:33:00
deja de utilizar el código de la clase hoy es para tu string y utiliza el que yo te indico en
01:33:06
En la propia clase, el comportamiento que tendrá en la clase Integer será el propio sobrescrito.
01:33:13
Y si en mi propia clase no lo he sobrescrito, utilizará el de la clase Object.
01:33:19
Entonces, la clase Integer, para este entero, lo que hará será convertir a un string un número.
01:33:25
Pero la clase Finanzas, como no tiene aquí escrito el método toString, lo que hará será utilizar el único que tiene disponible, que será el de la clase Object.
01:33:32
De una forma o de otra, cualquiera de ellos devolverá un string y esos strings se concatenan aquí y nos los muestra por pantalla. Fijaros qué información me ha sacado. Me ha sacado un 5.
01:33:44
la clase toString de
01:34:00
el wrapper
01:34:04
integer ha hecho que esto
01:34:05
que es un número lo ha convertido en un string
01:34:07
y lo ha puesto ahí, lo ha concatenado
01:34:09
con una sass
01:34:11
luego ese info lo ha sacado que ya es
01:34:12
directamente un string, con lo cual me ha puesto aquí
01:34:15
hola, me ha puesto
01:34:17
aquí unos espacios y luego
01:34:19
fijaros que a
01:34:21
que es un objeto de la clase finanzas
01:34:23
no tiene definido aquí un toString
01:34:25
con lo cual habrá utilizado el heredado
01:34:27
de la clase object y me ha mostrado aquí que es un objeto de la clase finanzas y me ha puesto
01:34:29
aquí un identificador que probablemente tenga que ver con algo de una posición de la posición
01:34:36
de memoria que tengamos que tengamos donde tengamos donde tengamos reservado espacio
01:34:40
para este objeto igual que habíamos dicho que la que la clase integer que es una clase de
01:34:47
que está definido en las librerías de Java, tendrás sobrescrito el comportamiento de tu string para no utilizar directamente el de object y mostrar en un string el valor del número entero, tenemos la posibilidad de sobrescribir nosotros en nuestras propias clases el método imprimir, el método toString y cualquier otro.
01:34:57
bueno esto no es necesario, si ponemos aquí
01:35:16
public que devuelva un string
01:35:28
un método que sea el método toString
01:35:31
y ponemos aquí return que devuelva
01:35:33
una cadena de caracteres, vamos a poner aquí hola
01:35:43
estamos diciendo que para la clase finanzas
01:35:45
el método toString ya no queremos
01:35:51
que utilice el método, fijaros como aquí
01:35:54
dice está sobre escribiendo el toString
01:35:57
está sobre escribiendo el de object ya no queremos que utilice el de object es
01:35:59
decir cuando al sistema println pasemos un objeto de
01:36:04
la clase finanzas println utilizar el to string para convertir esto en una
01:36:10
cadena de caracteres si yo no tengo definido aquí un to string que es lo que
01:36:15
sucede que utilizará el único que tiene disponible que es el heredado de object
01:36:19
Y me mostrará algo de este estilo. Pero si yo lo sobrescribo aquí, estoy haciendo un ejercicio parecido al que decíamos que hacía la clase Grouper Integer para no utilizar el de Object y como consecuencia, en lugar de mostrarnos algo para el entero de este estilo, nos mostraba su valor numérico como una cadena de caracteres.
01:36:23
ahora estamos diciendo que la clase, el método toString de la clase finanzas
01:36:44
sobreescriba al toString de la clase object
01:36:48
como me dice aquí, fijaros, y me devuelva un string que sea hola
01:36:52
entonces siempre que ponga yo aquí ahora un objeto de la clase finanzas
01:36:56
fijaros lo que sucede, me muestra aquí un hola
01:37:01
¿para qué nos sirve esto? pues nos sirve para
01:37:06
identificar la forma en la que yo quiero que se vean
01:37:10
mis objetos de la clase finanzas cuando se integren en un
01:37:14
System of Println, mirad, en la clase persona
01:37:18
si yo pongo aquí un objeto de la clase persona, si lo meto aquí
01:37:24
en el System of Println, yo ahora ejecuto, y fijaros
01:37:49
ahora lo que me dice es, bueno, todo este
01:37:55
es todo esto, y para mi PER
01:37:58
como en la clase persona, al contrario de en la clase finanzas
01:38:02
no tengo sobre escrito el toString
01:38:07
hemos visto que todo objeto en mi programa
01:38:09
tiene un toString disponible, entonces si yo pongo aquí
01:38:13
miPerl.toString
01:38:16
fijaros que me dice, te devuelvo un string
01:38:17
y está definido en la clase Object, veis aquí como me indica
01:38:22
que lo está definido en la clase Object, y por qué utiliza el que está
01:38:25
definido en la clase Object, porque todo lo tienen disponible
01:38:28
pero aquí no lo he sobre escrito
01:38:31
ahora digo, bueno pues es que esto en realidad no me dice mucho
01:38:32
este toString, fijaros que desde la clase object no puede hacer nada
01:38:37
diferente a mostrarme el nombre de la clase y su posición de memoria
01:38:42
porque como es un código definido de forma común para
01:38:46
todos los objetos que podamos definir en nuestro programa
01:38:50
si no tienen sobre escrito el método toString
01:38:54
que podría la clase object definir allí en sus librerías cuando lo va
01:38:56
utilizar mi programa otro programa una clase de mi programa otra clase de mi programa cualquiera
01:39:02
no habrá habría infinitas combinaciones de clases que podrían llegar a estar utilizando ese código
01:39:09
claro yo pensando en mi programa podría decir mira yo lo que quiero que me identifique una
01:39:14
persona cuando yo lo ponga en el sistema printer en es que salga su nombre pero claro es que ese
01:39:19
código en la clase oye no puede poner un nombre porque en otro programa no hay personas hay
01:39:24
directamente mesas y las mesas no tienen nombre que tienen todos en común absolutamente todos
01:39:29
pues tienen que pertenecer a una clase que te la muestra aquí el tu string y que tiene una zona de
01:39:35
memoria reservada con un identificador entonces como eso sí que es común a todos si no lo has
01:39:40
sobre escrito en aquel código de la clase object lo que me muestra es esto si yo quiero que mi
01:39:46
clase tenga unas características particulares diferentes de esto que en línea general dice
01:39:52
poco pero es lo único común que podemos tener para definir en la clase object para todas las
01:39:56
posibles clases de todos los programas lo que puedo hacer es en cada clase sobre escribir el
01:40:01
método to stream para que tenga un comportamiento acorde al que yo espero que suceda cuando se llame
01:40:07
este método y lo meta en un sistema println qué es lo que hace la clase grúa perder las librerías
01:40:13
la clase grúa per íntegra pues tiene sobre escrito del método to stream para no utilizar
01:40:20
el de object y en particular en ese método
01:40:26
toString equivalente a este return hola que he puesto
01:40:29
lo que hace es fijarse en el numerito que tiene
01:40:32
el entero y devolver ese string, por eso me sale
01:40:35
aquí el 5. ¿Qué es lo que hemos hecho en finanzas? Pues mira
01:40:38
no nos hemos preocupado ni de la información que tiene por aquí finanzas y directamente
01:40:42
hemos dicho que cuando se meta en system.out.println
01:40:46
devuelva un string que sea un hola. ¿Qué es lo que
01:40:49
podemos coger de la clase persona? Pues aquí dependería
01:40:54
de lo que queramos nosotros
01:40:56
en nuestro enunciado, de nuestro ejercicio en particular, igual en un ejercicio
01:40:59
donde tenemos definido una clase persona, voy a sobre escribirlo
01:41:04
me interesa que de esa clase persona se muestre su nombre
01:41:09
pues en el método toString yo pongo
01:41:13
que haga un return de la variable nombre, como veis
01:41:17
entonces si ahora ejecuto aquí, bueno sale null
01:41:21
porque no le hemos asignado un nombre, vamos a asignarle un nombre
01:41:34
ponemos mi per
01:41:36
punto ese nombre
01:41:38
igual
01:41:40
mi per tiene como nombre noa
01:41:42
pongo aquí mi per
01:41:51
dentro del system of println, sabemos que
01:41:52
aquí voy a utilizar el toString, la clase
01:41:55
persona hemos dicho que devuelve al nombre
01:41:56
entonces yo ahora pulso aquí
01:41:58
y fijaros como me sale aquí noa
01:42:01
imaginamos que
01:42:03
en otro ejercicio decimos, es que el nombre
01:42:05
en realidad, en el contexto
01:42:07
del ejercicio anterior estaba bien que
01:42:09
apareciera el nombre, pero aquí lo trascendente, lo importante de las personas cuando salgan
01:42:10
un System of Println es la edad, entonces aquí podríamos poner por ejemplo
01:42:15
string SAUS
01:42:19
igual, mira, llamo al toString
01:42:21
de la clase WorkerInteger, le paso uniedad
01:42:44
con lo cual me va a devolver el número que tenga este, lo meto
01:42:49
en SAUS y aquí devuelvo SAUS, aquí estoy diciendo que
01:42:53
en el toString, cuando lo ponga en un sistema de println,
01:43:00
lo que me importa es que me devuelva
01:43:03
la edad
01:43:05
que tenga justo aquí.
01:43:07
Entonces aquí podríamos coger,
01:43:09
vamos a poner una edad,
01:43:11
a miper,
01:43:14
miper.iedad,
01:43:14
set y edad,
01:43:18
ponemos aquí 15.
01:43:19
Entonces ahora al ejecutar,
01:43:23
fijaros como ya me sale aquí
01:43:25
un 15, ¿por qué? Porque estoy devolviendo la edad.
01:43:26
Podríamos decir, pues,
01:43:31
en otro ejercicio lo que me interesa
01:43:32
lo que identifica es
01:43:35
podría ser el iValor que tenemos aquí
01:43:37
pero no, igual no es ni el
01:43:39
nombre, no es ni la edad, es una
01:43:41
combinación de los dos
01:43:43
entonces que podríamos poner aquí, pues podríamos poner que
01:43:44
ese aus, este string
01:43:47
que es el que estoy devolviendo aquí, fijaros
01:43:49
ese aus, sea
01:43:51
el nombre
01:43:54
imaginaos que con el toString queremos
01:43:56
poner que ese nombre
01:43:58
ese nombre tiene
01:44:01
fijaros aquí estamos cargando en ese aus
01:44:02
una concatenación
01:44:10
de tres strings, este utilizando
01:44:12
el toString por aquí, tiene
01:44:14
el valor de ese nombre, es lo que
01:44:16
devuelve el toString y es el que se utiliza
01:44:18
aquí en el System.out.println
01:44:20
entonces si ahora ejecutamos aquí
01:44:22
fijaros como dice noa tiene
01:44:24
15
01:44:26
en definitiva, ¿qué podemos poner aquí en el toString?
01:44:26
pues cualquier cosa que queramos
01:44:30
una combinación
01:44:32
de todo lo que tengamos por aquí
01:44:34
disponible y que sea
01:44:36
digamos la cara que va a dar una persona cuando se llame a su método
01:44:37
toStream que de forma automática se llama cuando lo incorporamos al system of println
01:44:41
si no tiene sobrescrita la clase
01:44:46
el toStream nos va a mostrar lo que veíamos antes, el único que tiene disponible
01:44:49
heredado desde la clase object, si utilizamos una librería de java
01:44:53
una clase de una librería de java, si lo tiene sobrescrito como la clase
01:44:57
wrapper integer, pues nos va a devolver el stream del entero
01:45:01
si es una clase propia
01:45:05
si no lo hemos sobrescrito
01:45:07
pues nos devolverá eso, si lo hemos sobrescrito
01:45:09
lo que nosotros hayamos devuelto
01:45:11
por aquí como un string, estamos
01:45:13
sobrescribiendo ese método toString
01:45:15
¿Sí? ¿Se entiende?
01:45:17
¿Por ahí más o menos bien?
01:45:29
Vale, pues
01:45:37
pues nada, yo creo
01:45:38
que vamos a parar ya por aquí, son las
01:45:40
7 y 20, el repaso
01:45:42
a lo que tenía apuntado por aquí
01:45:44
del tema 4, ya lo tenemos
01:45:46
volveremos sobre todo esto el tema 5 vuelvo a hablar de todas estas cosas así que bueno
01:45:48
pues aunque repasemos en otra tutoría volveremos a hacerlo y nada poco más que contaros por ahí
01:45:53
sí dime pero con un pad el vídeo si quieres yo creo la mejor forma es que puedas ver el vídeo
01:46:01
¿no? de nuevo quizás
01:46:23
¿no?
01:46:26
no, es que te lo digo porque
01:46:28
no es que sea un tesoro
01:46:29
esto que no quiera compartir con vosotros, ni mucho menos
01:46:31
de hecho está grabado, pero es que
01:46:34
si te lo pongo en un pad como
01:46:35
o sea, que sobre las mismas clases he ido poniendo
01:46:37
y quitando cosas, entonces
01:46:40
hemos perdido ya la traza de muchas de las
01:46:41
cosas que os he ido contando
01:46:43
entonces yo creo que, bueno, si te interesa algún
01:46:45
apartado así más en particular
01:46:47
como os voy a publicar el enlace
01:46:49
de la clase, pues la vuelves a ver y
01:46:51
ahí sobre la marcha lo puedes ir haciendo yo creo mejor
01:46:53
no sé si te parece
01:46:56
¿sí? vale
01:46:56
vale pues pues nada ya tengo la grabación
01:46:59
ya por aquí
01:47:04
- 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:
- 52
- Fecha:
- 9 de diciembre de 2024 - 19:23
- Visibilidad:
- Clave
- Centro:
- IES ALONSO DE AVELLANEDA
- Duración:
- 1h′ 47′ 06″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 209.07 MBytes