Saltar navegación

2024-11-04-Programacion - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 4 de noviembre de 2024 por Jose Manuel M.

80 visualizaciones

Scanner-nextInt, Casting de variables, Variables Wrapper, Método toString, Sobrecarga de métodos

Descargar la transcripción

Ya estamos grabando. Pues nada, ¿tenéis alguna cosilla por ahí que queréis que comentemos antes de repasar otras cosas por ahí? ¿Alguna duda que tengáis de lo que hayáis podido ver en el tema 2? 00:00:00
Este tema 2 es sencillo en principio, el tema 3 tampoco introduce así gran complejidad 00:00:14
Pero claro, es muy fácil decirlo si ya has programado antes, como es mi caso y el caso de muchos de vosotros 00:00:25
Por lo que he podido ver en las tareas, pero claro, para quien está empezando quizás sí que sea un nuevo mundo 00:00:31
Y necesite su tiempo para asentar los conceptos 00:00:37
En cualquier caso, no me habéis preguntado mucho por ahí por el foro, así que entiendo que algunos no habréis podido dedicar quizás el tiempo que os hubiera gustado y otros no habéis tenido dudas. ¿Alguna cosita queréis comentarme antes de arrancar? 00:00:43
Vale, pues mañana abrimos el tema 3 ya. El tema 3 introduce, digamos, normalmente cuando tenemos un proyecto, ya hemos hablado que arrancan nuestros proyectos, arrancan en una determinada clase. 00:01:01
en Java todos son clases en principio, voy a crear un proyecto 00:01:29
que se llame prueba y todo proyecto necesita tener un método 00:01:35
en una de sus clases que sea el método main, porque el inicio 00:01:44
de los programas, como hemos dicho ya, empiezan en ese método. 00:01:47
Es cierto que varias clases pueden tener un método main y 00:01:52
digamos tener diferentes puntos de entrada, bueno, pues porque 00:01:56
si queremos probar ciertas cosas en particular de una clase, podemos ponerle el método main 00:01:59
para probarla de forma individual, pero como proyecto 00:02:04
en su conjunto, lo normal es que haya un único método de este tipo, método main 00:02:08
para todo el proyecto y a partir de ahí, bueno, pues se empiece a llamar 00:02:11
a diferentes métodos o a quien vaya correspondiendo. 00:02:15
Se vayan creando objetos, todo lo que venimos hablando ya estos días y que continuaremos 00:02:19
a lo largo del curso. Entonces, cuando tú tienes 00:02:23
una, bueno, pues a partir del método main o en cualquier otra 00:02:30
sentencia, pues el código va 00:02:33
de forma secuencial ejecutándose de arriba a abajo. 00:02:36
Vamos a poner aquí clase print, voy a crear una clase. 00:02:41
La asignatura o 00:02:48
digamos cabecera de 00:02:50
un método, se suele llamar asignatura 00:02:53
como firma, firsignatur, del método 00:02:56
main es esta public static 00:02:59
void main 00:03:01
string 00:03:03
al s 00:03:05
todas estas palabras claves 00:03:09
aportan algo al método 00:03:13
y ya lo iremos comentando 00:03:15
a lo mejor hoy vamos hablando ya un poquillo de ello 00:03:17
aunque en temas posteriores 00:03:19
se va haciendo un desarrollo 00:03:20
se va haciendo una revisión de cada una de estas 00:03:22
etiquetas para lo que sirven 00:03:25
de la de static ya estuvimos hablando 00:03:27
estos días atrás 00:03:29
cuando vayamos haciendo algún ejercicio 00:03:30
redundamos un poquito en su 00:03:33
descripción y luego los métodos os decía cuando teníamos una clase en este caso la clase print 00:03:35
pues estaba compuesta por una serie de atributos que son características propias de todo objeto 00:03:43
que tenga que ver con esta clase y clase print bueno pues una clase que he creado para trabajar 00:03:49
en el proyecto pero típicamente pues sería como os decía la clase persona pues sus atributos serían 00:03:54
características particulares de toda persona todo objeto de la clase persona que fuéramos 00:03:59
construyendo como podrían ser en diferentes contextos serían diferentes atributos pero 00:04:05
bueno podría ser en este caso el nombre el apellido el dni todo este tipo de información 00:04:09
típica de las personas en un coche pues si fuera la clase coche pues los objetos de clase coche 00:04:14
con atributos podrían tener pues la cilindrada ser el motor tipo de motor marca bueno diferentes 00:04:21
características propias de los coches y luego decíamos que teníamos los métodos que son los 00:04:28
a los que invocamos, a los que vamos llamando 00:04:34
para que vayan realizando acciones. 00:04:37
Los métodos que tienen que ver con acciones 00:04:40
dentro del método tienen un ámbito, 00:04:43
una llave de apertura y cierre, que es 00:04:47
todo el ámbito donde trabaja el método y por aquí 00:04:49
iremos metiendo la secuencia de instrucciones 00:04:52
que se ejecutan cuando invocamos ese 00:04:55
método en particular. La ejecución de un método, 00:04:58
de todo método en Java, pues se hace de forma secuencial, va de arriba a abajo. 00:05:03
En esta asignatura vemos, el año que viene veréis una asignatura que es la asignatura 00:05:09
de programación de servicios y procesos, que permiten la ejecución de diferentes líneas de código 00:05:15
de forma paralela, aprovechando que las máquinas, los ordenadores, pues pueden tener varios procesadores, 00:05:21
pues decir, mira, si no es obligatorio tener los resultados de unas instrucciones anteriores 00:05:27
para ejecutar las siguientes, podemos dividir esas instrucciones en dos bloques 00:05:32
y que cada uno de esos bloques lo ejecute uno de los procesadores que tiene mi equipo. 00:05:37
De tal forma que ganamos ahí en velocidad de ejecución, en rendimiento de nuestro programa. 00:05:42
Para eso lo tiene que permitir el programa, no tiene que haber una obligatoriedad 00:05:49
de secuenciación de unas instrucciones con otras. 00:05:54
y bueno, esto sería una forma de trabajar en base a procesos o a hilos, pero bueno, si ya os digo que corresponde a la asignatura de programación de servicios y procesos que igual curséis el año que viene. 00:05:57
En esta solamente trabajamos con un procesador y va todo de seguido, con lo cual el método main, si tenemos aquí una instrucción 1, 00:06:09
instrucción 1, pues después de la instrucción 1, pues ejecuta la instrucción 2, luego la 3 y de esta forma secuencial una detrás de otra. 00:06:18
es decir, el flujo de programa por defecto es una instrucción detrás de otra 00:06:27
pero tenemos la opción de poder ejecutar un bloque de instrucciones 00:06:32
y que se repita o meter una condición en un momento dado 00:06:37
para que unas instrucciones se ejecuten o no 00:06:42
estas son las estructuras de control que vamos a ver en el tema que viene 00:06:45
y que muchos de vosotros en esta primera tarea 00:06:50
ya incluso habéis utilizado, bien porque las habéis investigado o bien porque tenéis ya cierta experiencia programando 00:06:55
y como son conceptos de inicio de todos los lenguajes de programación, pues ya más o menos lo conocíais. 00:07:02
Bien, esto es lo que vemos en el tema 2. En el tema 3, las secuencias de control condicionales, es decir, 00:07:10
Si pasa algo, se cumple una determinada condición, pues ejecuto una serie de instrucciones. 00:07:19
La A, la B, la C. 00:07:26
Si no pasa eso, si no pasa ese algo, pues podemos ejecutar otras instrucciones. 00:07:29
Entonces, en esa secuencia lineal del programa, de arriba a abajo, cuando llega aquí, 00:07:38
si esto es cierto, lo que se ejecuta son este primer bloque de instrucciones, pero estas no. 00:07:42
Y si eso no es cierto, estas no se ejecutan y las que se ejecutan serían estas otras. 00:07:47
Es decir, son instrucciones de control de selección. 00:07:53
Y luego están las instrucciones de control de repetición que vienen a ser mientras hay diferentes alternativas con la sintaxis, 00:07:58
pero mientras esté pasando algo, mientras un número sea menor de 10. 00:08:06
pues entonces ejecuto aquí una serie de instrucciones 00:08:13
las que pongamos 00:08:16
y se va repitiendo 00:08:17
normalmente dentro de este código 00:08:20
se producirá algún cambio 00:08:23
para que esto no se convierta en un bucle infinito 00:08:25
y se quede el programa eternamente aquí 00:08:27
imaginaos que la condición es una variable de tipo entero 00:08:29
mientras la variable S sea menor de 10 00:08:32
entonces aquí típicamente podríamos tener que 00:08:35
esa variable va incrementando su valor 00:08:38
de uno en uno, de dos en dos, bueno, según el algoritmo nos lo requiera 00:08:42
y tras una serie de pasadas, como esto va cambiando su valor x, 00:08:47
pues habrá un momento en el que dejará esto de ser cierto 00:08:54
y dejará de producirse la repetición. 00:08:56
En ese caso, este bloque que está relacionado con este bucle, 00:08:58
esta estructura de control repetitiva, terminaría y el programa seguiría por aquí. 00:09:03
Bueno, sobre esto trabajaremos. 00:09:11
tenemos, me parece que son dos o tres semanas para este segundo tema 00:09:12
y los conceptos, aunque son imprescindibles de manejar bien 00:09:16
porque en todos los programas nos van a aparecer estructuras de control 00:09:20
de estos dos tipos, yo creo que se cogen más o menos rápido 00:09:23
entre que repasamos los conceptos y luego hagamos ejercicios 00:09:28
pues lo tendremos ahí resuelto. 00:09:31
Probablemente hablemos de esto la semana que viene 00:09:37
o no sé si hay un poquito, si luego nos apetece 00:09:38
antes de arrancar el tema. 00:09:43
¿Cosas del tema 2 que quedaron por comentar? 00:09:45
Pues bueno, en verdad pocas, ¿no? 00:09:49
Sí que he visto, bueno, las prácticas, los que habéis tenido la oportunidad del ratillo para poder hacerlas y entregarlas, 00:09:51
estaban bastante bien en líneas generales. 00:09:58
Es cierto que todavía no tenían mucha complejidad la práctica de este tema. 00:10:00
Y bueno, simplemente comentaros al menos un par de cosas. 00:10:05
cuando hablábamos en las 00:10:08
tutorías anteriores que nuestros programas los comunicamos 00:10:12
con el mundo exterior a través de flujos de datos 00:10:15
y teníamos estos flujos de datos 00:10:18
decíamos que había tres flujos de datos estándar, ahora 00:10:21
los retomamos y luego podíamos habilitar otro tipo de 00:10:24
flujos de datos para comunicación entre aplicaciones como 00:10:27
podían ser los sockets, un flujo de datos para leer 00:10:30
información o escribir información en ficheros 00:10:33
pues ahí abrimos también un flujo de datos, una tubería 00:10:36
desde nuestro programa, cuyo destino en este caso 00:10:39
si vamos a escribir es un fichero y la lectura 00:10:41
pues el origen de los datos sería el fichero y el otro lado 00:10:45
de la tubería del flujo de datos se enchufa 00:10:48
en nuestro programa. 00:10:51
Cuando es un socket, pues un lado de la tubería está enchufado 00:10:54
en nuestro programa y el otro lado en otro programa diferente. 00:10:57
Al final es un caminito por el cual trasladamos información 00:11:00
a nuestro programa desde el mundo exterior. 00:11:03
Y por defecto, os decía el otro día que se habilitan 00:11:07
tres flujos de datos en todos los programas, 00:11:10
que son el STDIN, el STDOUT y el STSTANDARDERROR. 00:11:13
El STDIN está asociado, los tres tienen uno de los lados 00:11:25
de la tubería enganchado en nuestro programa 00:11:30
y el otro, en el caso del STD in en el teclado, el STD out en pantalla y el STD air en pantalla. 00:11:32
Java tiene medios para poder enchufar el otro extremo, el que no está conectado a nuestro programa, 00:11:43
de cualquiera de estos tres flujos, digamos a otro elemento que no sean los que tienen considerados por defecto, 00:11:49
pero en principio, bueno, no nos interesa. 00:11:57
Junto a los flujos de datos que se activan por defecto, 00:12:01
existen, bueno, se te di en System Name, ¿no? 00:12:04
System Name, ¿no? 00:12:08
Vale, junto con los flujos de entrada, 00:12:11
pues tenemos una serie de librerías. 00:12:15
Y estas librerías en Java, lo que nos proporcionan, 00:12:17
en nuestros programas, decíamos dos días atrás, 00:12:20
que están compuestos por las clases que nosotros desarrollamos, 00:12:23
que en principio buscarán dar respuesta, tendrán los elementos principales para dar respuesta al algoritmo que queremos resolver 00:12:26
y junto a nuestras clases sobre las que trabajamos nosotros directamente incluimos otras clases que Java ha desarrollado para nosotros 00:12:34
y que las tiene en librerías. Las librerías de Java ya tienen por ejemplo desarrolladas clases que nos facilitan cómo poder acceder 00:12:44
a la información desde teclado, de este flujo de datos. 00:12:54
Entonces, el hecho de tener esa posibilidad nos permite que simplemente 00:12:59
llamando a esas clases, a sus métodos y a sus parámetros, podamos tener 00:13:04
un mecanismo sencillo y no tengamos que hacer nosotros ese desarrollo 00:13:08
por completo. Una de esas clases, en particular, para acceder, para leer 00:13:12
información desde flujos de datos externos, podría ser desde el teclado, 00:13:17
desde System.in o podría ser desde un fichero, pero para 00:13:22
inyectar, digamos, información en nuestro programa, en la clase Scanner. 00:13:26
Habíamos hablado el otro día de ella. Vamos a hacer un mini repaso y 00:13:33
aprovecho para comentaros algo que os he puesto 00:13:36
en los comentarios de las tareas alguno. Entonces, 00:13:38
y como siempre, nos vamos parando muy poco a poco 00:13:49
en cada instrucción y vamos repasando un poco conceptos 00:13:57
de los que tenemos en este tema. 00:14:01
Mirad, directamente en cualquiera de nuestros programas, 00:14:04
junto a nuestras clases, tenemos importadas, 00:14:08
es decir, tenemos ya disponibles sin necesidad de informarlo 00:14:12
de forma explícita, como estamos haciendo aquí para Scanner, 00:14:17
todas aquellas clases que pertenecen al paquete JavaLang. 00:14:20
Es decir, hay una serie de cosas en un paquete que es el JavaLang 00:14:26
desarrolladas y como son de uso tan común, dicen 00:14:30
mira, lo vas a tener disponible sin necesidad de importarlo. Y luego existen 00:14:34
muchas otras clases que están en otros paquetes. 00:14:37
Muchas también se utilizan habitualmente, aunque no 00:14:42
con tanta frecuencia como pueden ser las de Java Lang. Es el caso 00:14:46
de la clase Scanner. La clase Scanner se encuentra en el paquete Java 00:14:50
útil. Entonces, si nosotros por defecto no ponemos aquí este import, 00:14:54
Scanner se nos queja. Dice, oye, la clase Scanner no la conozco. 00:14:57
¿Por qué? Porque no la tengo definida en mi proyecto y tampoco es 00:15:02
de aquellas clases que están importadas de forma 00:15:06
estándar, de forma directa. Entonces, para poder utilizarla 00:15:09
tengo que identificarla en mi programa y avisarle al programa 00:15:14
que, oye, mira, quiero utilizar la clase Scanner en particular del paquete 00:15:18
JavaLang. Y a partir de ese momento, en ese paquete, tiene definida esta clase 00:15:22
y ya me deja hacer uso de ella. 00:15:25
Esta instrucción, ¿qué es lo que estamos haciendo? 00:15:29
Pues mirad, de una clase existente ya en mi programa, 00:15:32
aunque no la he codificado yo, 00:15:35
defino un objeto. 00:15:37
Recordad, las clases en sí vienen a ser un esquema 00:15:41
de cómo se comportarían los objetos. 00:15:44
La clase persona, en principio, 00:15:47
no es ninguna persona en particular. 00:15:49
Es el esquema de aquellas características 00:15:52
que van a tener aquellos objetos de la clase persona que definamos 00:15:54
como parámetros, definidos como parámetros, y los métodos que van a ser 00:15:57
cómo se van a comportar aquellas personas a las que demos vida 00:16:01
en nuestro programa a través de distanciarlas. 00:16:04
Pues es lo mismo que sucede aquí. Scanner, en principio, 00:16:07
es el esquema de una clase. Es una clase y tendrá un esquema 00:16:10
de parámetros y métodos disponibles. 00:16:13
En sí, para utilizar algo de Scanner, necesito definir un objeto. 00:16:16
Y este objeto ya sí que es algo que cobra vida en mi programa y que se instancia de acuerdo a esta clase. 00:16:20
Si definimos mi scan así, directamente con punto y coma, sin hacer el resto de esta instrucción, 00:16:32
lo que vendría a ser es, como un dedito, un puntero que señala hacia un objeto de la clase Scanner, 00:16:38
Pero no sería el objeto en sí. ¿Por qué? Porque necesito solicitar al sistema operativo espacio en memoria RAM y recursos para que este objeto pueda participar activamente en mi programa. 00:16:46
Entonces, eso lo hago con la palabra reservada new. Entonces, aquí ya sí que el programa le solicita al sistema operativo ese espacio para que haga todas las reservas necesarias para el objeto MyScan, que es de este tipo de clase. 00:16:59
Y después de este new siempre aparece aquí algo que si os fijáis está entre paréntesis, entonces los paréntesis hemos venido diciendo que cuando hablamos de una clase corresponden a los métodos, tenemos los parámetros que definimos más los métodos. 00:17:16
Fijaros, main, un método, en este caso de la clase print, está entre paréntesis. 00:17:35
Entonces, esto es un método definido en la clase scanner. 00:17:44
Si os fijáis, en particular, este método tiene el mismo nombre exactamente que la clase. 00:17:48
Entonces, estos métodos se llaman métodos constructores. 00:17:53
Es el constructor, un constructor de la clase scanner. 00:17:56
Y estos métodos, los constructores, se suelen utilizar o están pensados para ser utilizados en la inicialización del objeto. Entonces, fijaros que junto al momento en el cual definimos el objeto, hacemos la reserva de memoria y llamamos a un constructor que inicializará, según el código que tenga, este objeto de la clase Scanner. 00:18:00
Luego, tenemos aquí que otra de las características que tenemos en la programación orientada a objetos, aprovechamos fijaros en cada línea para hablar un poco de todos los conceptos y hacer un repaso, otra de las características que tenemos en la programación orientada a objetos es la sobrecarga. 00:18:25
Sobrecargar viene a decir que, digamos, reutilizar algo para que tenga diferentes funcionalidades. 00:18:45
Podríamos pensarlo de esta forma. Entonces, fijaros, podemos coger y tener sobrecargados operadores. 00:18:56
En otras clases hablábamos, por ejemplo, el más. El operador más, dependiendo de lo que se encuentre 00:19:06
a la izquierda o a la derecha, hace diferentes cosas. 00:19:12
Si se encuentra una variable numérica a la izquierda y a la derecha, 00:19:16
lo que hace es sumar dos números. 00:19:19
Si se encuentra un 3 y un 5, lo que hará será dar como resultado 00:19:21
hacia la izquierda de esta suma, es una suma típica de números, un 8. 00:19:26
Pero si lo que tenemos son dos cadenas de caracteres, 00:19:31
Que las cadenas de caracteres, recordadlas, encerramos entre dobles comillas. 00:19:34
Lo que hace es concatenarlas. Lógicamente AA más WWW no tiene ningún sentido. 00:19:50
Entonces esto lo que devuelve hacia la izquierda es otra cadena de caracteres que sería de este estilo. 00:19:56
Es decir, el operador más está sobrecargado y tiene diferentes comportamientos dependiendo de lo que se encuentra a derecha e izquierda. Java permite la sobrecarga de operadores, como estamos comentando, pero no permite, este lenguaje en particular, crear nuevas funcionalidades para un operador, cosa que sí sucede en otros lenguajes de programación. 00:20:02
podríamos definir nuevos comportamientos y lo que te encuentras a la izquierda es algo en particular 00:20:23
que el más haga una cosa diferente de las que tiene preestablecidas por defecto para lo que 00:20:27
esté programado hasta ahora java no lo permite está sobrecargado los operadores pero no permite 00:20:33
sobrecarga definir tus sobrecargas para operadores pero en cambio si lo permite para métodos entonces 00:20:39
imaginaros que aquí en clase principal tuviésemos un método que es public void saludar 00:20:45
Y aquí ponemos un System, Intel N. 00:20:57
Bueno, aquí tendríamos un método que es una de las acciones 00:21:16
que es capaz de hacer todo objeto de la clase, clase print. 00:21:19
En particular, si llamamos para un objeto de la clase print 00:21:24
al método saludar, lo que hará será sacar por pantalla un hola. 00:21:27
Si ponemos aquí el método saludar de nuevo para que saque un hola 2, 00:21:31
fijaros cómo ahora ya no le gusta. 00:21:40
nos deja de compilar aquí, veis que se ha puesto los dos saludar en rojo 00:21:42
y aquí me avisa, que es lo que sucede, que si yo ahora cojo 00:21:46
y llamo a un objeto de la clase print 00:21:49
vamos a definir un objeto de la clase print, mi objeto 00:21:54
hacemos un new, si yo ahora hiciese 00:21:59
esto, mi off y pusiera aquí saludar 00:22:12
este objeto intentaría saludar, pero resulta que en mi código 00:22:14
hay dos opciones, es decir, no se puede ir a una de ellas 00:22:20
de forma particular. No sabe si ejecutar esta parte del código o esta 00:22:24
cuando le digo saludar. Con lo cual, ante esta discrepancia, me dice 00:22:28
esto no es posible, no dejo que compiles. Y eso que los dos métodos 00:22:32
reciben el nombre saludar. Existe la posibilidad de sobrecargar 00:22:36
el método saludar si aquí dentro de los paréntesis 00:22:40
meto algo diferente. Entonces, aquí le estoy diciendo 00:22:44
un método saludar con los parámetros en blanco y aquí podría poner 00:22:48
por ejemplo un string ssal 00:22:52
entonces fijaros como ya si que me compila, ya se ha quitado 00:22:55
el error, el hecho de que se quite el error quiere decir que si yo ahora 00:23:00
llamo a mi og y llamo a saludar sin nada entre los paréntesis 00:23:04
no hay lugar a dudas entre si quiero ejecutar este o este 00:23:08
porque cual de los dos es el que no tiene nada entre los paréntesis, este verdad 00:23:12
En definitiva, me pondría hola. Si yo ahora cojo y pongo mi obj.saludar, fijaros, este tiene la posibilidad de recibir aquí una variable que es de tipo string. 00:23:16
¿Veis? Entonces aquí le podría pasar yo una variable de tipo string o un string. Voy a poner hola desde main. Entonces si yo llamo a este, está claro que durante la ejecución, en el momento de ejecución, sabe si llamar a este saludar o llamar a este otro. 00:23:33
¿Por qué? Porque el único que recibe una cadena de caracteres es este segundo saludar, con lo cual este otro, la ejecución que haría sería esta. 00:23:53
Entonces esto, como el método en ambos casos se llama saludar, se entiende que ese método está sobrecargado y tiene comportamientos diferentes en función de los parámetros de entrada que tenga el método. 00:24:03
estos parámetros de entrada se pueden utilizar como variables internas dentro del método esto ya hablaremos de ello pero bueno os voy contando cosas aunque luego lo volvamos a contar fijaros aquí podemos poner un system of println de ese sal y mirad si aquí definimos un string para que tengáis toda la jugada ponemos aquí variable interna podríamos poner un system of println de esta otra variable 00:24:14
Mira, si repasamos este código, ¿qué es lo que haría? Bueno, tenemos aquí el escáner y luego vamos a empezar a hacer estas cosas para hablaros de la sobrecarga y que entendáis por qué este tiene algo aquí en la llamada. 00:24:49
Esta llamada es equivalente a esta otra. ¿Por qué? Porque es un método constructor que en particular es capaz de recibir como parámetro un flujo de datos, igual que este es un método, en este caso no es constructor, es el método saludar, que es capaz de recibir como parámetro una cadena de caracteres. 00:25:08
ahora retomamos lo del escáner que os iba a contar 00:25:33
pero vamos a terminar de ver esto que os estaba poniendo 00:25:36
por aquí, la secuencia del programa 00:25:39
aquí definiríamos un flujo de datos al teclado 00:25:42
que en principio en este código no estamos utilizando 00:25:45
después, pero bueno, ahí está 00:25:48
luego definimos un objeto, miog, de la clase print 00:25:50
le pedimos al sistema operativo 00:25:54
que haga las reservas necesarias para que miog 00:25:57
tenga sus espacios de memoria y sus recursos 00:26:00
para ir trabajando, llamamos a un método, fijaros que es un método 00:26:03
como os digo, en este caso se llama igual que la clase 00:26:07
con lo cual es un método constructor, que nos serviría 00:26:11
para meter cosas de inicialización a este objeto 00:26:16
si no lo hemos construido, se crea uno por defecto que hace poca 00:26:19
cosa, pero bueno, para poder hacer el new de un constructor 00:26:23
aunque no lo tengamos nosotros puesto aquí en el programa, y luego para ese objeto 00:26:28
hemos hecho una sobrecarga del método saludar, definiendo 00:26:31
dos veces ese método, como veis, y está 00:26:36
sobrecargado, porque es el mismo método, en ambos casos se saluda 00:26:39
y nos permite la compilación porque hemos puesto en su 00:26:44
asignatura, en su cabecera, la diferencia 00:26:47
en tanto en cuanto tiene parámetros de entrada diferentes, este no recibe ningún 00:26:51
parámetro de entrada y este recibe uno. Por aquí, no hay 00:26:55
lugar a dudas a qué método saludar llamamos al no pasarle parámetros con lo cual se ejecutaría 00:26:59
este hola y cuando llamemos a este tampoco hay lugar a dudas porque estamos llamando al que 00:27:04
tiene una cadena de caracteres de entrada con lo cual correspondería a este fijaros si aquí 00:27:09
pusiésemos mi op punto saludar y decidimos pasarle algo diferente a que este vacío o a que sea una 00:27:16
cadena de caracteres, ponemos aquí un número, un 1, pues ya este se queja, dice mira, sé que quieres 00:27:26
llamar a un método saludar, tengo conocimiento de que lo tienes sobrecargado, pero justo no has 00:27:32
hecho una sobrecarga en la cual se reciba como parámetro de entrada un número, con lo cual este 00:27:39
no te lo acepto. Si quieres poder llamar a un método saludar en el cual se recibe un número 00:27:44
entero, tendrás que definirme el método sobrecargado que tenga como parámetro de entrada un entero. 00:27:51
Este lo quitamos de momento y cuando llamamos a este fijaros lo que pasa. El código viene por aquí, la secuencia del código vendría, haría esto, haría este saludar, haría un paréntesis aquí en el main y se vendría a ejecutar esto, ejecutaría todo el código del método y a la que termina volvería por aquí y continuaría con la secuencia de instrucciones que tenemos en el main. 00:27:58
luego llamaría a este otro y se pondría a ejecutar todo este método main 00:28:22
al ejecutar este método main estamos definiendo una variable 00:28:26
sbar int, la hemos dado un valor inicial de variable interna 00:28:31
sacamos por pantalla un literal 00:28:35
con lo cual pondrá holador directamente, sacamos por pantalla 00:28:39
la información que tiene sbar int 00:28:43
con lo cual es previsible que nos va a decir hola var interna 00:28:46
Y luego sacamos por pantalla la información que tiene una variable, ese sal, que justo es la que hemos recibido aquí como parámetro. 00:28:50
Y en esta variable lo que se carga es justo el valor que le hemos puesto aquí en la llamada. 00:29:00
Con lo cual, en el momento de llamarlo, ese sal cogerá el valor que le estemos pasando aquí en la llamada como parámetro. 00:29:07
Con lo cual, ese sal valdrá hola desde main. 00:29:14
mirad, si hacemos aquí una ejecución 00:29:16
pues nos dice 00:29:20
un hola, que corresponde a este 00:29:22
hola, cuando llega por aquí 00:29:24
me muestra 00:29:26
este hola 00:29:28
luego llama a saludar2 00:29:29
que nos muestra un hola2 00:29:31
nos muestra la información 00:29:34
de ese var interna, hola var interna 00:29:36
veis, y luego 00:29:38
hola desde main, que es la información 00:29:40
que tiene ese sal, porque se ha 00:29:42
cargado hola desde main aquí 00:29:44
Si hiciéramos otra llamada a este mismo método, cambiando la información de la cadena de caracteres que pasamos como información en el parámetro, si le damos otra ejecución nueva, fijaros cómo nos muestra este hola primero, que corresponde a esta llamada. 00:29:45
luego llama este y nos dice 00:30:08
hola2 00:30:11
la información que tiene la variable interna 00:30:13
que es lo siguiente que mostramos es hola var interna 00:30:17
ese sal y en esta primera llamada es 00:30:19
hola desde main y luego en la segunda 00:30:22
llamada volvemos a mostrar hola2 ese var interna 00:30:26
y en esta ocasión ese sal 00:30:29
dice hola desde main2 pues concepto de sobrecarga 00:30:31
concepto de sobrecarga y ver 00:30:36
la posibilidad de pasar parámetros 00:30:41
a un método, este caso es el método 00:30:43
constructor, pero podría ser 00:30:45
cualquier otro método de los que tengamos 00:30:47
definidos, como por ejemplo el método saludar 00:30:49
si os surge en duda 00:30:51
me vais parando, me vais diciendo 00:30:56
si no yo os sigo contando 00:30:57
pues 00:30:59
hablado un poquito de eso, seguimos con 00:31:02
lo que os iba a comentar del escáner 00:31:05
disculpad, vale pues aquí 00:31:07
Lo que hemos hecho, haciendo un repaso de esta instrucción, ha sido crear en definitiva un objeto MiSCAN. 00:31:11
Y le hemos dicho que el otro lado de la tubería se conecta a System.im, que hemos comentado que es uno de los flujos de entrada estándar, que es el teclado. 00:31:17
Para que en el programa nos salga algo por pantalla cuando nos pide información, podemos poner un System.out. 00:31:27
Dime un valor numérico. 00:31:45
Mira, antes os he dicho, en Java son todo clases, siempre son todo clases. Para trabajar con un objeto, para llamar a métodos, la norma general es crear un objeto. ¿Por qué? Pues como hemos hecho antes con la clase, clase print, que hemos creado un objeto y luego hemos llamado a los diferentes métodos saludar que estaban sobrecargados. 00:31:50
cada vez que creamos un nuevo objeto 00:32:24
se hace con el new, se hace una reserva de memoria 00:32:27
para las variables de ese objeto y se llaman a una serie de métodos 00:32:31
que están particularizados para ese objeto, es decir, cada uno 00:32:36
tiene cada nuevo objeto, si pensamos en la clase persona 00:32:39
si creamos la clase persona per1 new persona 00:32:44
pues cada per1 tendrá su espacio de memoria donde podremos 00:32:47
a guardar su nombre, su edad y podremos llamar a unos métodos 00:32:51
que son particulares suyos. Si aclaramos la clase persona 00:32:55
per dos, pues al hacer el new en otro espacio de memoria 00:32:59
de la RAM, reservaremos un trocito en el cual 00:33:03
podremos guardar su nombre, su edad, los parámetros que hayamos definido 00:33:07
en ese proyecto para la clase persona. 00:33:11
La semana pasada ya os hablaba de la etiqueta static. 00:33:15
La etiqueta static lo que hacía era que los parámetros y los métodos, en este caso está aplicado al método main, los parámetros y los métodos que definamos como estáticos, en lugar de ser particulares de cada objeto y tener una copia para cada uno de los objetos que definamos, 00:33:19
Por ejemplo, como decía, el objeto per1 de persona tendrá un espacio para su nombre y sus apellidos y su DNI y el objeto per2 de la misma forma. Si definimos algún parámetro o algún método de forma estática, eso es común para todos los objetos que pertenezcan a esa clase. 00:33:40
Es decir, que si modificamos el espacio de memoria es único correspondiente a la clase y en un espacio de memoria diferente para cada uno de los objetos. 00:34:00
¿Qué es lo que sucede aquí? Fijaros, println tiene pinta de ser un método, ¿verdad? Porque está aquí entre paréntesis. 00:34:10
un método que recibe un parámetro alfanumérico, pero para utilizar println en nuestro código por aquí no hemos instanciado un objeto de ninguna clase, 00:34:19
directamente lo hemos llamado. ¿Por qué sucede esto? Pues porque el método println, en primer lugar, system.out pertenecerá a la clase java.lang, 00:34:31
porque no hemos necesitado importarlo. 00:34:43
Y en segundo lugar, hemos llamado a println un método 00:34:46
sin haber instanciado, sin haber hecho un new de ningún objeto. 00:34:48
¿Eso por qué es? Porque println está definida 00:34:52
en las librerías de Java, en particular 00:34:55
la librería java.lang está definido como un método 00:34:58
estático, con lo cual podemos poner el nombre de la clase 00:35:01
que es out del paquete system 00:35:04
y utilizar directamente el método sin haber instanciado 00:35:06
nada. Puedo ir fijando conceptos del estático y ir entendiendo cada una de las líneas que vamos 00:35:10
poniendo. Bien, pues entonces aquí podríamos definir una variable int y valor. Y valor, volvemos a repasar 00:35:17
conceptos del otro día. Y valor es una variable de tipo int. Hay una serie de tipos de datos que son 00:35:29
los tipos de datos primitivos de Java. Estos tipos de datos dan un pasito más allá y para hacer la 00:35:35
reserva de memoria RAM en la cual se van a guardar estos, es un tipo 00:35:43
de datos primitivo. Entonces, para hacer la reserva de memoria RAM 00:35:47
no necesitamos, como en los referenciados, hacer el new para solicitarse 00:35:50
al sistema operativo. Directamente, a la hora de definir un tipo 00:35:55
de datos de los primitivos, que son el int, el long, el float, todos estos, 00:35:59
ya se hace esa reserva de memoria, donde se va a guardar 00:36:04
la información. Y aquí ponemos mi scan, 00:36:07
ponemos un igual por aquí 00:36:11
igual miScan 00:36:15
punto, entonces decimos que 00:36:22
esta variable, hacemos una lectura de derecha 00:36:26
a izquierda, a esta variable se le va a asignar 00:36:28
lo que pongamos por aquí 00:36:30
devuelva hacia la izquierda 00:36:32
miScan es un objeto de la clase Scanner 00:36:34
y tiene un montón de métodos 00:36:36
por aquí 00:36:38
este es un objeto 00:36:38
que tiene a su disposición todo 00:36:41
método que esté definido en el esquema 00:36:43
de la clase Scanner 00:36:46
y entre ellos, pues fijaros, tenemos un 00:36:47
si lo seleccionamos aquí nos dice que busca el siguiente token de una entrada que sea de tipo entero 00:36:49
entonces utilizamos nesynth, en principio esto leerá un entero desde el flujo de entrada que hayamos definido 00:36:58
para mi scan, objeto de la clase scanner, que en particular en el constructor le hemos dicho que sea system.min 00:37:07
con lo cual sabemos que es el teclado, si nosotros hacemos aquí un system.out.print 00:37:12
el n de y valor 00:37:19
si ejecutamos ahora, se me queda aquí, dime un valor numérico porque me ha mostrado 00:37:22
esto, el programa no ha continuado porque se ha quedado aquí esperando hacer esta 00:37:32
lectura, si yo ahora pongo aquí un 4, este 4 lo he escrito yo con 00:37:36
el teclado, doy enter, pues fijaros, carga el 4 00:37:40
aquí, me lo muestra por pantalla y ha ido todo correcto 00:37:44
lo que pasa es que cuando nosotros, si estamos haciendo con 00:37:47
escáner una lectura desde teclado si nosotros ponemos un 4 y enter lo que estamos haciendo es 00:37:52
meter digamos dos caracteres uno que es el 4 y otro el carácter así no me acuerdo qué número es 00:37:58
que es el enter o incluso el ente a lo mejor son dos son retorno de carro y nueva línea en 00:38:05
definitiva para que esto siga adelante hemos metido el 4 y el ente y éste en el sindh me 00:38:11
se encarga de coger el número entero, el 4 00:38:18
y el enter no le preocupa tanto. Entonces fijaros, 00:38:22
imaginaros que nosotros estuviésemos aquí en nuestro 00:38:26
programa lo siguiente. Queremos coger un valor entero 00:38:30
y decimos system out, println 00:38:34
dime tu nombre. 00:38:42
Porque queremos coger un valor entero, imaginaos en lugar de un valor 00:38:50
numérico dime tu edad y luego dice dime tu nombre dice pues mira la edad la vamos a con un es ind y 00:38:54
el nombre vamos a definir una variable de tipo string ese nombre y aquí cogemos y hacemos un 00:39:01
scan y aquí para el nombre bueno pues queremos una línea porque podemos poner un nombre con varias 00:39:11
palabras pues hacemos un es line vale pues parece que tiene sentido que aquí cogemos y decimos vamos 00:39:16
a meter de edad 18 años 18 y luego cuando me pida el nombre vamos a poner un nombre que sea noa por 00:39:26
ejemplo y luego ya una vez que tengo todos los datos vamos a coger y vamos a sacar el resultado 00:39:34
aquí ese nombre que me diga primero la edad me escriba por pantalla la edad y luego el nombre 00:39:42
Aquí ponemos edad, utilizamos el operador más para concatenar y nombre. Entonces fijaros, si yo cojo ahora y le doy aquí a ejecutar esto, dice dime tu edad, voy a poner que tiene 18 años y le doy enter y fijaros lo que pasa. 00:39:48
que me ha mostrado nombre y me lo ha mostrado 00:40:14
en blanco, que es lo que ha sucedido 00:40:17
cuando yo he puesto 00:40:19
aquí 18 y le he dado enter 00:40:21
el 18 me lo ha cargado en iValor 00:40:23
el enter no me lo ha considerado 00:40:25
ha escrito dime tu nombre 00:40:27
en el siguiente nestline 00:40:31
ha considerado el enter pero el enter 00:40:33
que había metido cuando he puesto el 18 del 00:40:35
nesint, con lo cual ha cogido 00:40:37
un enter, aquí ha cargado algo vacío 00:40:39
y cuando ha mostrado nombre 00:40:41
no me ha puesto ningún dato 00:40:42
aquí es muy lineal y se ve claro, pero si en diferentes partes 00:40:44
del programa estuviera este código, hubiera muchas líneas 00:40:52
entre medias o incluso un bucle que parece que te lleva a otra zona de código 00:40:56
a verlo o la llamada a una función o algo de eso 00:41:00
podríamos perder de vista que es esto lo que está pasando y es un típico 00:41:03
error que para darte cuenta que el problema es que el enter de este 00:41:08
es el que está leyendo aquí, cuesta a veces 00:41:12
y te puede volver loco puedes revisar el programa mil veces y parecerte que está correcto qué 00:41:16
soluciones tenemos pues como si queréis mantener utilizando el nes int porque alguien le gusta 00:41:22
mucho en la práctica no se daba este error pero como yo lo conozco ya otras veces pues os lo he 00:41:28
advertido en los comentarios de la práctica y os lo lo refiero aquí una de las posibilidades que 00:41:33
podríamos tener aquí es poner hacer un es line aquí me va a leer el número y aquí va a leer el 00:41:38
enter pero en realidad después de la lectura como no se lo estoy asignando a nadie por aquí es como 00:41:50
que no pasa nada entonces esto con esto limpiaría el enter del nes int y luego ya se me quedaría 00:41:55
aquí porque no he introducido dos enter cuando meto la edad de si yo ejecuto esto ahora dice 00:42:04
dime tu edad. Y digo 18. Y ahora dice dime tu nombre. ¿Veis que no ha ido 00:42:11
todo de corrido? ¿Por qué? Porque el enter del nesin lo he limpiado aquí. 00:42:15
Y ahora pongo aquí noa. Voy a enter 00:42:19
y ya lo coge bien. Aquí carga noa. Ya me dice la edad y el nombre. 00:42:23
Esa sería una alternativa. Limpiarlo haciendo un nesline 00:42:27
para quitar ese enter que en realidad está asociado con el número que hemos metido 00:42:31
desde teclado. Y otra de las opciones, yo no la suelo utilizar más 00:42:35
pero bueno, si tenéis cuidado para que no os pase 00:42:41
pues vale cualquiera y si no se da esta situación 00:42:44
pues vale con que lo leáis con un Synth 00:42:48
y la otra opción es hacer siempre 00:42:50
aquí un Sline, es decir, cogerlo 00:42:54
siempre como una cadena de caracteres 00:42:57
claro, una cadena de caracteres nos recoge 00:43:02
el valor como un String, vamos a crear una variable 00:43:11
auxiliar y ahora en sí 00:43:15
aquí lo que haríamos sería coger el número, pero 00:43:22
si metemos un 18, en realidad 00:43:26
estaría cargando el 18, pero lo estaría cargando de esta forma, porque lo estamos cargando 00:43:31
en una cadena de caracteres, en un string. Y lo que 00:43:35
queremos, finalmente, para luego operar con ello, en el ejercicio es 00:43:39
un valor entero, el que nos vale a partir 00:43:42
de aquí es este y no este, que es el que hemos cargado desde el 00:43:47
next line. Entonces aquí lo que vamos a utilizar es la clase 00:43:50
integer, parseInt, que recibe como parámetro 00:43:54
una cadena de caracteres, que es la variable 00:44:02
en este caso que tiene el número de esta forma, como cadena de caracteres, y lo que 00:44:06
hace es convertirlo a una variable de tipo entero, devuelve 00:44:10
una variable de tipo entero, con lo cual ya tendríamos aquí el iValor. 00:44:14
Aquí no tenemos el problema del enter de esto, porque 00:44:21
del problema que se nos daba antes con el enter 00:44:23
cuando hacíamos un nesint, porque estamos leyendo una línea entera 00:44:26
ya, con lo cual nos estamos ya quitando del medio 00:44:29
el enter, cogemos el número, lo convertimos 00:44:32
a entero y luego nos pedirá el nombre 00:44:36
que cogemos el nombre y ya mostramos los dos datos. 00:44:38
Entonces decimos 18, dime tu nombre 00:44:44
Noah y ya nos funciona bien. 00:44:46
Entonces esta sería otra alternativa. 00:44:50
Si ponéis esto siempre, pues sabéis que luego no vais a tener 00:44:53
problemas posteriores no si lo manejáis cogiéndolo con un slide y haciendo la conversión que toque 00:44:56
mira si lo que tenéis es un double pues existe la clase double punto parce double 00:45:04
según el tipo suele haber una clase de asociada a ese tipo que nos permite bueno que tiene muchos 00:45:14
parámetros tienen muchos métodos y parámetros por aquí como podéis ver pero uno de ellos es 00:45:22
es el parse, parse double 00:45:26
recibe una cadena de caracteres y la convierte 00:45:28
en este caso a un double 00:45:31
una variable con 00:45:32
decimales, otra cosa 00:45:34
bueno esta 00:45:39
era la jugada de lo del 00:45:42
escáner que os quería comentar, de la mano 00:45:44
de esto, fijaros 00:45:46
como aquí estamos utilizando 00:45:48
una clase integer 00:45:50
resulta 00:45:52
que los tipos primitivos 00:45:54
cuando nosotros 00:45:56
definimos en java 00:45:58
por ejemplo, la clase Scanner en las librerías o una de nuestras clases, 00:45:59
decimos que tenemos parámetros sin métodos. 00:46:03
Para estas clases, además, tenemos que hacer un new. 00:46:07
Los tipos primitivos de Java no tenemos que hacer el new, como hemos dicho. 00:46:11
Pero, además, no tienen disponible en principio métodos, las variables primitivas. 00:46:17
Cuando trabajamos con una variable primitiva y queremos utilizar métodos que típicamente estarían definidas en una clase relacionada con este tipo de datos, por ejemplo, la posibilidad de convertir una cadena de caracteres que tenga un valor entero en lo que es el número, en Java existen unas clases que se llaman clases envoltorio, clases wrapper y cada uno de los tipos primitivos tiene una asociada. 00:46:25
Entonces el tipo int tiene la clase WrapperInteger que tiene a nuestra disposición una serie de métodos y parámetros que suelen estar relacionados con tipos de datos enteros que vamos a tener típicamente almacenados en el tipo primitivo int. 00:46:51
la clase double de valor 00:47:14
pues de valor es un tipo primitivo 00:47:19
para de valor no vamos a tener que hacer un new de la memoria RAM 00:47:23
porque es un tipo primitivo, pero normalmente no va a tener definidos métodos 00:47:28
si queremos trabajar con métodos relacionados con lo que sería el tipo 00:47:32
primitivo double, existe una clase 00:47:36
envoltorio para double que es double 00:47:39
y esta tiene una serie de parámetros y una serie de métodos 00:47:42
que nos permiten trabajar con ello, fijaros aquí tenemos 00:47:56
para double, para integer, tenemos el máximo valor que es capaz 00:48:00
de almacenarse en una variable de tipo double, el mínimo valor 00:48:04
el mínimo valor, el normal value, no sé cuál es 00:48:08
mínimo normal, no sé qué será, bueno y luego métodos 00:48:12
el máximo, fijaros, la clase grupper double nos permite 00:48:18
tiene un método que nos devuelve cuál de los dos 00:48:22
double que le pasemos como parámetros, double A y double B, es mayor 00:48:26
el máximo de los dos, el mínimo, el pase double 00:48:31
que es el que os estoy comentando ahora, bueno, pues un montón, algo que te 00:48:34
devuelve, hace una suma de dos double y te devuelve otro double 00:48:38
bueno, pues sería como poner un más, ¿no? bueno, ya veis aquí 00:48:42
un montón de cosas, ¿vale? es decir, existen las clases 00:48:45
Rapper para los 00:48:50
Tipos primitivos 00:48:52
¿Dudas? ¿Alguna cosilla por ahí? 00:48:54
¿Seguís por ahí, verdad? Eso sí 00:49:04
Ah, vale, vale 00:49:06
Bien, bien, no, no, por si acaso 00:49:11
Yo que sé, os pierdo y como 00:49:13
En alguna otra ocasión nos ha pasado 00:49:15
Que estaba hablando yo solo 00:49:17
Y luego al ratillo me habéis avisado 00:49:20
Como la red a veces va un poquillo mal 00:49:22
Vale, bueno, pues hasta aquí 00:49:24
Alguna cosilla 00:49:25
Intento ir muy despacito contándoos 00:49:26
Cada línea hay mil películas de cada una de las líneas. 00:49:30
Si os aburro, me avisáis. 00:49:33
Si no, pues sigo así. 00:49:35
Vale. 00:49:37
Si no, pues sigo así para ir contando, 00:49:38
haciendo repaso todo el rato de la teoría. 00:49:41
Mirad, otra cosa de las que... 00:49:43
Sí. 00:49:46
Sí, sí, igual que las otras clases. 00:49:51
Sí, sí, la estoy grabando. 00:50:02
Si no tenemos algún problema por ahí técnico 00:50:03
y termina por no grabarse, 00:50:06
en principio he chequeado la grabación 00:50:08
antes de arrancar y parecía que lo hacía bien. 00:50:10
Y las tres últimas no habéis tenido problemas para verlas luego, ¿no? 00:50:12
O sea, ¿están bien? 00:50:16
¿Sí? ¿Bien? Vale. 00:50:18
Pues bueno, pues en principio está igual. 00:50:19
Estoy grabándola igual que las otras, sí. 00:50:22
Vale, pues mirad otra de las cosas que aparecía en el tema 2 00:50:25
y me pusisteis en uno de los silos una pregunta. 00:50:30
Alguien fue en relación a los castings. 00:50:34
como tenemos los tipos de datos primitivos 00:50:37
vuelvo a ellos, por ejemplo el int y valor 00:50:42
pues valor será una variable de tipo entero 00:50:44
y tiene un determinado espacio en memoria RAM para guardar 00:50:49
enteros, de hecho tiene un rango 00:50:54
mirad, integer.masvalue 00:50:57
system.out.println 00:51:02
minValue, vamos a sacar el valor máximo y mínimo que puede tener un entero 00:51:07
pues nada, mirad, cuando definimos una variable de tipo entero 00:51:25
su valor puede ir entre este numerajo en positivo y este numerajo en negativo 00:51:29
si definimos un long 00:51:34
long también es un tipo de valor que admite 00:51:36
enteros, pues aquí podríamos utilizar la clase 00:51:43
graper como os decía antes, long.masValue 00:51:47
para el long y long.minValue 00:51:51
entonces si hacemos otra ejecución por aquí, fijaros 00:51:57
como los long hacen una reserva de un mayor 00:52:02
número de bytes en memoria RAM cuando para este tipo 00:52:06
primitivo se coge espacio y 00:52:10
por lo tanto es capaz de almacenar un rango mucho más grande, los enteros 00:52:13
este, los long este, si nuestro 00:52:18
programa no va a necesitar números mayores que éste, pues definimos enteros y menos memoria RAM 00:52:22
que estamos consumiendo. Si se nos quedan cortos estos números, el número de gotas de agua que 00:52:26
tiene el océano, pues lógicamente esto no nos va a valer, seguramente este tampoco, pero con este 00:52:33
tendremos más posibilidades o una piscina. Entonces tendremos que saber un poco los rangos de valores 00:52:38
que va a manejar nuestro programa para definirlo como long o como entero. ¿Qué sucede si nosotros 00:52:44
cogemos y decimos que y valor es igual a 5 y lo decimos pues mira dentro de mi programa yo quiero 00:52:51
como son los dos valores enteros quiero que el valor que es el long sea igual a y valor pues 00:52:59
esto le vale porque porque algo que podemos guardar un número entero que va desde este rango a este 00:53:09
este negativo si este tiene un rango mucho mayor lógicamente también se podrá guardar tenga me da 00:53:16
igual el valor que tenga el entero, tanto si es un 5 como si es este valor 00:53:23
máximo o este valor mínimo, que entra dentro del rango que es capaz de almacenarme 00:53:27
el long. Con lo cual, coge y dice, esta asignación me gusta. 00:53:31
En cambio, si ahora cojo y digo, iValor 00:53:36
igual a lValor, esto no me 00:53:39
compila. No sé si lo he puesto bien. 00:53:43
No me compila. ¿Y por qué no me compila? Porque el long podría tener 00:53:47
un valor almacenado, dado que su rango lo permite, mayor 00:53:51
que el que podemos guardar un entero. Entonces, si aquí tenemos 00:53:54
en lugar de este numerajo, este número pero acabado en 8, 00:53:59
este número podría ser el que tuviera L valor y si se lo intento meter a un 00:54:03
I valor, no va a entrar. ¿Qué sucedería? Pues que perderíamos 00:54:07
ahí o bien precisión o se podría provocar ahí un error 00:54:11
en ese entero y decir, oye, mira, a partir del programa 00:54:15
no es me fío mucho cuando vayas a trabajar con este entero porque su resultado puede ser erróneo 00:54:19
porque las ha asignado se se prevé que tiene el valor del long y en cambio vete tú sabes lo que 00:54:26
tiene porque no entraba el programa aquí no nos va a dejar continuar no va a compilar no vamos a 00:54:32
tener los puntos class con él con el vice code con lo cual el programa nos sale adelante ahora que 00:54:38
Java dice, yo no quiero que a mí me culpes de este posible error, si se te da más adelante cuando ejecutes el programa. Pero Java dice, si tú aquí de forma explícita me dices que asumes que esto puede tener un error y dices que este L valor lo ajuste al tamaño de un entero, que probablemente si tú lo estás poniendo esto es porque el valor que va a tener el long normalmente va a estar en este rango, con lo cual no va a haber errores. 00:54:45
Pero podría ser que no, claro. Si tú me lo dices de forma explícita, yo aquí ya acabo de firmar un contrato contigo y si luego hay un error, allá tú, tú eres el culpable, no yo, Java. 00:55:15
Entonces esto se llama casting. Cuando un valor que permite un rango mayor de enteros, se lo asignamos a un valor con un rango menor, pues necesitamos hacer un casting. 00:55:25
aquí es necesario el casting no en ningún caso porque java ya tiene seguridad de que no va a 00:55:36
haber error todo lo que guarden en un entero de tipo int va a entrar en el rango de un entero 00:55:42
de tipo logo entonces esto es lo que lo que hace referencia al casting está asignada esta 00:55:48
confirmación desde el código de que a pesar de que ahí se puede producir un error yo lo asumo 00:55:55
y sigue adelante programa si luego se da el error pues aquí lo asumiste esto ya es culpa tuya por 00:56:02
haberlo por haber hecho esta suposición de que el dato del dato del long era válido y de la 00:56:07
misma forma pasa si nosotros cogemos y definimos un double los double pues acordaros que tienen 00:56:14
decimales decimos que vale 2,5 si yo ahora cojo y digo y valor que el entero tenga la información 00:56:24
de mi double, pues se vuelve a quejar. ¿Por qué? En este caso, aparte de que a lo mejor tienen rangos 00:56:36
que no lo aceptaría el entero la información del double, probablemente, pero además es por una cuestión 00:56:44
de precisión. Si aquí voy a tener un valor entero y este tiene decimales, pues todos los decimales 00:56:50
se van a perder. No me compila la misma jugada que estaba sucediendo aquí. Si yo aún así digo, 00:56:55
mira es que en realidad aquí del valor este que viene arrastrando este double lo que me interesa 00:57:03
en la parte entera en esta variable porque voy a hacer no sé qué operaciones con la parte entera 00:57:09
pues le puede hacer un casting entonces puedo y decirle que lo asuma como un entero 00:57:13
si yo hago un sistema punto out punto println del double lógicamente tiene 2,5 que lo que 00:57:22
le hemos asignado y si lo hago de y valor ejecutó pues se perdió 0.5 se ha producido una pérdida de 00:57:35
precisión pues sí efectivamente porque estamos guardando un valor con decimales en un valor 00:57:50
entero pero yo aquí he dicho que eso lo de por hecho si la jugada al agua al revés necesitaré 00:57:55
un casting pues no porque si digo me da bol que sea igual al valor que tiene y valor esto le 00:58:04
parece bien si hay aquí valor igual a 10 habrá algún problema pues ahora esto será una variable 00:58:12
con decimales a la que si asignó el valor 10 entero pues su valor decimal será 10.0 pero no 00:58:21
hay pérdida de precisión es del 10 al 10.0 el mismo número de si yo aquí vuelvo a mostrar los 00:58:29
dos bueno fijaros como el double vale 10.0 porque sólo hemos asignado aquí desde el entero aquí es 00:58:36
necesario un casting no porque porque no hay lugar no hay opción de perder precisión en el otro caso 00:58:49
era necesario el casting pues sí porque se podía pero era había opción de perder precisión entonces 00:58:56
si quieres seguir adelante reconocerlo tú de forma explícita si alguna cosilla se entiende bien esto 00:59:02
también vale pues a ver estoy mirando bueno entre daba un long tenemos el mismo problema que entre 00:59:11
int y double porque como el double admite decimales y el long no sé en la misma circunstancia que 00:59:33
tenemos aquí entre un int y un long ya que el long admite un rango mayor que el link lo tenemos con 00:59:46
decimales entre el double y el float el float tiene un rango menor que el double entonces si 00:59:52
yo aquí cojo y digo 3 perdón vamos a poner vamos a inicializar el labor si digo 3.2 entonces yo hago 01:00:05
efe vale igual a de bal aquí también se me quejas no se me queja en este caso porque uno tenga 01:00:19
decimales y otro no y se pierda la precisión esa sino porque el double al ser un tipo que ocupa 01:00:29
mayor espacio en memoria ram tiene un rango mayor y su valor aunque este no es el caso simplemente 01:00:35
vale 32 en este caso y también lo acepta un flow at pero a la hora de hacer esta validación el 01:00:41
compilador lo que mira es en los tipos entonces dice la información de un double podría llegar 01:00:46
de tener un valor que no me entrase en un flow at que si yo cojo de aquí a un casting a ver no 01:00:53
era hecho a ver que lo que he hecho aquí no me deja ahora aquí hacer esto yo juraría que el 01:01:07
otro día estoy mirando esto y sí que sí que me funcionó desde una variable no me deja el otro 01:01:28
día lo mire a ver perdón a sí vale vale es porque se vale bien es porque utilizado la grupper se 01:01:37
utilizo el dato primitivo, creo que es por eso, a ver, vamos a hacer la prueba y os lo reviso, aquí sí lo traga, vale, no me estaba dejando hacer una conversión desde este double que era la clase stackwrapper que os he dicho que tenía luego parámetros por aquí para poder utilizar, pero si utilizamos los tipos primitivos, igual que habíamos hecho con el long, es decir, en lugar de definir la variable double, la he definido con este double, 01:01:53
pero con la d minúscula, veis que se ha puesto así, ya es el dato primitivo y ya sí que me deja hacer el casting. 01:02:23
Y en cambio aquí, pues no me dejaba. Por el mismo motivo del int y del long de antes, por el tamaño. 01:02:31
Y luego otra cosilla que veíamos era que si poníamos fval igual a 3.4, esto no le gustaba. 01:02:41
Y esto tampoco le gusta, porque este tipo de dato, si lo ponemos aquí directamente, Java lo considera como un double. 01:02:50
Entonces estamos en la misma jugada que si ponemos una variable tipo double asignándosela a un float. 01:02:59
En el momento de no indicar si es un double o un float, Java tendría que tomar una decisión. 01:03:08
¿Lo guardo en un espacio de memoria float o en un espacio de memoria double? 01:03:12
Y por lo que sea, Java está programado para considerarlo un double. 01:03:16
como se lo intentó meter luego un flow at por dice no va a esta información que es un double 01:03:19
en este valor que es un flow at aquí podríamos hacer un casting también y se lo tragaría 01:03:24
o indicar al número si le aquí después le ponemos una f estamos diciendo que este 3.4 en realidad es 01:03:32
un valor que lo considere flow at ya desde este momento entonces aunque no pongamos el casting 01:03:41
le deja, porque este 3,4 en realidad es un float, que se lo estoy asignando 01:03:46
a una variable float. ¿La f minúscula también se la deja? 01:03:50
Sí. Podemos poner la f minúscula, f mayúscula, después del número 01:03:54
para decir, oye, que esto es un float, no es un double. 01:03:58
Si no ponemos nada, lo considero un double. Si ponemos una d, no. 01:04:02
Para que sea un... A ver, si ponemos una d 01:04:05
y hacemos el casting. Bien. Si ponemos una d, lo considera 01:04:09
double, que es igual que no poner nada, si ponemos una F, lo considera float. 01:04:17
¿Sí? ¿Bien? Vale. 01:04:31
Pues mirad. Vale, borro por aquí, si no tenéis ninguna pregunta más 01:04:36
de esto del casting, que era otra de las cosas que nos había quedado un poco por ahí pendientes. 01:04:40
Mirad, más cosas. Cuando nosotros 01:04:51
ponemos el método system.out.println 01:04:55
aquí, entre 01:05:00
paréntesis este método recordar system out para escribir por pantalla si éste no tiene diferentes 01:05:06
opciones fijaros tiene muchos métodos típicamente utilizamos el println pero podemos escribir de 01:05:13
muchas formas tiene muchas alternativas println otra que tiene sprint sin el en el ln que nos 01:05:18
deja el cursor al final de lo que acabamos de escribir normalmente aquí lo que ponemos es una 01:05:28
cadena de caracteres algo o bueno ponemos una cadena caracteres o 01:05:36
cualquier otra cosa pero aquí lo que nos escribe es un texto 01:05:40
si ponemos 01:05:46
in a y val igual a 3 y ponemos aquí el número es igual pues fijaros aquí 01:05:49
tenemos una cadena de caracteres aquí tenemos un valor numérico vamos a ejecutar y lo que nos 01:06:05
saca por pantalla es toda una cadena de caracteres al final todo este conjunto se convierte en una 01:06:12
cadena de caracteres lo que hay entre paréntesis tengamos aquí lo que tengamos una combinación de 01:06:20
cosas una variable solo un literal solo una variable string un literal y un número de 01:06:24
De alguna forma, todo esto lo va a terminar convirtiendo en una cadena de caracteres que nos va a mostrar por aquí por pantalla. 01:06:33
Eso es porque todas las clases de Java, todas, tienen un método que es el método toString, que viene a ser convierte a una cadena de caracteres. 01:06:39
Pero podemos decir, vale, me puedo creer que en las clases que tú importes desde las librerías han puesto el método este toString. 01:07:04
me lo puedo creer. Pero en esta clase que estás definiendo 01:07:15
tú aquí en este programa, yo no veo que hayas programado un método 01:07:19
toString por aquí, por ningún sitio. Luego podremos programar el método 01:07:23
a saludar como antes, los que vayan requiriendo nuestro programa, pero yo no veo que hayas 01:07:27
programado ningún método toString. Y en cambio estamos afirmando 01:07:31
que todas las clases disponen de ese método. 01:07:35
En Java y en otros lenguajes en la programación orientada a objetos, 01:07:39
Otra de las características que tenemos con los temas, hablaremos en profundidad si hay temas que tratan de esto en particular, pero vamos anticipando cosas. Igual que tenemos, por ejemplo, la sobrecarga, principio de métodos que hemos visto antes con el método saludar. 01:07:43
Otra de las características que tenemos es la herencia. 01:08:04
Esto quiere decir que existe una jerarquía de clases en Java 01:08:09
y las va nombrando una jerarquía, digamos, en una estructura tipo árbol, 01:08:12
podemos considerar, en la cual tenemos una clase aquí, clase 1 o clase padre 01:08:20
y luego vamos teniendo, podemos a través de la herencia, 01:08:27
hacer que una clase sea una clase hija de una determinada clase padre esto que implica la 01:08:33
herencia hablaremos de ella vale en uno de los temas esto lo que implica es que esta clase hija 01:08:42
cuando la definimos podemos decir que sea hija de una determinada eres hija de una clase padre 01:08:47
en particular. En este caso, la que hemos llamado clase 01:08:57
p. Entonces, todo lo que hay que definir, la clase 01:09:04
hija tendrá como atributos y como métodos todo lo que definamos 01:09:09
en ella, pues igual que estamos haciendo por aquí, sus métodos 01:09:13
y sus atributos, y por herencia, todos los atributos 01:09:17
y métodos que tenga la clase padre. La forma 01:09:21
en Java, ya os digo que hay temas en los que se habla 01:09:29
en particular de esto. La forma de decir en Java que una clase es hija de otra es a través 01:09:33
de la etiqueta extend. Se extiende o hereda, esta clase hereda de una determinada clase 01:09:39
padre. Sería en la clase hija, pondríamos extends clase p. Y en este caso, todo lo que 01:09:46
tiene definida la clase p, lo tenemos disponible nosotros. Cuando definimos una clase, esta 01:09:54
clase puede ser hija de una única clase padre, de una solo. ¿Por qué? Porque 01:10:02
imaginaos que si pudiera ser hija de varias clases al mismo tiempo y cada una 01:10:10
de estas clases definiese un método saludar diferente, con un comportamiento 01:10:18
diferente, volveríamos a tener discrepancias. Imaginaos que en la clase 01:10:22
P, como parte de su código aquí, hemos definido el método saludar. Y en la clase 01:10:26
J también definimos un método saludar con un comportamiento 01:10:31
distinto. Uno dice hola y otro dice buenos días. Entonces, si 01:10:38
la clase H fuese hija de forma 01:10:42
simultánea de la clase P y de la clase J y un objeto de la 01:10:46
clase H intenta saludar, no sabría si ejecutar lo que tiene la clase P 01:10:50
definido para saludar o lo que tiene la clase J. Habría una discrepancia 01:10:54
ahí y no sería posible. Hay algunos lenguajes de programación orientada a objetos 01:10:58
que lo permiten la herencia múltiple aunque hay que manejarla hay que gestionarla pero en java 01:11:02
no se permite herencia múltiple solamente se puede tener ser hija de una clase en particular no de 01:11:10
varias en este caso por ejemplo la clase p entonces si yo no tengo definido aquí cómo saludar saludaría 01:11:15
de la misma forma que esté definido en la clase p además de la herencia está que podemos identificar 01:11:22
nosotros mediante la etiqueta extend, hay una especie de herencia 01:11:29
en todas las clases de Java de una clase 01:11:33
que está arriba del todo en la jerarquía de clases 01:11:37
de Java, que es la clase object. Y esta clase, aunque no le pongamos 01:11:41
el extend, de esta clase sí que heredan todas, todas. 01:11:48
Y en esta clase object existe, entre otras cosas, 01:11:52
el método toString, que os decía, por aquí 01:11:56
arriba en definitiva en cualquier cualquier objeto de cualquier clase tiene un método tu string que 01:12:00
aunque no lo programamos por esa herencia general no por la que identificamos nosotros en nuestro 01:12:09
programa con stand de la clase object todo objeto tendrá ese método tu string disponible se entiende 01:12:15
Sí, más o menos, sí, vale. Entonces, de forma implícita, no es necesario indicarlo, todo lo que pongamos aquí entre la apertura y cierre de paréntesis, sea una cadena de caracteres, un literal, una variable string, un entero, un long o lo que sea, 01:12:25
antes de escribirse por pantalla en el println 01:12:59
llama al método toString y concatena 01:13:03
todas esas variables. Como consecuencia aquí nos sale siempre 01:13:07
un método toString. Fijaros que toString 01:13:11
viene a significar convertir a string, lo que sea. 01:13:14
Si fijáis, por ejemplo, si ponemos aquí integer, la clase griper de integer, si ponemos 01:13:19
aquí toString, ¿veis? Existe una clase toString que 01:13:23
recibe un entero, el valor entero y nos devuelve 01:13:27
¿qué? nos devuelve una cadena de caracteres, con cualquiera 01:13:31
todas ellas, mira si definimos aquí 01:13:35
clase print 01:13:38
un objeto de mi clase 01:13:43
si pongo mi object.toString, ¿veis? 01:13:48
también la tengo disponible, siempre cualquier objeto 01:14:02
aunque no lo haya identificado, tanto la clase grupper de las librerías 01:14:06
integer, como cualquier otra, como un objeto de una clase 01:14:10
mía propia, aunque no lo haya definido, siempre tiene disponible 01:14:14
el método toString y fijaros, lo tiene disponible, devuelve un string 01:14:18
lo tiene disponible desde una clase, digamos 01:14:22
padre, que es la clase object que os comentaba 01:14:26
esto es lo que permite que el system of println tengas aquí 01:14:29
el tipo de variable que tengas, este método espera siempre que todo esto se resuelva a una cadena de caracteres 01:14:34
que es la que él va a mostrar por pantalla. Y lo que no es cadena de caracteres llamará de forma implícita, 01:14:41
no hace falta que lo hagamos nosotros, al toString que tenga definido para convertirlo en una cadena de caracteres 01:14:48
y que el println lo muestre por aquí. Si es un entero, pues el toString de la clase grupper del entero, 01:14:55
¿qué hará? Pues convertirá este valor numérico, convertirá en este caso como iVal vale 3. 01:15:02
Justo antes de hacer esta conversión, lo que hará será llamar al toString y convertirá ese 3 a este 3, 01:15:13
para que esta cadena de caracteres la pueda concatenar con esta otra y así se nos muestre el resultado de esta forma por pantalla. 01:15:21
Bueno, de momento sobre la clase toString trabajaremos porque la sobrescribiremos en ciertos momentos, pero más adelante. 01:15:29
Ahora bueno, simplemente que tengáis la idea de herencia en Java, vamos introduciéndola. 01:15:48
Nosotros por código podemos poner aquí la etiqueta extends y aquí poner una clase de la cual haría clase print, 01:15:56
con lo cual tendríamos disponible todo lo que pusiéramos aquí, todo lo que tuviéramos definido en la clase que pongamos aquí 01:16:05
y que a partir de esta herencia que tiene que ser única con Stents, tenemos la posibilidad, sabemos que toda clase tiene ciertas características 01:16:11
heredadas directamente, todas ellas, de una clase que digamos está en la jerarquía más alta de las clases en Java, que es la clase Object. 01:16:23
Y entre ellas, pues tenemos, por ejemplo, no solamente este, pero tenemos el método toString, que convierte cualquier valor de esa clase en una cadena de caracteres. A ver qué más cosas por ahí puedo contar. 01:16:32
Mira, si tenemos, aprovechando que estamos hablando del toString, hemos dicho antes que teníamos la posibilidad de poner ival, imaginaos que tenemos un string, ese info, que tiene un valor numérico, un 3. 01:16:51
antes en los ejemplos anteriores lo estábamos cogiendo con netzint a través de 01:17:41
escáner, si este 3 que es una cadena de caracteres 01:17:45
la queremos meter en un valor entero 01:17:49
habíamos visto que tenemos integer, parseInt 01:17:53
esta opción, este método 01:17:57
nos transforma a un valor numérico de tipo entero 01:17:59
un valor que es un número pero que lo tenemos capturado como una cadena de caracteres 01:18:05
Otro método que tenemos también para hacer esto mismo, igual de válida, también de la clase Grouper, Integer y en todas las clases Grouper lo tenemos, es el método ValueOf. 01:18:11
ValueOf viene a hacer lo mismo. Podemos poner aquí ese info y también nos convertiría, la cadena es equivalente a esta otra. 01:18:24
nos metería en el valor numérico el valor de la cadena 01:18:35
y si lo que queremos hacer es lo contrario 01:18:39
es decir, tenemos un valor 3 01:18:42
hemos dicho que si metemos system.out 01:18:47
.println 01:18:51
de ival, println espera sacar por pantalla 01:18:55
lo que tenga aquí dentro pero como una cadena de caracteres 01:19:04
Entonces hemos dicho que de forma implícita llama al método toString, esto es para sacarlo por pantalla, pero imaginaros que de verdad no queremos sacarlo por pantalla, lo que queremos es tenerlo a nuestra disposición una variable de tipo string de momento porque queremos hacer otras cosas diferentes a sacarlo por pantalla. 01:19:08
Entonces podríamos tener una variable de tipo string y para cargar este número como una cadena de caracteres, si yo cojo y pongo y val, pues esto no le gusta, ¿por qué? Porque son tipos incompatibles, una cadena de caracteres con un número no le va bien. 01:19:24
Entonces, ¿qué podríamos hacer? Pues podríamos coger y utilizar de la clase 01:19:43
grouper integer el método toString, que es el que estamos diciendo. 01:19:47
Tenemos un entero en este caso, clase grouper integer toString, 01:19:55
le pasamos el valor y nos devuelve una cadena de caracteres. 01:19:59
Con lo cual, ese val, ¿qué información tendrá? Pues tendrá este 3, 01:20:04
pero lo tendrá en formato de cadena de caracteres, así. 01:20:08
Bien, ¿alguna preguntilla tenéis por ahí? ¿Queréis alguna consulta? 01:20:25
Está siendo un poco cajón desastre, os estoy contando muchas cosas, pero bueno, son conceptos que antes o después nos irán viniendo bien. 01:20:35
Sí, mira, en línea general, bueno, repito la pregunta para que quede en la grabación, me dicen que si podemos repasar un poco otra vez lo de las clases wrapper, el sentido que tienen y para qué se utilizan. 01:20:58
Hemos hablado antes un poquito de ellas, pero bueno, le pegamos otra vuelta. 01:21:16
Los, toda clase, tanto las propias como las de las librerías, están compuestas por una serie de parámetros y una serie de métodos. En las variables referenciadas para hacer la reserva de memoria que necesitan, recordad que tenemos que hacer el new y luego el constructor para inicializar ese objeto. 01:21:20
En cambio, estos días ya, durante esta tutoría y las anteriores, hemos dicho que hay una serie de variables en Java que son las variables primitivas. El int, el long, el string, el double, el float, el boolean, todas estas. 01:21:45
estas variables son un poquito diferentes a las 01:22:02
referenciadas, en primer lugar no necesitamos hacer su new 01:22:06
para tener espacio de memoria, pero luego no tienen 01:22:09
a su disposición una serie de métodos 01:22:12
si os fijáis, si yo defino 01:22:15
vamos a aprovecharnos un poquito de Eclipse 01:22:17
si yo defino un objeto 01:22:20
de la clase que he creado yo aquí 01:22:26
en el proyecto, clase print, si ahora pongo aquí 01:22:30
un punto, Eclipse me está ofreciendo 01:22:32
todos los métodos que están definidos para la clase 01:22:36
print, para el objeto de la clase print y para la clase 01:22:40
print en particular. Fijaros que yo en clase print no he 01:22:44
definido métodos, pero en cambio tengo todos estos, ¿por qué? 01:22:48
Pues los tendré por herencia desde la clase object. 01:22:52
Fijaros como todos aquí a la derecha me dicen object base, ¿por qué los 01:22:56
tiene disponible por esa herencia que os decía de la clase 01:23:00
Object. La única que me aparece aquí como clase Print 01:23:03
es precisamente el método Main, que es el único que tengo definido por aquí. 01:23:06
Todos los demás disponibles a través de la clase Object. 01:23:09
Y Eclipse me los ha ofrecido 01:23:14
poniendo aquí un punto para poder llamarlos. 01:23:15
Si yo pongo aquí valor punto, no me ofrece nada. 01:23:18
¿Veis? ¿Por qué sucede esto? 01:23:21
Porque los tipos primitivos son especiales 01:23:24
En dos aspectos al menos. Uno, que no necesitamos hacer el new como a los referenciados y otro, que no tienen definidos los tipos primitivos métodos que utilizar. Pero a veces nos resultará útil hacer cosas con un entero. Nos vendría bien tener métodos relacionados con este valor de tipo entero. 01:23:27
entonces para tener eso a nuestra disposición en las librerías de java a cada uno de los tipos 01:23:48
primitivos se le para cada uno de los tipos primitivos se han desarrollado de forma paralela 01:23:55
una clase que es la clase grupper en este caso para el tipo entero pues tenemos la clase grupper 01:24:01
integer y este si ponemos aquí sí que nos ofrece ya cosas para hacer todas ellas relacionadas con 01:24:08
enteros, fijaros que casi todas aceptan mínimo 01:24:15
valor de un entero, máximo valor de un entero, tamaño de un entero 01:24:19
entradas de entre dos como parámetros, ¿por qué? porque está pensada 01:24:23
o bien de salida o bien de entrada, siempre hay enteros, está pensada 01:24:27
para dar funcionalidades al tipo primitivo 01:24:31
entero, y esta es la clase Grouper Integer 01:24:35
volviendo a conceptos de los que hemos hablado antes, para la clase 01:24:39
integer, ¿hemos necesitado definir un objeto y utilizarlo? 01:24:45
No, directamente hemos puesto el nombre de la clase y un punto y ya me ofrece 01:24:49
cosas. ¿Qué pasará con todos estos parámetros y métodos que 01:24:53
son estáticos? Son parámetros y métodos de la clase en su conjunto, 01:24:57
no de objetos en particular, por eso están disponibles. 01:25:01
Y estas son las clases graper, clases asociadas a los 01:25:06
tipos primitivos que nos dan aquellas funcionalidades que nos 01:25:09
Vendría bien tener para esos tipos, pero que no están disponibles cuando se definieron. 01:25:13
Y estamos utilizando, ahora hemos hablado de, por ejemplo, en el caso de Integer, 01:25:20
que las tenemos en diferentes, pues tenemos el parseInt, tenemos el valueOf. 01:25:24
Bueno, tenemos muchas, como habéis visto antes, el valor máximo y el valor mínimo. 01:25:29
Tenemos el toString. Bueno, pues muchas de ellas por ahí, ¿vale? 01:25:35
Tenemos todas las que nos salen aquí. Estas son las clases de Wrapper. 01:25:41
no sé si queda claro más o menos 01:25:46
sí, vale 01:25:53
vale, vale 01:25:57
mirad en la 01:26:00
de la 01:26:02
tarea 01:26:03
bueno pues 01:26:04
no sé si habéis tenido la oportunidad de leerla 01:26:06
supongo unos sí, otros no 01:26:09
pedía 01:26:11
meter por teclado 01:26:13
unos números de tres entradas 01:26:14
que las identificaba 01:26:17
un número y luego si era par o impar 01:26:19
nos permitía decir si tenía que ir a una grada azul o a una grada verde. 01:26:21
Bueno, pues por separarlo en pares e impares. 01:26:26
Cosas de la práctica que tenemos. 01:26:30
¿Qué he visto? 01:26:34
Pues, por un lado, el nest int, 01:26:35
aunque no provocaba error en esta práctica, 01:26:39
pues cuidado con el enter del nest int, 01:26:41
que hemos hablado antes de ello. 01:26:43
Luego, si hacíamos la lectura con un nest line, 01:26:45
como pedía que la información se metiera desde el teclado 01:26:48
en una única entrada separado por espacios 01:27:01
tenemos esta cadena, claro, pero esto no es un número, son tres 01:27:05
entonces si lo tenemos en una variable de tipo string 01:27:09
teniendo en cuenta que esto lo hemos cogido desde teclado 01:27:12
con un slide, al final tendríamos en la variable 01:27:17
algo así, pues bueno, os comentaba el otro día que 01:27:23
la clase 01:27:26
stream precisamente 01:27:29
tiene un método que es el método 01:27:31
split. Y el método 01:27:33
split permite separar 01:27:35
en diferentes trozos 01:27:38
considerando un carácter 01:27:39
separador. En este caso podría ser el espacio. 01:27:41
Si hubiéramos dicho en el enunciado 01:27:44
por ejemplo la almohadilla 01:27:45
pues podríamos considerar como carácter 01:27:48
espaciador la almohadilla. 01:27:49
Y lo que querríamos en este caso 01:27:53
es obtener, por un lado el 7, por otro el 6, por otro el 5, sabiendo que está 01:27:55
identificado con la almohadilla del separador, en este caso, el enunciado de la práctica 01:27:59
decía un espacio, pues lo que podríamos hacer es 01:28:03
dividirlo, utilizar un array, que os hablaba el otro día de él, 01:28:07
si ponemos sval.split en el método este, 01:28:16
aquí podemos meter información de la 01:28:22
separación, en este caso sería la almohadilla, y nos cargaría 01:28:24
en un array en esta variable que es un array de strings nos cargaría todos los datos recibidos 01:28:28
desde esta variable que sería un 5 un 6 y un 7 y los array os comentaba el otro día ya hablaremos 01:28:39
de ellos son variables que comparten el nombre pero son tantas variables de este tipo en este 01:28:46
caso string, como el tamaño que tenga el array. Y para acceder a cada una 01:28:58
de ellas, de esas variables, entre los 01:29:02
corchetes ponemos aquí un índice que va desde 0 01:29:08
hasta un número menos del tamaño que tiene el array. En este 01:29:11
caso sería hasta 2. Fijaros, tiene 3 elementos, 1, 2 y 01:29:16
3. Pues la posición 0 en el índice sería 01:29:20
el 5, la posición 1 el 6 y la posición 2 el 7. Y cada uno de ellos 01:29:24
serían un string fijaros esta variable si leemos hacia el 01:29:28
izquierda sería un array de strings conjunto de strings esto que sería la 01:29:35
variable leyendo derecha izquierda en la línea de abajo está de izquierda a 01:29:43
derecha con la información del corchete cada una de ellas sería un string 01:29:47
con lo cual esto es un string esto es un array de strings esto es un string cada 01:29:52
una de ellas. Entonces aquí con el string ya podríamos utilizar 01:29:58
el valueOf, este para pasarlo al número 01:30:02
entero o podríamos utilizar el parseInt 01:30:05
de la clase GrouperInteger. Y luego para comprobar 01:30:09
si es par o impar, tenéis una solución 01:30:17
de las posibles puestas en el 01:30:21
aula virtual. Bueno, pues la forma en la que 01:30:23
lo utiliza teníamos con lo que hemos visto en el contenido del tema 2 una 01:30:29
posibilidad que era la instrucción está con dos operadores 01:30:34
entonces esta que tiene la opción que dices algo 01:30:40
es igual a un valor y dice si vale una si vale verdadero una cosa y si no pues 01:30:46
es otra cosa con esta instrucción es un poco liosa y yo creo mucho más clara lo 01:30:55
que vais a ver ahora en el tema 3 que es utilizar una instrucción de condición 01:31:02
que es si if y aquí pondremos algo que se puede 01:31:07
evaluar como verdadero o falso y hacemos en el ámbito del if una serie 01:31:12
de cosas que pondríamos aquí y el else que es si no es cierto lo que hay aquí pues entonces hace 01:31:18
esta otra serie de cosas mirad aunque esto pertenezca al tema 3 vamos a poner aquí si 01:31:27
es cierto lo más cierto en java a la hora de evaluarlo es poner aquí que es cierto ya 01:31:33
directamente. Entonces decimos 01:31:38
si es true 01:31:40
system.auth.println 01:31:41
escribo 01:31:45
true 01:31:51
y si no es true 01:31:52
escribo false. ¿Esto cómo 01:31:54
funciona? Pues cuando hará 01:31:59
todo este código que no tiene 01:32:00
consecuencias por pantalla ni nada 01:32:02
y luego dirá si es verdadero 01:32:05
lo que hay aquí entre paréntesis 01:32:07
que en este caso lo que evalúa 01:32:09
es que directamente es verdadero 01:32:11
hace el código que hay en el ámbito del if, que es 01:32:12
lo que hay entre esta llave de apertura y cierre. Podríamos tener aquí una serie 01:32:17
de instrucciones, pero en particular hemos puesto una solo, que sería 01:32:21
escribo true. Y si esto se evaluase a falso, 01:32:25
pues entonces, en lugar de ejecutar la serie de instrucciones 01:32:29
que hay en el if, haría la serie de instrucciones que hay en el else, que sería 01:32:33
escribo false. Este if true y else 01:32:36
lo podríamos 01:32:40
hacer con 01:32:43
una instrucción 01:32:45
de la que tiene dos operadores 01:32:46
esta en la que algo es igual 01:32:49
que mira una condición, no sé si habéis visto 01:32:51
la teoría, y si 01:32:53
es cierta pasa una cosa y si es falsa 01:32:54
pasa otra, entonces con el true 01:32:57
yo no sé si alguien 01:33:01
directamente lo ha hecho así, entre los que habéis entrado a la práctica 01:33:03
yo creo que nadie, habéis ido 01:33:05
a este que es el método en el que luego 01:33:07
programaremos durante todo el curso 01:33:09
lo que pasa es que esto en verdad todavía no lo habíamos visto en teoría 01:33:11
por eso yo la solución no la he dado con esta otra alternativa 01:33:14
entonces si ejecutamos por aquí dice escribo true 01:33:17
porque esto se ha evaluado como true y si esto fuese false 01:33:20
escribiría el otro 01:33:23
normalmente los if y los self no tienen aquí true o false 01:33:27
sino que tienen una expresión que se evalúa a verdadero o falso 01:33:31
por ejemplo un valor entero 01:33:34
la edad de una persona 01:33:37
imaginaos que estamos aquí chequeando mayor de edad o menor de edad 01:33:39
Y tenemos aquí una variable int y edad. Aquí llegará con un determinado valor que será consecuencia de la ejecución anterior del código. Entonces si ponemos aquí 15, pues en principio sería menor de edad. 01:33:42
como esto es lo que queremos que pase cuando sea mayor de edad pues podríamos decir si y edad es 01:33:59
mayor de 17 años esto se evalúa true porque y edad efectivamente es mayor que 17 en este caso no si 01:34:06
ponemos aquí de mayor de edad vamos a poner 19 pues si edad es mayor que 17 diría mayor de edad 01:34:15
y si no pues sería menor pero esto lo que vais a ver en este tema este tipo de instrucciones entonces 01:34:27
esta ejecución esto se evalúa a verdadero porque de verdad es verdadera esa comparación de mayor 01:34:35
de edad en cambio si tuviera un 15 aquí como esto se evalúa a falso pues nos mostraría esto 01:34:43
y la otra cosa que es interesante aunque el programa funcionaba perfectamente sin ello 01:34:54
pero es bueno hacer también, es que si abrimos flujos de comunicación 01:35:02
de nuestro programa con el mundo exterior, en este caso teníamos el escáner 01:35:07
al teclado, System.in, por aquí lo utilizamos convenientemente 01:35:14
y en un programa en línea general interesa siempre los flujos de datos 01:35:28
cuando terminas de utilizarlos, pues no dejar pillados recursos. 01:35:33
entonces aquí sería mejor poner un scan close voy a cerrarlo igual que lo abierto aquí por lo 01:35:36
cierro aquí después de haber estado utilizándolo aquí que sucedía en el programa que como el 01:35:42
programa se ejecutaba en el método main hacíamos todo lo que correspondiese y aunque no tuviéramos 01:35:52
esto como acaba el método main acaba el programa y el hecho de acabar el programa liberaba los 01:35:57
recursos y al final pasa un poco lo mismo pero nuestros programas no tienen por qué ser así 01:36:03
de sencillos de empezar y terminar en un método de hecho no lo son normalmente pues tienen mucho 01:36:09
más código y a veces son programas que tienen que permanecer en el tiempo a lo mejor están 01:36:14
dando un servicio de 24 horas entonces interesa que cuando dejemos de utilizar un recurso pues 01:36:18
liberarlo todo lo que no vayamos a utilizar si ya no tenemos que leer más cosas desde el teclado 01:36:25
pues vamos a cerrar ese recurso y no dejamos pillado hay una conexión al teclado que bueno 01:36:31
vete tú a saber si en algún momento me puede terminar dando un problema 01:36:38
y resultarme muy costoso el depurar el código hasta darme cuenta del problema 01:36:41
en otra zona de código puede ser ese 01:36:46
entonces esto también era una cosa interesante de hacer 01:36:49
cerrar los flujos, siempre que usemos un flujo ya no precisemos de su uso 01:36:52
y nada, hay poco más, yo creo que os voy a contar ya por hoy 01:36:58
por aquí 01:37:09
porque no tengo del tema este 2 01:37:11
no tengo más cosas, la semana que viene empezamos a hablar 01:37:14
de lo del tema 3 01:37:16
os abro mañana los contenidos 01:37:18
y si no tenéis 01:37:20
alguna pregunta por ahí que hacerme 01:37:23
pues voy a ir parando la grabación yo creo 01:37:25
y lo vamos dejando por aquí 01:37:28
¿alguna cosita por ahí? 01:37:29
¿qué me queréis comentar? 01:37:33
¿todo bien? 01:37:42
pues si os parece 01:37:47
si no tenéis ninguna pregunta más 01:37:49
paramos para no adelantaros más cosas 01:37:50
ya hemos introducido 01:37:53
un montón de conceptos y hemos repasado 01:37:55
un montón de cosas, así que si 01:37:57
reviséis otra vez la clase 01:37:58
tenéis para entretenernos un poquito 01:38:00
con ella yo creo 01:38:02
pues nada, por aquí lo dejamos entonces 01:38:03
vale 01:38:10
pues nada 01:38:10
la grabación 01:38:15
creo que ahora la voy subiendo 01:38:16
necesito un tiempo de procesamiento hasta que 01:38:19
está disponible, o bien esta noche 01:38:21
Mañana ya os pongo el enlace disponible para que podáis verla de nuevo si queréis. 01:38:23
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:
80
Fecha:
4 de noviembre de 2024 - 19:15
Visibilidad:
Clave
Centro:
IES ALONSO DE AVELLANEDA
Duración:
1h′ 38′ 32″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
172.75 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid