Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 25-09-23 - 1 - 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:
Bueno, pues eso estábamos, ¿verdad?, estábamos poniendo ejemplos sencillos, porque ahora mismo es todo muy sencillo lo que podemos hacer a nivel de código Java, es muy sencillo lo que podemos hacer, y eso estábamos viendo, ejemplos de declaración de variables, por ejemplo, enteras, recordad que vimos los 7, 4, 5, 6, 7, 8, 8, ¿verdad?, 4 enteros, 2 de decimales, 1 char y 1 boolean, 8,
00:00:01
que habíamos mencionado los únicos ocho tipos de datos en Java que hay
00:00:25
que se les llama primitivos porque son los que vienen de serie
00:00:32
y solo tenemos esos ocho, no hay más
00:00:36
que luego queremos usar estructuras de datos más complejas
00:00:38
como nombres, como conceptos, como una variable alumno
00:00:42
que quiero que incluya su nombre, su edad
00:00:49
Pues una variable alumno no tiene sentido porque no encaja con ninguno de los datos primitivos
00:00:52
Pues habrá que inventarse algo
00:00:57
Pues es inventarse algo más adelante
00:00:59
Pero tipos de datos son estos, no hay más en Java
00:01:02
Que son los llamados primitivos
00:01:05
El tipo int era 1, así lo declarábamos
00:01:07
Ahora ya con este le asigno valor
00:01:13
Vimos que a la vez que declaro podemos ya de partida dar un valor si queremos
00:01:15
una primera asignación, esto es lo que se suele
00:01:21
llamar inicializar la variable
00:01:23
inicializarla, que es
00:01:25
darle su primer valor, inicializar
00:01:27
una variable es darle su primer valor
00:01:29
nada más, y luego ese valor puede
00:01:31
cambiar todas las veces que haga
00:01:33
falta, como consecuencia
00:01:35
de que la máquina virtual ejecute esto
00:01:37
en la cajita
00:01:39
número 1
00:01:41
se habrá creado el número
00:01:42
habrá
00:01:45
como consecuencia
00:01:46
de la declaración ya sabemos que aquí
00:01:51
se ha creado esta variable, esto ha pasado como consecuencia
00:01:55
de esta declaración de aquí, se ha creado
00:02:12
un espacio en memoria de ¿cuántos bits?
00:02:16
¿cuántos bits?
00:02:22
después de esta declaración
00:02:25
¿cuántos? 32
00:02:26
32, porque la variable entera int reservaba 32 bits
00:02:30
bueno, pues cuando la máquina virtual ya ha entrado a ejecutar esto
00:02:36
que va a poder hacerlo porque no tiene errores de compilación
00:02:39
entonces podemos entrar a ejecutar esto, cuando haya entrado a ejecutarlo
00:02:44
se habrá creado esta cajita de memoria de 32 bits
00:02:47
se le habrá asociado un nombre
00:02:51
y ahora ya las asignaciones, puede haber todas las que uno le dé la gana
00:02:54
obviamente, con esta primera asignación
00:03:00
que es la que se llama inicialización porque es la primera
00:03:02
aquí ha ido a parar un 5
00:03:04
vale, pues estupendo, ha ido a parar un 5
00:03:06
que ahora después
00:03:08
le asignamos un 15
00:03:10
pues como consecuencia
00:03:12
de la ejecución de esta sentencia
00:03:14
este 5
00:03:15
fuera, ha desaparecido
00:03:17
y ahora ya ha aparecido
00:03:19
un 15
00:03:23
¿no? ya está
00:03:25
así funcionan las asignaciones
00:03:27
cada vez que yo haga una asignación a la variable
00:03:29
el valor que tenía de antes desaparece
00:03:33
es pisado por el nuevo y ya está, así funcionan las asignaciones
00:03:36
y recordad que su sintaxis siempre es esta
00:03:40
nombre de la variable
00:03:44
operador de asignación igual y a la izquierda
00:03:47
del operador de asignación solo puede ir el nombre de la variable, no puede haber nada más
00:03:52
el nombre de la variable
00:03:57
que recibe el valor
00:03:58
y a la derecha
00:04:00
el valor que le damos
00:04:02
¿vale? el valor que le damos
00:04:04
yo ahora mismo le estoy dando un valor
00:04:06
así, a capón, el 15
00:04:08
hombre
00:04:11
para que esto sea un poquito más operativo
00:04:12
obviamente
00:04:15
y tenga más sentido
00:04:16
ese valor pues vendrá
00:04:18
de haber leído del teclado
00:04:20
de haber leído de un fichero
00:04:21
bueno, con los mecanismos que ya veremos
00:04:22
el primero de todos es leer del teclado
00:04:25
para que el usuario pueda meter el número que él quiera, claro, ¿vale?
00:04:26
Pero yo ahora mismo, como todavía no sé leer del teclado, estoy probando a hacer las asignaciones
00:04:30
a la cascándole un valor a palo seco, ¿vale? Venga, el 15, y así funciona,
00:04:34
y así puedo hacer yo todas las que quiera.
00:04:40
Aquí puedo cascar un valor a palo seco o cualquier cosa que como resultado de su evaluación me dé un valor.
00:04:43
Esto está claro que esto es una asignación compatible, ¿no?
00:04:54
Porque 15 es un número entero
00:04:56
15 es un número entero y se lo estoy asignando
00:04:58
A una variable entera
00:05:00
Es una asignación compatible
00:05:02
Claro, si yo le asigno algo
00:05:03
Que no es un número entero, me va a decir
00:05:06
No, no puedes
00:05:08
Si yo le hago 13.8
00:05:10
El punto
00:05:13
El punto
00:05:15
Es el carácter que usa Java
00:05:16
Como coma decimal, ¿vale?
00:05:18
No es la coma, es el punto
00:05:20
Bueno, pues entonces yo aquí
00:05:22
Estoy tratando de asignar 13.8
00:05:24
un número decimal a una variable que se entera
00:05:26
el compilador obviamente se queja
00:05:29
y dice, a ver, esta asignación
00:05:33
esta sentencia de asignación no es válida
00:05:35
porque esta variable la has declarado como entera
00:05:37
eso implica que solamente puede recibir
00:05:40
valores enteros, solamente
00:05:44
entonces estas son las implicaciones
00:05:47
de que Java sea un lenguaje tipado
00:05:51
que se llama, es decir, que compromete los tipos antes
00:05:53
La implicación que tiene es que condiciona mucho el código
00:05:56
Te dice, oye, número 1 a partir de ahora la tienes que asignar entero, sí o sí, no hay otra
00:06:01
Entonces eso podría uno pensar que es un poquito rígido
00:06:06
Y efectivamente lo es
00:06:10
A lo mejor se queda todo más abierto con un lenguaje de programación
00:06:11
En el cual yo digo, voy a utilizar una variable que se llame número 1
00:06:16
Y no digo qué tipo va a ser, simplemente digo que voy a utilizar una variable número 1
00:06:20
y luego le voy dando que ahora me interesa un entero
00:06:25
le doy un entero, que ahora me interesa un decimal
00:06:27
le doy un decimal
00:06:29
eso para el programador es más libre, es más abierto
00:06:30
le da mucha más libertad
00:06:33
va a ser más fácil escribir el código
00:06:34
pero puede
00:06:36
que a la hora de ejecutar las cosas
00:06:39
ocurran efectos
00:06:41
secundarios, cosas con las que no cuentas
00:06:43
de partida
00:06:45
porque como el lenguaje de programación te ha permitido hacer todo
00:06:46
a lo mejor tú has escrito algo mal
00:06:49
no querías poner aquí el puntito
00:06:51
y lo has puesto por error
00:06:52
Y no te lo detecta en fase de compilación
00:06:54
Porque como él te deja hacer de todo
00:06:57
En la fase de compilación no te lo ha detectado
00:06:59
Y es que tú a lo mejor te has equivocado
00:07:01
Luego llega el momento de ejecutarlo
00:07:03
Y te sale un error
00:07:06
Y tienes que encontrar dónde has ido
00:07:07
Y no es fácil encontrar qué es
00:07:09
Que tú te equivocaste en un momento
00:07:10
Y pusiste un punto donde no querías ponerlo
00:07:13
¿Vale?
00:07:15
Entonces de nuevo
00:07:17
Pongo de manifiesto
00:07:18
Este compromiso
00:07:21
entre lenguajes que te ponen muchas reglas, muchas restricciones
00:07:23
ahora de escribir código, que te limitan mucho
00:07:28
que esa fase te la hacen muy pesada, pero cuando consigues
00:07:32
completar todo un código, seguramente tengas muchos menos errores de ejecución
00:07:36
todo eso frente al otro extremo, lenguajes
00:07:40
que te lo dejan todo abierto, pero que
00:07:44
te puedes encontrar con cosas que tú no querías hacer, el lenguaje te ha dejado
00:07:47
hacerlas y luego tienes el problema cuando es más grave
00:07:52
que es cuando ya el programa
00:07:54
está entregado, ejecutándose, etcétera
00:07:56
cuando es más grave
00:07:58
vale, entonces bueno
00:07:59
son las dos filosofías
00:08:00
y cada lenguaje opta un poquito en función de
00:08:05
las aplicaciones prácticas que tiene cada lenguaje
00:08:08
suele optar un poquito por tender
00:08:10
más a una o por tender más a otra
00:08:12
aunque la tendencia normal es
00:08:13
a tiparlo quizá un poco
00:08:16
porque ahora mismo que las aplicaciones
00:08:18
las ejecutan millones de personas
00:08:20
pues en millones de condiciones
00:08:22
distintos, no es como antes
00:08:24
que a ti te pedía un cliente un software
00:08:26
y ese software lo ejecutaba su secretario
00:08:28
y su no se que
00:08:30
ahora la mayoría de las aplicaciones que hacemos
00:08:31
son aplicaciones que se ponen en el servidor web para que ejecute cualquiera
00:08:33
entonces queremos
00:08:36
como no controlamos, no podemos controlar
00:08:37
las condiciones en las que le van a ejecutar millones de personas
00:08:40
no podemos controlarlas
00:08:42
queremos programas
00:08:43
lo más
00:08:45
libre de errores posible
00:08:47
Para eso, si el lenguaje es más cerrado, mejor
00:08:49
Bueno, pues dicho este rollo
00:08:53
Venía esto a que si yo aquí le doy
00:08:55
Le asigno un valor que no es compatible con el tipo de dato
00:08:58
Ahí ya salta el error de compilación
00:09:02
Y si uno lo mirara aquí, pues diría
00:09:05
El tipo no coincide
00:09:08
Type mismatch, no puedo
00:09:10
Pues automáticamente, ah, sí, sí, es verdad
00:09:12
Que estoy asignando, no, que no es
00:09:15
¿Vale? Entonces, lo que pongamos aquí tiene que ser un tipo de dato igual que el que le hemos dicho aquí, ¿vale? Entonces, lo que pongamos aquí o bien es un valor a capón o bien es una expresión, algo cuya evaluación, cuya evaluación conduce a un valor de ese tipo, ¿vale?
00:09:16
Yo aquí estoy poniendo un valor directamente, pero podría poner cualquier expresión que a resultas de su evaluación, de la evaluación de esa expresión, el resultado final es un tipo de dato como el de la variedad declarada, ¿vale?
00:09:43
Por ejemplo, obviamente, yo puedo poner aquí, venga, ahora voy a cambiar número 2, la voy a cambiar y número 2 va a ser 65 por 9, ¿vale?
00:09:58
Entonces tenemos como siguiente parte, ahora un poquito después, ver cómo construir expresiones válidas, porque claro también hay reglas sintácticas para construir expresiones válidas, también hay reglas sintácticas, entonces tenemos que saber cuáles son las reglas que me da Java para construir expresiones válidas.
00:10:08
Bueno, algunas son de cajón
00:10:27
Los operadores más, menos, por y división
00:10:30
Pues son los de toda la vida
00:10:34
Entonces, a lo que íbamos
00:10:36
Lo que yo pongo a la derecha del operador de asignación
00:10:41
Puede ser cualquier expresión
00:10:44
Ya veremos que reglas para construir expresiones tenemos
00:10:47
Cualquier expresión
00:10:50
De tal forma que al evaluarla me dé un contenido válido
00:10:51
65 por 9, pues me da un valor entero
00:10:55
pues entonces lo puedo asignar
00:10:58
y siguiente salto
00:11:00
los valores que yo pongo aquí
00:11:03
pueden ser valores
00:11:06
directamente tal cual que yo los estoy escribiendo
00:11:07
o pueden ser a su vez variables
00:11:10
que es donde cobra interés
00:11:13
obviamente ya el código
00:11:15
por ejemplo yo quiero
00:11:17
que número 2 tenga
00:11:19
el doble de lo que tiene número 1
00:11:21
y yo no sé lo que tiene
00:11:23
número 1
00:11:25
vale, vamos a hacer que número 2 tenga el doble del valor que tiene número 1
00:11:26
no sabemos que valor tiene número 1, si lo supiéramos podríamos poner 2
00:11:53
por ese numerito que sabemos cual es, no lo sabemos
00:11:57
pero bueno, yo puedo construir una expresión
00:12:00
de asignación que sea esta, verdad, número 1 por 2
00:12:03
vale, y esta asignación de nuevo es perfectamente válida
00:12:09
Porque aquí hay una expresión que hay que evaluar y que me conduce a un número entero.
00:12:13
Entonces, siguiente salto, importantísimo y interiorizar.
00:12:20
Las expresiones que se ponen aquí para obtener valores, para asignar, esas expresiones pueden contener variables, por supuesto, no hay ningún problema.
00:12:26
Y entonces, ¿qué es lo que hace la máquina virtual de Java cuando ejecute esto?
00:12:37
Cuando se encuentra aquí un nombre, dice, uy, vamos a ver, número 1, esto tiene que ser una variable, pues se va a buscar si la variable está declarada, ay, sí, sí, qué bien, está declarada, porque si no estuviera, diría, uy, estás tratando de usar una variable que no existe, y te haría un error de compilación.
00:12:45
entonces lo primero que hace es
00:13:06
me estás diciendo que use
00:13:10
el valor de una variable, vale, vale
00:13:12
lo uso, voy a ver primero si la tienes
00:13:14
declarada, la tienes declarada, vale
00:13:16
ahora que ya ha verificado
00:13:18
que la tiene declarada, se va a buscar
00:13:20
el valor que tiene en este
00:13:22
momento, en el momento de ejecutar esta sentencia
00:13:24
el valor que tiene
00:13:26
se va a buscarlo, pues bueno
00:13:27
en este caso en particular la última
00:13:29
asignación que se hizo fue esta
00:13:32
esta fue la última que se hizo
00:13:33
Pues entonces, la máquina virtual lo que hace es
00:13:35
Coger el valor que tiene esta variable
00:13:40
Que en este caso concreto es 138
00:13:43
Pero bueno, porque es lo último que le hemos asignado
00:13:45
Multiplicarlo por 2
00:13:48
Y como eso devuelve un número entero
00:13:49
La asignación es perfectamente compatible
00:13:53
Y no da ningún error de compilación
00:13:56
Luego, este es el primer avance interesante
00:13:57
Que tenemos que tener claro
00:14:03
En la expresión que se pone, en la expresión que se usa para obtener el valor a asignar a una variable, a una variable, puede haber a su vez otras variables, ¿vale?
00:14:04
Y podría haber muchas más
00:14:34
Podría haber todas las variables involucradas que yo quisiera
00:14:37
Por ejemplo, podría poner esta expresión
00:14:42
Número 1 por 2 menos número 1
00:14:44
Podría perfectamente poner esta expresión
00:14:48
El contenido de la variable número 1
00:14:51
El contenido que tenga en ese momento lo multiplico por 2
00:14:55
Y el resultado le resto número 1
00:14:58
Perfectamente
00:14:59
Y no solo eso
00:15:01
podría incluso
00:15:04
usar
00:15:09
siguiente salto
00:15:11
importante de entender y tener claro
00:15:13
podría usar
00:15:16
en la expresión que
00:15:17
construyo
00:15:19
para obtener el valor a asignar
00:15:20
en la expresión que construyo, podría usar
00:15:23
la propia variable número 2
00:15:25
no hay ningún problema
00:15:27
vale, podría usarla
00:15:28
bueno, pues esta
00:15:31
Esta sentencia en particular, ¿qué es lo que implicaría a la hora de ejecutarla?
00:15:34
¿Qué es lo que haría la máquina virtual cuando se encontrara esta sentencia?
00:15:41
Pues primero, evalúa la expresión, evalúa la expresión con los valores que tenga número 1 y número 2 en ese momento.
00:15:45
En este momento, pues número 1 tiene lo que tuviera, 138, y número 2 tendrá lo que tenga, en este caso el resultado de haber hecho esto, lo que sea, me da igual.
00:15:54
Bueno, pues usa los últimos valores que tenía esas variables, los últimos que es el único que tiene, vamos, construye, evalúa la expresión, evalúa la expresión y una vez que ha obtenido el valor, lo asigna a número 2 pisando el que tuviera antes, ¿vale?
00:16:09
el que tuviera antes lo pisa, luego para evaluar la expresión coge el valor de número 2 que tenga en ese momento, lo evalúa y cuando ya lo tiene, número 2 se queda pisado por el nuevo valor, vale, por ejemplo, si esta fuera la situación, para hacer los cálculos rápido, resulta que yo ahora he hecho esto, yo ahora hago esto, esta asignación, pues me da igual los valores que hubiera de antes,
00:16:28
Número 1 y número 2 se quedan pisados
00:16:57
Y se quedan así
00:17:00
Vale, aquí tengo mis dos variables
00:17:02
Número 1 y número 2
00:17:21
A número 1 le he puesto un 4
00:17:22
Pues venga, a número 1 le he puesto un 4
00:17:24
Ala, ya tiene un 4
00:17:28
Lo que tuviera de antes se acabó
00:17:30
Imposible recuperar ese valor de antes
00:17:32
Se acabó, cuando uno hace una asignación
00:17:34
El valor anterior de la variable
00:17:36
Para siempre ha desaparecido
00:17:38
La variable se queda con el nuevo
00:17:39
Que yo doy, se queda con el nuevo
00:17:41
Luego a resultas de esto, número 1 se queda valiendo 4
00:17:43
Y lo que hubiera de antes, imposible recuperarlo
00:17:49
Vale, a resultas de esto, número 2 se queda valiendo 5
00:17:52
Y lo que hubiera de antes, imposible recuperarlo
00:17:57
Vale, ahora ya llega esta sentencia
00:18:02
Bueno, pues la máquina virtual primero se va aquí, primero se va ahí
00:18:05
es lo primero que mira, la parte derecha, la izquierda la ignora por el momento
00:18:09
y dice, vale, una expresión en la que me están dando
00:18:14
nombres que se supone que serán nombres de variables
00:18:19
vamos a verificar si están declaradas, ah pues sí, están declaradas
00:18:21
pues ahora voy a coger sus valores y voy a operar con ellos
00:18:26
el valor de número 1 es 4, pues coge 4, 4 por 2, 8
00:18:31
ahora me toca coger el valor de número 2, cojo número 2 que es 5
00:18:35
8 menos 5, 3, a número 2 va 3
00:18:39
Pues ya está, entonces ahora este valorcito 3
00:18:42
Lo usa para pisotear lo que hubiera en número 2
00:18:45
Y de lo que hubiera antes nunca más se supo
00:18:49
Entonces el resultado de esta expresión es que en número 2
00:18:51
Se queda ahora el 3
00:18:55
Se queda el 3 y ya está
00:19:02
¿Vale?
00:19:05
Bueno, ¿está claro?
00:19:11
Entonces, a la derecha de una asignación se puede poner cualquier expresión, siempre y cuando siga, use unos operadores y siga unas reglas que tendremos que ver.
00:19:13
Se puede poner cualquier expresión, punto uno.
00:19:26
Y punto dos, esa expresión a su vez puede involucrar variables, puede involucrarlas, claro, no hay problema, no tiene por qué ser siempre con valores que yo le ponga así a capón, puede involucrar variables.
00:19:29
Y para involucrar variables las referencio con su nombre
00:19:38
De ahí la importancia de declarar una variable y darle el nombre
00:19:42
Porque luego me tengo que poder referir a ella cuando la quiero usar
00:19:46
Pero yo puedo referirme de alguna manera
00:19:49
Pues me refiero a ella por su nombre
00:19:50
Bueno, pues esa expresión puede involucrar variables
00:19:53
Que quede muy clara obviamente la diferencia entre usar esta cadena de caracteres así y así
00:19:56
Así no tendría ningún sentido esta asignación
00:20:06
Cuando en Java y en cualquier lenguaje de programación prácticamente
00:20:11
Uno pone una cadena de caracteres entre comillada
00:20:15
Lo que está diciendo es
00:20:20
Esa cadena de caracteres literal tal cual
00:20:22
Eso, no el contenido de la variable que se llama así
00:20:25
No, sino esa cadena tal cual
00:20:28
Entonces aquí multiplicar una cadena de caracteres por dos
00:20:30
¿Qué sentido tiene eso? Ninguno
00:20:34
Una cadena de caracteres no se multiplica por dos, por dos se multiplican números, no se multiplica una cadena de caracteres.
00:20:36
Entonces, obviamente, aquí el compilador dice, pero ¿qué estás haciendo?
00:20:43
Si me lo entre comillas, no me estás diciendo la variable que se llama número uno, me estás diciendo la cadena de texto número uno.
00:20:46
Y esa cadena de texto, ¿qué sentido tiene multiplicarla por dos? Ninguno.
00:20:54
Esa cadena de texto puede tener su sentido en otras sentencias que queramos usar con cadenas de texto,
00:20:59
pero en esta obviamente ninguna
00:21:05
¿vale?
00:21:06
entonces sin entrecomillar
00:21:09
sin comillas dobles
00:21:11
solo hay una interpretación de eso
00:21:12
solo hay una
00:21:15
que es
00:21:16
el contenido de la variable que se llama así
00:21:18
¿vale?
00:21:21
cuando vemos un identificador
00:21:22
un identificador sin comillas
00:21:24
un identificador
00:21:27
solo tiene una interpretación
00:21:28
que es el contenido de la variable
00:21:30
que se llama así
00:21:32
y con ese contenido ya cogemos para operar y para hacer lo que toque
00:21:33
multiplicar, restar, sumar, dividir, lo que sea
00:21:38
y como consecuencia de esa expresión nos da un valorcito
00:21:41
y eso ya lo asignamos
00:21:44
vale, pues esto estamos con asignaciones
00:21:48
hasta aquí todo clarísimo
00:21:55
vale, esto
00:21:58
hay muchas posibilidades
00:22:01
desde los cuales os parezca
00:22:04
evidente
00:22:06
hasta los que nunca os hayáis
00:22:07
aproximado a ese tipo de cosas
00:22:10
y os pueda parecer algo evidente
00:22:11
pero si no lo volvéis a pensar
00:22:15
luego por vuestra cuenta, mañana ya
00:22:16
no lo hacéis mal
00:22:18
¿vale? entonces
00:22:19
cuidado con aunque os parezca
00:22:22
evidente, aunque os parezca
00:22:26
en algunos casos, si no habéis trabajado
00:22:28
nunca con esto
00:22:30
Luego tenéis que darle vuestro vistazo
00:22:31
Y interiorizarlo todo, siempre
00:22:33
Recordad que insisto
00:22:35
Vuestra parte es, ahora mismo
00:22:36
Atender y escuchar
00:22:39
Si algo no queda claro, preguntarme
00:22:41
En casa
00:22:44
Mirarlo y estudiarlo todo
00:22:45
Y a la cabeza
00:22:47
Y lo que no haya quedado claro
00:22:48
Después de ese proceso, al día siguiente preguntarlo
00:22:52
Esa es la parte vuestra
00:22:54
¿Vale?
00:22:55
Bueno, pues seguimos con asignaciones
00:22:58
asignaciones, matices de asignaciones
00:23:00
que tenemos que ir matizando
00:23:04
aquí claro, es que hay muchísimas cosas
00:23:08
que hay que ir incorporando, muchísimas cosas
00:23:11
hasta que se puede empezar a hacer unas cositas
00:23:14
y luego después si hay muchísimos contenidos que hay que ir incorporando
00:23:17
entonces bueno, vamos poco a poco
00:23:20
vale, pues más matices relacionados con asignaciones
00:23:23
Andrés me distraes
00:23:26
con el ruido de fondo
00:23:31
que me distraes con el ruido de fondo
00:23:35
hablando
00:23:37
vale, pues a ver
00:23:38
hemos dicho que
00:23:40
una asignación para que el compilador
00:23:42
no diga, ¿qué estás haciendo?
00:23:45
le tenemos que dar como valor de asignación
00:23:48
un valor del tipo de dato
00:23:50
que hay aquí
00:23:53
Bueno, esto tiene matices
00:23:54
Matices que nos dan un poquito de flexibilidad
00:23:58
Que son los matices que vamos a incorporar ahora
00:24:00
¿Vale? Lo voy a poner aquí
00:24:02
Luego este proyecto
00:24:04
Lo subo a la virtual
00:24:06
Por si a alguien los comentarios o algo le viene bien
00:24:08
Tenerlos ahí subidos
00:24:10
¿Vale?
00:24:12
Matices en cuanto a
00:24:16
La compatibilidad
00:24:18
de datos
00:24:21
en las
00:24:24
asignaciones
00:24:29
matices, vale
00:24:30
a ver, nosotros hemos dicho
00:24:32
que números
00:24:35
enteros
00:24:37
tenemos varias posibilidades
00:24:37
tenemos el tipo byte, el short, el
00:24:40
int y el long, ¿verdad? todo eso lo tenéis
00:24:43
memorizado
00:24:44
¿y por qué elegimos uno?
00:24:45
¿por qué elegimos otro? pues en función
00:24:49
de cómo de grande pueden llegar
00:24:50
a ser los números que van a
00:24:52
caer en esas variables
00:24:54
byte es que solo tiene 8 bits
00:24:55
ocupa poquito en memoria RAM, no molesta
00:24:58
pero con 8 bits hay muy poquitos números
00:25:00
que se puedan guardar, 2 elevado a 8
00:25:02
es poquito
00:25:04
con short un poquito más, 2 elevado a 16
00:25:05
pero short tampoco es muy grande
00:25:08
int es el que más se suele usar
00:25:10
porque son 32 bits, con 32 bits
00:25:12
se pueden codificar valores absolutos muy grandes
00:25:14
y con long muchos más
00:25:16
bueno pues entonces
00:25:18
int y long son relativamente usados
00:25:20
entonces
00:25:23
vamos a suponer que declaramos aquí una variable long
00:25:25
porque vamos a utilizar un número 3
00:25:27
una variable número 3
00:25:29
que preveo que va a tener valores muy grandotes
00:25:33
vale
00:25:35
bueno pues entonces
00:25:37
vamos a suponer
00:25:39
que a número 3
00:25:41
yo le voy a asignar ya directamente por ahorrar
00:25:42
una línea en la declaración
00:25:45
le voy a hacer
00:25:47
una primera asignación, lo que se llama inicializar
00:25:49
y le asigno el 6
00:25:51
entonces la máquina virtual lo que hace
00:25:52
cuando ve esta inicialización
00:25:55
pues coge ese 6
00:25:56
lo codifica binario
00:25:59
pero lo guarda en una variable de 64 bits
00:26:01
que es número 3
00:26:04
ahí están los 64 bits
00:26:05
aunque en este caso solamente están ocupados
00:26:07
los primeritos porque el 6 es muy pequeño
00:26:09
ahí están los 64 bits
00:26:12
bueno, entonces resulta
00:26:13
que yo ahora quiero a la variable
00:26:16
número 2
00:26:17
a la variable número 2
00:26:18
le quiero asignar lo que tenía la 3
00:26:21
esto en principio
00:26:24
tiene sentido, porque ambas
00:26:26
tienen números enteros, y resulta que
00:26:28
en algún momento de mi aplicación a mi me ha llegado una variable
00:26:29
long, me ha llegado una variable
00:26:32
y yo quiero recoger su valor en una variable mía
00:26:33
pero tengo restricciones en esa variable
00:26:35
mía y tiene que ser int, porque esa variable tiene que ser
00:26:38
int por cuestiones
00:26:40
varias, tengo restricciones
00:26:42
pero yo quiero recoger el valor que me han pasado
00:26:43
en esa, son situaciones
00:26:45
que se dan mucho cuando nos pasan valores a través de
00:26:48
métodos, cuando ya veamos lo que son métodos
00:26:50
o hoy te pasan un valor, te lo pasan
00:26:51
de un tipo que no puedes elegir, te lo pasan
00:26:54
del tipo que a él le dé la gana, no puedes
00:26:56
elegirlo y a lo mejor tampoco puedes
00:26:58
elegir la variable en la que cae el valor
00:27:00
que te han dado, a lo mejor no puedes elegirlo porque estás haciendo
00:27:02
una parte del programa y no puedes
00:27:04
modificar lo demás, bueno pues esa situación
00:27:05
esa situación muy habitual
00:27:08
cuando estamos utilizando código o cogiendo
00:27:09
podría ser esta
00:27:12
yo quiero asignar a mi variable
00:27:14
número 2, que está aquí declarada
00:27:16
y es entera
00:27:18
le quiero asignar
00:27:19
lo que tenga la variable número 3
00:27:22
y ambas son números enteros
00:27:24
entonces tendría sentido que yo quisiera
00:27:26
hacer esto, esto tiene sentido
00:27:28
es defendible
00:27:29
o sea, no sería defendible
00:27:31
si yo a una
00:27:34
variable boolean le quiero asignar
00:27:36
lo que me han pasado en una int
00:27:38
algo has diseñado mal en tu programa
00:27:40
es estúpido que tú quieras una variable boolean
00:27:42
asignarle lo que te lleva a una int, no tiene ningún sentido
00:27:44
la variable boolean solo puede tener true o false
00:27:46
eso
00:27:48
algo te has planteado muy mal en tu programa
00:27:49
pero que a una variable log
00:27:52
le quieras asignar
00:27:54
lo que te han traído en una int
00:27:55
o viceversa, si que tiene sentido
00:27:58
pues en números enteros
00:28:00
vale, pues eso es lo que vamos a hacer aquí
00:28:01
vamos a asignar a mi variable número 2
00:28:04
lo que me ha venido por la número 3
00:28:05
vale
00:28:07
yo hago esto
00:28:10
bueno, pues como podíais sospechar
00:28:11
Como podíais sospechar
00:28:14
El compilador
00:28:16
Que es muy
00:28:19
Toca pelotas
00:28:20
Pues dice
00:28:22
No, lo siento mucho
00:28:24
Dice
00:28:26
Lo siento, tipos
00:28:28
Los tipos no encajan
00:28:30
Ahí hay un mismatch
00:28:32
No encajan los tipos
00:28:34
No encajan
00:28:35
Pues sí, que sea tipado está muy bien
00:28:36
Pero no me puedo creer
00:28:40
Que yo no pueda asignar
00:28:42
un número entero a otro
00:28:44
¿cómo puede ser que no pueda ser un número entero a otro?
00:28:45
es que es demasiado, demasiado restringido
00:28:47
bueno, tiene sentido
00:28:50
que te haga esta restricción, tiene sentido
00:28:52
porque lo que te está diciendo es
00:28:54
cuidado
00:28:55
si yo te dejo hacer esta asignación
00:28:57
puede que pierdas información
00:29:00
porque número 3 aquí es 6
00:29:02
nosotros en este caso en particular
00:29:04
en este caso sabemos que no perderíamos
00:29:06
información porque el 6
00:29:08
cabe en 32 bits
00:29:09
¿verdad? el 6 cabe en 32
00:29:12
entonces yo puedo asignar
00:29:14
el 6 que en este caso
00:29:16
puntualmente tiene número 3
00:29:18
lo puedo asignar al número 2, porque cabe
00:29:20
pero si yo aquí en número 3
00:29:22
pongo un número muy grandote
00:29:24
me he pasado
00:29:26
bueno, es que no quiero
00:29:28
poner esto todavía, bueno, vamos a
00:29:37
pongo un número muy grandote
00:29:38
uno muy grande
00:29:40
que no cabe
00:29:42
en 32 bits
00:29:44
pongo uno muy grande que no cabe en 32 bits
00:29:46
tendría sentido el compilador se queje
00:29:48
porque me diría, oye, es que no cabe
00:29:50
yo vale, yo te guardo
00:29:53
los 32 bits menos significativos
00:29:55
de tu variable long
00:29:57
pero el número va a cambiar completamente
00:29:58
el número va a cambiar, vas a perder información, está claro, ¿no?
00:30:01
si 64 bits
00:30:03
solo nos quedamos
00:30:05
con los 32 primeros
00:30:07
si coincide que los 32 últimos eran 0
00:30:08
no pasa nada
00:30:11
como en el caso de 6, 69, no pasa nada
00:30:12
pero si no eran 0
00:30:14
hemos cambiado el número
00:30:16
entonces tiene sentido el compilador haga esto
00:30:17
¿vale? entonces la asignación
00:30:20
de long a int no te la deja hacer
00:30:22
no te la deja hacer
00:30:24
podemos hacer un apaño del que hablaremos luego
00:30:25
para que me deje porque yo tengo esa
00:30:28
restricción sí o sí y me han
00:30:30
dado un número en long y yo tengo
00:30:32
que guardar una variable en int para poder seguir
00:30:34
y me arriesgo, si alguna vez me lo pasan muy grande
00:30:36
pues me arriesgo a perder información
00:30:38
asumo que la mayoría de las veces no será tan grande
00:30:40
entonces tengo un truco
00:30:42
para poder saltarme este error
00:30:43
que veremos después, pero tiene sentido
00:30:46
que el compilador no me deje
00:30:48
¿vale? entonces esto
00:30:49
cuadra con lo que he
00:30:52
dicho antes de que las asignaciones
00:30:56
tienen que ser compatibles, lo que yo
00:30:58
asigno, mismo tipo de datos
00:31:00
que la variable a la que va a parar
00:31:02
pues cuadra con esto
00:31:04
que me está pasando aquí, cuadra
00:31:06
vale, pero claro y si yo luego al revés
00:31:07
si que no tendría sentido que el compilador se pusiera
00:31:10
pejiguero, o sea, si yo a una variable
00:31:14
long le asigno
00:31:16
una variable int
00:31:19
ahí no tiene sentido
00:31:20
que me diga, oye, no es el mismo tipo
00:31:22
porque es que ahí nunca se va a perder
00:31:24
información, ¿no? una variable int
00:31:26
ocupa 32 bits, si yo su valor
00:31:28
lo asigno a una long, lo único que va a
00:31:30
ocurrir es que los 32 más significativos
00:31:32
se van a rellenar con ceros, nada más
00:31:34
pero el valor de la variable
00:31:35
el valor absoluto no se va a tocar
00:31:38
va a ser perfectamente el mismo
00:31:39
entonces hombre, ahí ya si transige
00:31:42
vale
00:31:44
aquí ya si que transige
00:31:45
voy a dejar esto comentado
00:31:48
y si yo a número 3
00:31:49
le asigno
00:31:53
lo que tiene
00:31:55
número 2, aquí el compilador
00:32:02
no me dice nada
00:32:04
vale, se calla
00:32:05
y no es verdad
00:32:07
que el tipo sea el mismo
00:32:10
número 2 es tipo int y número 3
00:32:11
es tipo long
00:32:14
vale
00:32:15
Pues es que la excepción en la regla general que yo he dicho, la excepción en la regla general que el valor que se pone de asignación tiene que ser del mismo tipo asignado, la excepción es cuando tú puedes convertirlo sin perder información, cuando nunca vas a perder información.
00:32:17
hay muy pocas situaciones en las que eso ocurra
00:32:38
pues una es esta
00:32:41
que es la típica, la estándar
00:32:41
asignar un valor int a una variable long
00:32:44
se puede hacer
00:32:47
el compilador te deja, porque no quieres
00:32:49
información, y esto es lo que se llama
00:32:51
promoción automática
00:32:53
lo voy a escribir aquí en comentarios
00:32:54
vamos a ver
00:32:56
la siguiente asignación
00:32:57
no la podemos
00:33:03
hacer
00:33:07
porque podríamos perder
00:33:07
parte del valor
00:33:12
de
00:33:23
parte del
00:33:24
contenido de número 3
00:33:29
parte del contenido de número 3
00:33:35
si este
00:33:39
ocupa más de 32 bits
00:33:41
¿verdad?
00:33:43
aquí podríamos perderlo, si el valor de número 3
00:33:49
ocupa más de 32, que podría ser
00:33:51
porque es una variable log, lo perderíamos
00:33:53
entonces el compilador
00:33:55
no te deja, esta no te deja
00:33:57
Pero sin embargo
00:33:59
La siguiente
00:34:04
Si podemos
00:34:10
Porque nunca
00:34:12
Perderíamos
00:34:16
Información
00:34:20
Como lo queréis expresar
00:34:22
En el contenido de número 1
00:34:25
Perdón, de número 2
00:34:27
Número 2
00:34:30
Nunca lo perderíamos porque número 2
00:34:39
Son 32 bits
00:34:41
¿Vale?
00:34:42
Entonces, ¿qué es lo que hace la máquina virtual cuando ve eso?
00:34:44
Dice, estupendo, no pasa nada, número 2 es entero
00:34:47
Vale, no es long, bueno, no pasa nada
00:34:49
Pero el número 2 ocupa 32
00:34:52
Entonces no pasa nada, ¿qué es lo que hace?
00:34:53
Coge ese valor
00:34:56
Le pone los ceros que hagan falta
00:34:56
Hasta llegar a los 64
00:35:00
Y ahora ya ese valor ya almacenado
00:35:01
Como 64 bits, siendo el mismo
00:35:04
Si es 69, pues es de 9
00:35:06
Siendo el mismo, pero ya como 64 bits
00:35:07
Lo guarda en número 3
00:35:10
¿Vale? Pero lo amplía hasta 64 bits
00:35:12
porque lo tiene que guardar en la variable número 3
00:35:14
y número 2 por supuesto sigue siendo la variable entera
00:35:17
en ningún momento número 2 cambia ese tipo de datos
00:35:21
número 2 sigue siendo un espacio en RAM de 32
00:35:23
pero su contenido cuando se ha extraído su contenido para copiarlo
00:35:25
su contenido es el que se ha ampliado a 64
00:35:32
pero número 2 sigue siendo su espacio de 32
00:35:35
pues este proceso que hace la máquina virtual
00:35:37
que hemos dicho de coger el contenido, ampliarlo a 64
00:35:40
porque no pierde valor con eso
00:35:43
y llevarlo a número 3
00:35:45
esto es lo que se llama
00:35:47
promoción automática de variables
00:35:49
promoción automática
00:35:52
sin de variable
00:35:56
que eso es más confuso
00:35:58
promoción automática se llama
00:35:59
este es un caso en el que se hace y se puede hacer en algunos otros
00:36:01
vale bueno pues
00:36:07
vamos a
00:36:08
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 13
- Fecha:
- 25 de septiembre de 2023 - 12:53
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 36′ 10″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 690.25 MBytes