1 00:00:01,260 --> 00:00:25,920 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, 2 00:00:25,920 --> 00:00:32,500 que habíamos mencionado los únicos ocho tipos de datos en Java que hay 3 00:00:32,500 --> 00:00:36,820 que se les llama primitivos porque son los que vienen de serie 4 00:00:36,820 --> 00:00:38,859 y solo tenemos esos ocho, no hay más 5 00:00:38,859 --> 00:00:42,920 que luego queremos usar estructuras de datos más complejas 6 00:00:42,920 --> 00:00:49,899 como nombres, como conceptos, como una variable alumno 7 00:00:49,899 --> 00:00:52,299 que quiero que incluya su nombre, su edad 8 00:00:52,299 --> 00:00:57,560 Pues una variable alumno no tiene sentido porque no encaja con ninguno de los datos primitivos 9 00:00:57,560 --> 00:00:59,820 Pues habrá que inventarse algo 10 00:00:59,820 --> 00:01:02,560 Pues es inventarse algo más adelante 11 00:01:02,560 --> 00:01:05,739 Pero tipos de datos son estos, no hay más en Java 12 00:01:05,739 --> 00:01:07,540 Que son los llamados primitivos 13 00:01:07,540 --> 00:01:13,079 El tipo int era 1, así lo declarábamos 14 00:01:13,079 --> 00:01:15,019 Ahora ya con este le asigno valor 15 00:01:15,019 --> 00:01:21,000 Vimos que a la vez que declaro podemos ya de partida dar un valor si queremos 16 00:01:21,000 --> 00:01:23,780 una primera asignación, esto es lo que se suele 17 00:01:23,780 --> 00:01:25,980 llamar inicializar la variable 18 00:01:25,980 --> 00:01:27,640 inicializarla, que es 19 00:01:27,640 --> 00:01:29,719 darle su primer valor, inicializar 20 00:01:29,719 --> 00:01:31,620 una variable es darle su primer valor 21 00:01:31,620 --> 00:01:33,659 nada más, y luego ese valor puede 22 00:01:33,659 --> 00:01:35,620 cambiar todas las veces que haga 23 00:01:35,620 --> 00:01:37,980 falta, como consecuencia 24 00:01:37,980 --> 00:01:39,760 de que la máquina virtual ejecute esto 25 00:01:39,760 --> 00:01:41,159 en la cajita 26 00:01:41,159 --> 00:01:42,439 número 1 27 00:01:42,439 --> 00:01:45,079 se habrá creado el número 28 00:01:45,079 --> 00:01:46,000 habrá 29 00:01:46,000 --> 00:01:51,049 como consecuencia 30 00:01:51,049 --> 00:01:55,250 de la declaración ya sabemos que aquí 31 00:01:55,250 --> 00:02:12,819 se ha creado esta variable, esto ha pasado como consecuencia 32 00:02:12,819 --> 00:02:16,159 de esta declaración de aquí, se ha creado 33 00:02:16,159 --> 00:02:20,379 un espacio en memoria de ¿cuántos bits? 34 00:02:22,599 --> 00:02:23,520 ¿cuántos bits? 35 00:02:25,060 --> 00:02:26,840 después de esta declaración 36 00:02:26,840 --> 00:02:30,620 ¿cuántos? 32 37 00:02:30,620 --> 00:02:36,520 32, porque la variable entera int reservaba 32 bits 38 00:02:36,520 --> 00:02:39,939 bueno, pues cuando la máquina virtual ya ha entrado a ejecutar esto 39 00:02:39,939 --> 00:02:44,219 que va a poder hacerlo porque no tiene errores de compilación 40 00:02:44,219 --> 00:02:47,500 entonces podemos entrar a ejecutar esto, cuando haya entrado a ejecutarlo 41 00:02:47,500 --> 00:02:51,560 se habrá creado esta cajita de memoria de 32 bits 42 00:02:51,560 --> 00:02:54,599 se le habrá asociado un nombre 43 00:02:54,599 --> 00:03:00,139 y ahora ya las asignaciones, puede haber todas las que uno le dé la gana 44 00:03:00,139 --> 00:03:02,099 obviamente, con esta primera asignación 45 00:03:02,099 --> 00:03:04,139 que es la que se llama inicialización porque es la primera 46 00:03:04,139 --> 00:03:06,060 aquí ha ido a parar un 5 47 00:03:06,060 --> 00:03:08,360 vale, pues estupendo, ha ido a parar un 5 48 00:03:08,360 --> 00:03:10,340 que ahora después 49 00:03:10,340 --> 00:03:12,139 le asignamos un 15 50 00:03:12,139 --> 00:03:14,080 pues como consecuencia 51 00:03:14,080 --> 00:03:15,719 de la ejecución de esta sentencia 52 00:03:15,719 --> 00:03:17,400 este 5 53 00:03:17,400 --> 00:03:19,860 fuera, ha desaparecido 54 00:03:19,860 --> 00:03:23,879 y ahora ya ha aparecido 55 00:03:23,879 --> 00:03:25,740 un 15 56 00:03:25,740 --> 00:03:27,680 ¿no? ya está 57 00:03:27,680 --> 00:03:29,020 así funcionan las asignaciones 58 00:03:29,020 --> 00:03:33,240 cada vez que yo haga una asignación a la variable 59 00:03:33,240 --> 00:03:36,439 el valor que tenía de antes desaparece 60 00:03:36,439 --> 00:03:40,219 es pisado por el nuevo y ya está, así funcionan las asignaciones 61 00:03:40,219 --> 00:03:44,659 y recordad que su sintaxis siempre es esta 62 00:03:44,659 --> 00:03:47,740 nombre de la variable 63 00:03:47,740 --> 00:03:52,879 operador de asignación igual y a la izquierda 64 00:03:52,879 --> 00:03:57,139 del operador de asignación solo puede ir el nombre de la variable, no puede haber nada más 65 00:03:57,139 --> 00:03:58,319 el nombre de la variable 66 00:03:58,319 --> 00:04:00,039 que recibe el valor 67 00:04:00,039 --> 00:04:02,680 y a la derecha 68 00:04:02,680 --> 00:04:04,479 el valor que le damos 69 00:04:04,479 --> 00:04:06,460 ¿vale? el valor que le damos 70 00:04:06,460 --> 00:04:08,460 yo ahora mismo le estoy dando un valor 71 00:04:08,460 --> 00:04:11,060 así, a capón, el 15 72 00:04:11,060 --> 00:04:12,659 hombre 73 00:04:12,659 --> 00:04:15,419 para que esto sea un poquito más operativo 74 00:04:15,419 --> 00:04:16,000 obviamente 75 00:04:16,000 --> 00:04:18,079 y tenga más sentido 76 00:04:18,079 --> 00:04:20,120 ese valor pues vendrá 77 00:04:20,120 --> 00:04:21,759 de haber leído del teclado 78 00:04:21,759 --> 00:04:22,899 de haber leído de un fichero 79 00:04:22,899 --> 00:04:25,199 bueno, con los mecanismos que ya veremos 80 00:04:25,199 --> 00:04:26,819 el primero de todos es leer del teclado 81 00:04:26,819 --> 00:04:30,579 para que el usuario pueda meter el número que él quiera, claro, ¿vale? 82 00:04:30,579 --> 00:04:34,800 Pero yo ahora mismo, como todavía no sé leer del teclado, estoy probando a hacer las asignaciones 83 00:04:34,800 --> 00:04:39,379 a la cascándole un valor a palo seco, ¿vale? Venga, el 15, y así funciona, 84 00:04:40,000 --> 00:04:41,439 y así puedo hacer yo todas las que quiera. 85 00:04:43,480 --> 00:04:53,139 Aquí puedo cascar un valor a palo seco o cualquier cosa que como resultado de su evaluación me dé un valor. 86 00:04:54,420 --> 00:04:56,800 Esto está claro que esto es una asignación compatible, ¿no? 87 00:04:56,800 --> 00:04:58,220 Porque 15 es un número entero 88 00:04:58,220 --> 00:05:00,980 15 es un número entero y se lo estoy asignando 89 00:05:00,980 --> 00:05:02,620 A una variable entera 90 00:05:02,620 --> 00:05:03,819 Es una asignación compatible 91 00:05:03,819 --> 00:05:06,740 Claro, si yo le asigno algo 92 00:05:06,740 --> 00:05:08,779 Que no es un número entero, me va a decir 93 00:05:08,779 --> 00:05:10,639 No, no puedes 94 00:05:10,639 --> 00:05:13,600 Si yo le hago 13.8 95 00:05:13,600 --> 00:05:15,079 El punto 96 00:05:15,079 --> 00:05:16,560 El punto 97 00:05:16,560 --> 00:05:18,519 Es el carácter que usa Java 98 00:05:18,519 --> 00:05:20,600 Como coma decimal, ¿vale? 99 00:05:20,620 --> 00:05:22,180 No es la coma, es el punto 100 00:05:22,180 --> 00:05:24,540 Bueno, pues entonces yo aquí 101 00:05:24,540 --> 00:05:26,779 Estoy tratando de asignar 13.8 102 00:05:26,779 --> 00:05:29,079 un número decimal a una variable que se entera 103 00:05:29,079 --> 00:05:33,000 el compilador obviamente se queja 104 00:05:33,000 --> 00:05:35,139 y dice, a ver, esta asignación 105 00:05:35,139 --> 00:05:37,399 esta sentencia de asignación no es válida 106 00:05:37,399 --> 00:05:40,500 porque esta variable la has declarado como entera 107 00:05:40,500 --> 00:05:44,279 eso implica que solamente puede recibir 108 00:05:44,279 --> 00:05:47,420 valores enteros, solamente 109 00:05:47,420 --> 00:05:51,480 entonces estas son las implicaciones 110 00:05:51,480 --> 00:05:53,360 de que Java sea un lenguaje tipado 111 00:05:53,360 --> 00:05:56,420 que se llama, es decir, que compromete los tipos antes 112 00:05:56,420 --> 00:06:01,819 La implicación que tiene es que condiciona mucho el código 113 00:06:01,819 --> 00:06:06,240 Te dice, oye, número 1 a partir de ahora la tienes que asignar entero, sí o sí, no hay otra 114 00:06:06,240 --> 00:06:10,259 Entonces eso podría uno pensar que es un poquito rígido 115 00:06:10,259 --> 00:06:11,980 Y efectivamente lo es 116 00:06:11,980 --> 00:06:16,779 A lo mejor se queda todo más abierto con un lenguaje de programación 117 00:06:16,779 --> 00:06:20,160 En el cual yo digo, voy a utilizar una variable que se llame número 1 118 00:06:20,160 --> 00:06:25,040 Y no digo qué tipo va a ser, simplemente digo que voy a utilizar una variable número 1 119 00:06:25,040 --> 00:06:27,560 y luego le voy dando que ahora me interesa un entero 120 00:06:27,560 --> 00:06:29,500 le doy un entero, que ahora me interesa un decimal 121 00:06:29,500 --> 00:06:30,120 le doy un decimal 122 00:06:30,120 --> 00:06:33,500 eso para el programador es más libre, es más abierto 123 00:06:33,500 --> 00:06:34,600 le da mucha más libertad 124 00:06:34,600 --> 00:06:36,779 va a ser más fácil escribir el código 125 00:06:36,779 --> 00:06:39,220 pero puede 126 00:06:39,220 --> 00:06:41,279 que a la hora de ejecutar las cosas 127 00:06:41,279 --> 00:06:43,560 ocurran efectos 128 00:06:43,560 --> 00:06:45,540 secundarios, cosas con las que no cuentas 129 00:06:45,540 --> 00:06:46,120 de partida 130 00:06:46,120 --> 00:06:49,399 porque como el lenguaje de programación te ha permitido hacer todo 131 00:06:49,399 --> 00:06:51,339 a lo mejor tú has escrito algo mal 132 00:06:51,339 --> 00:06:52,680 no querías poner aquí el puntito 133 00:06:52,680 --> 00:06:54,759 y lo has puesto por error 134 00:06:54,759 --> 00:06:57,720 Y no te lo detecta en fase de compilación 135 00:06:57,720 --> 00:06:59,019 Porque como él te deja hacer de todo 136 00:06:59,019 --> 00:07:01,180 En la fase de compilación no te lo ha detectado 137 00:07:01,180 --> 00:07:03,259 Y es que tú a lo mejor te has equivocado 138 00:07:03,259 --> 00:07:06,279 Luego llega el momento de ejecutarlo 139 00:07:06,279 --> 00:07:07,819 Y te sale un error 140 00:07:07,819 --> 00:07:09,360 Y tienes que encontrar dónde has ido 141 00:07:09,360 --> 00:07:10,980 Y no es fácil encontrar qué es 142 00:07:10,980 --> 00:07:13,480 Que tú te equivocaste en un momento 143 00:07:13,480 --> 00:07:15,220 Y pusiste un punto donde no querías ponerlo 144 00:07:15,220 --> 00:07:16,680 ¿Vale? 145 00:07:17,399 --> 00:07:18,379 Entonces de nuevo 146 00:07:18,379 --> 00:07:21,180 Pongo de manifiesto 147 00:07:21,180 --> 00:07:23,980 Este compromiso 148 00:07:23,980 --> 00:07:28,660 entre lenguajes que te ponen muchas reglas, muchas restricciones 149 00:07:28,660 --> 00:07:32,639 ahora de escribir código, que te limitan mucho 150 00:07:32,639 --> 00:07:36,480 que esa fase te la hacen muy pesada, pero cuando consigues 151 00:07:36,480 --> 00:07:40,519 completar todo un código, seguramente tengas muchos menos errores de ejecución 152 00:07:40,519 --> 00:07:44,379 todo eso frente al otro extremo, lenguajes 153 00:07:44,379 --> 00:07:47,639 que te lo dejan todo abierto, pero que 154 00:07:47,639 --> 00:07:52,680 te puedes encontrar con cosas que tú no querías hacer, el lenguaje te ha dejado 155 00:07:52,680 --> 00:07:54,860 hacerlas y luego tienes el problema cuando es más grave 156 00:07:54,860 --> 00:07:56,439 que es cuando ya el programa 157 00:07:56,439 --> 00:07:58,279 está entregado, ejecutándose, etcétera 158 00:07:58,279 --> 00:07:59,000 cuando es más grave 159 00:07:59,000 --> 00:08:00,779 vale, entonces bueno 160 00:08:00,779 --> 00:08:05,740 son las dos filosofías 161 00:08:05,740 --> 00:08:08,019 y cada lenguaje opta un poquito en función de 162 00:08:08,019 --> 00:08:10,459 las aplicaciones prácticas que tiene cada lenguaje 163 00:08:10,459 --> 00:08:12,180 suele optar un poquito por tender 164 00:08:12,180 --> 00:08:13,800 más a una o por tender más a otra 165 00:08:13,800 --> 00:08:16,439 aunque la tendencia normal es 166 00:08:16,439 --> 00:08:18,620 a tiparlo quizá un poco 167 00:08:18,620 --> 00:08:20,680 porque ahora mismo que las aplicaciones 168 00:08:20,680 --> 00:08:22,800 las ejecutan millones de personas 169 00:08:22,800 --> 00:08:24,920 pues en millones de condiciones 170 00:08:24,920 --> 00:08:26,579 distintos, no es como antes 171 00:08:26,579 --> 00:08:28,060 que a ti te pedía un cliente un software 172 00:08:28,060 --> 00:08:30,899 y ese software lo ejecutaba su secretario 173 00:08:30,899 --> 00:08:31,560 y su no se que 174 00:08:31,560 --> 00:08:33,559 ahora la mayoría de las aplicaciones que hacemos 175 00:08:33,559 --> 00:08:36,240 son aplicaciones que se ponen en el servidor web para que ejecute cualquiera 176 00:08:36,240 --> 00:08:37,360 entonces queremos 177 00:08:37,360 --> 00:08:40,539 como no controlamos, no podemos controlar 178 00:08:40,539 --> 00:08:42,860 las condiciones en las que le van a ejecutar millones de personas 179 00:08:42,860 --> 00:08:43,960 no podemos controlarlas 180 00:08:43,960 --> 00:08:45,720 queremos programas 181 00:08:45,720 --> 00:08:47,259 lo más 182 00:08:47,259 --> 00:08:49,899 libre de errores posible 183 00:08:49,899 --> 00:08:53,139 Para eso, si el lenguaje es más cerrado, mejor 184 00:08:53,139 --> 00:08:55,019 Bueno, pues dicho este rollo 185 00:08:55,019 --> 00:08:58,600 Venía esto a que si yo aquí le doy 186 00:08:58,600 --> 00:09:02,960 Le asigno un valor que no es compatible con el tipo de dato 187 00:09:02,960 --> 00:09:05,720 Ahí ya salta el error de compilación 188 00:09:05,720 --> 00:09:08,460 Y si uno lo mirara aquí, pues diría 189 00:09:08,460 --> 00:09:10,559 El tipo no coincide 190 00:09:10,559 --> 00:09:12,700 Type mismatch, no puedo 191 00:09:12,700 --> 00:09:15,019 Pues automáticamente, ah, sí, sí, es verdad 192 00:09:15,019 --> 00:09:16,980 Que estoy asignando, no, que no es 193 00:09:16,980 --> 00:09:43,159 ¿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? 194 00:09:43,159 --> 00:09:57,320 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? 195 00:09:58,919 --> 00:10:08,480 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? 196 00:10:08,480 --> 00:10:27,480 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. 197 00:10:27,480 --> 00:10:30,539 Bueno, algunas son de cajón 198 00:10:30,539 --> 00:10:34,539 Los operadores más, menos, por y división 199 00:10:34,539 --> 00:10:36,539 Pues son los de toda la vida 200 00:10:36,539 --> 00:10:41,580 Entonces, a lo que íbamos 201 00:10:41,580 --> 00:10:44,480 Lo que yo pongo a la derecha del operador de asignación 202 00:10:44,480 --> 00:10:47,360 Puede ser cualquier expresión 203 00:10:47,360 --> 00:10:50,620 Ya veremos que reglas para construir expresiones tenemos 204 00:10:50,620 --> 00:10:51,500 Cualquier expresión 205 00:10:51,500 --> 00:10:55,200 De tal forma que al evaluarla me dé un contenido válido 206 00:10:55,200 --> 00:10:58,919 65 por 9, pues me da un valor entero 207 00:10:58,919 --> 00:11:00,480 pues entonces lo puedo asignar 208 00:11:00,480 --> 00:11:03,740 y siguiente salto 209 00:11:03,740 --> 00:11:06,100 los valores que yo pongo aquí 210 00:11:06,100 --> 00:11:07,720 pueden ser valores 211 00:11:07,720 --> 00:11:10,159 directamente tal cual que yo los estoy escribiendo 212 00:11:10,159 --> 00:11:13,539 o pueden ser a su vez variables 213 00:11:13,539 --> 00:11:15,919 que es donde cobra interés 214 00:11:15,919 --> 00:11:17,480 obviamente ya el código 215 00:11:17,480 --> 00:11:19,379 por ejemplo yo quiero 216 00:11:19,379 --> 00:11:21,220 que número 2 tenga 217 00:11:21,220 --> 00:11:23,360 el doble de lo que tiene número 1 218 00:11:23,360 --> 00:11:25,759 y yo no sé lo que tiene 219 00:11:25,759 --> 00:11:26,399 número 1 220 00:11:26,399 --> 00:11:53,049 vale, vamos a hacer que número 2 tenga el doble del valor que tiene número 1 221 00:11:53,049 --> 00:11:57,590 no sabemos que valor tiene número 1, si lo supiéramos podríamos poner 2 222 00:11:57,590 --> 00:12:00,129 por ese numerito que sabemos cual es, no lo sabemos 223 00:12:00,129 --> 00:12:03,230 pero bueno, yo puedo construir una expresión 224 00:12:03,230 --> 00:12:09,289 de asignación que sea esta, verdad, número 1 por 2 225 00:12:09,289 --> 00:12:13,610 vale, y esta asignación de nuevo es perfectamente válida 226 00:12:13,610 --> 00:12:19,909 Porque aquí hay una expresión que hay que evaluar y que me conduce a un número entero. 227 00:12:20,990 --> 00:12:25,049 Entonces, siguiente salto, importantísimo y interiorizar. 228 00:12:26,169 --> 00:12:37,149 Las expresiones que se ponen aquí para obtener valores, para asignar, esas expresiones pueden contener variables, por supuesto, no hay ningún problema. 229 00:12:37,149 --> 00:12:44,220 Y entonces, ¿qué es lo que hace la máquina virtual de Java cuando ejecute esto? 230 00:12:45,620 --> 00:13:06,759 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. 231 00:13:06,759 --> 00:13:10,120 entonces lo primero que hace es 232 00:13:10,120 --> 00:13:12,159 me estás diciendo que use 233 00:13:12,159 --> 00:13:14,139 el valor de una variable, vale, vale 234 00:13:14,139 --> 00:13:16,299 lo uso, voy a ver primero si la tienes 235 00:13:16,299 --> 00:13:18,259 declarada, la tienes declarada, vale 236 00:13:18,259 --> 00:13:20,259 ahora que ya ha verificado 237 00:13:20,259 --> 00:13:22,120 que la tiene declarada, se va a buscar 238 00:13:22,120 --> 00:13:24,159 el valor que tiene en este 239 00:13:24,159 --> 00:13:26,200 momento, en el momento de ejecutar esta sentencia 240 00:13:26,200 --> 00:13:27,039 el valor que tiene 241 00:13:27,039 --> 00:13:29,559 se va a buscarlo, pues bueno 242 00:13:29,559 --> 00:13:32,019 en este caso en particular la última 243 00:13:32,019 --> 00:13:33,639 asignación que se hizo fue esta 244 00:13:33,639 --> 00:13:35,379 esta fue la última que se hizo 245 00:13:35,379 --> 00:13:40,399 Pues entonces, la máquina virtual lo que hace es 246 00:13:40,399 --> 00:13:43,159 Coger el valor que tiene esta variable 247 00:13:43,159 --> 00:13:45,779 Que en este caso concreto es 138 248 00:13:45,779 --> 00:13:48,200 Pero bueno, porque es lo último que le hemos asignado 249 00:13:48,200 --> 00:13:49,940 Multiplicarlo por 2 250 00:13:49,940 --> 00:13:53,220 Y como eso devuelve un número entero 251 00:13:53,220 --> 00:13:56,059 La asignación es perfectamente compatible 252 00:13:56,059 --> 00:13:57,700 Y no da ningún error de compilación 253 00:13:57,700 --> 00:14:03,940 Luego, este es el primer avance interesante 254 00:14:03,940 --> 00:14:04,940 Que tenemos que tener claro 255 00:14:04,940 --> 00:14:34,789 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? 256 00:14:34,789 --> 00:14:37,789 Y podría haber muchas más 257 00:14:37,789 --> 00:14:42,769 Podría haber todas las variables involucradas que yo quisiera 258 00:14:42,769 --> 00:14:44,490 Por ejemplo, podría poner esta expresión 259 00:14:44,490 --> 00:14:48,629 Número 1 por 2 menos número 1 260 00:14:48,629 --> 00:14:51,370 Podría perfectamente poner esta expresión 261 00:14:51,370 --> 00:14:55,389 El contenido de la variable número 1 262 00:14:55,389 --> 00:14:58,049 El contenido que tenga en ese momento lo multiplico por 2 263 00:14:58,049 --> 00:14:59,990 Y el resultado le resto número 1 264 00:14:59,990 --> 00:15:01,429 Perfectamente 265 00:15:01,429 --> 00:15:04,779 Y no solo eso 266 00:15:04,779 --> 00:15:09,210 podría incluso 267 00:15:09,210 --> 00:15:11,750 usar 268 00:15:11,750 --> 00:15:13,970 siguiente salto 269 00:15:13,970 --> 00:15:16,269 importante de entender y tener claro 270 00:15:16,269 --> 00:15:17,769 podría usar 271 00:15:17,769 --> 00:15:19,230 en la expresión que 272 00:15:19,230 --> 00:15:20,870 construyo 273 00:15:20,870 --> 00:15:23,629 para obtener el valor a asignar 274 00:15:23,629 --> 00:15:25,690 en la expresión que construyo, podría usar 275 00:15:25,690 --> 00:15:27,169 la propia variable número 2 276 00:15:27,169 --> 00:15:28,769 no hay ningún problema 277 00:15:28,769 --> 00:15:31,529 vale, podría usarla 278 00:15:31,529 --> 00:15:34,389 bueno, pues esta 279 00:15:34,389 --> 00:15:41,370 Esta sentencia en particular, ¿qué es lo que implicaría a la hora de ejecutarla? 280 00:15:41,409 --> 00:15:44,450 ¿Qué es lo que haría la máquina virtual cuando se encontrara esta sentencia? 281 00:15:45,250 --> 00:15:54,210 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. 282 00:15:54,210 --> 00:16:09,190 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. 283 00:16:09,190 --> 00:16:28,470 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? 284 00:16:28,470 --> 00:16:57,870 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, 285 00:16:57,870 --> 00:17:00,909 Número 1 y número 2 se quedan pisados 286 00:17:00,909 --> 00:17:02,690 Y se quedan así 287 00:17:02,690 --> 00:17:21,150 Vale, aquí tengo mis dos variables 288 00:17:21,150 --> 00:17:22,470 Número 1 y número 2 289 00:17:22,470 --> 00:17:24,250 A número 1 le he puesto un 4 290 00:17:24,250 --> 00:17:28,869 Pues venga, a número 1 le he puesto un 4 291 00:17:28,869 --> 00:17:30,450 Ala, ya tiene un 4 292 00:17:30,450 --> 00:17:32,490 Lo que tuviera de antes se acabó 293 00:17:32,490 --> 00:17:34,529 Imposible recuperar ese valor de antes 294 00:17:34,529 --> 00:17:36,130 Se acabó, cuando uno hace una asignación 295 00:17:36,130 --> 00:17:38,210 El valor anterior de la variable 296 00:17:38,210 --> 00:17:39,690 Para siempre ha desaparecido 297 00:17:39,690 --> 00:17:41,309 La variable se queda con el nuevo 298 00:17:41,309 --> 00:17:43,349 Que yo doy, se queda con el nuevo 299 00:17:43,349 --> 00:17:49,190 Luego a resultas de esto, número 1 se queda valiendo 4 300 00:17:49,190 --> 00:17:52,549 Y lo que hubiera de antes, imposible recuperarlo 301 00:17:52,549 --> 00:17:57,609 Vale, a resultas de esto, número 2 se queda valiendo 5 302 00:17:57,609 --> 00:18:02,829 Y lo que hubiera de antes, imposible recuperarlo 303 00:18:02,829 --> 00:18:05,490 Vale, ahora ya llega esta sentencia 304 00:18:05,490 --> 00:18:09,890 Bueno, pues la máquina virtual primero se va aquí, primero se va ahí 305 00:18:09,890 --> 00:18:14,730 es lo primero que mira, la parte derecha, la izquierda la ignora por el momento 306 00:18:14,730 --> 00:18:19,009 y dice, vale, una expresión en la que me están dando 307 00:18:19,009 --> 00:18:21,730 nombres que se supone que serán nombres de variables 308 00:18:21,730 --> 00:18:26,470 vamos a verificar si están declaradas, ah pues sí, están declaradas 309 00:18:26,470 --> 00:18:31,390 pues ahora voy a coger sus valores y voy a operar con ellos 310 00:18:31,390 --> 00:18:35,130 el valor de número 1 es 4, pues coge 4, 4 por 2, 8 311 00:18:35,130 --> 00:18:39,230 ahora me toca coger el valor de número 2, cojo número 2 que es 5 312 00:18:39,230 --> 00:18:42,390 8 menos 5, 3, a número 2 va 3 313 00:18:42,390 --> 00:18:45,990 Pues ya está, entonces ahora este valorcito 3 314 00:18:45,990 --> 00:18:49,769 Lo usa para pisotear lo que hubiera en número 2 315 00:18:49,769 --> 00:18:51,809 Y de lo que hubiera antes nunca más se supo 316 00:18:51,809 --> 00:18:55,329 Entonces el resultado de esta expresión es que en número 2 317 00:18:55,329 --> 00:19:02,450 Se queda ahora el 3 318 00:19:02,450 --> 00:19:05,650 Se queda el 3 y ya está 319 00:19:05,650 --> 00:19:07,910 ¿Vale? 320 00:19:11,200 --> 00:19:12,160 Bueno, ¿está claro? 321 00:19:13,579 --> 00:19:25,720 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. 322 00:19:26,799 --> 00:19:28,839 Se puede poner cualquier expresión, punto uno. 323 00:19:29,339 --> 00:19:38,819 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. 324 00:19:38,819 --> 00:19:42,240 Y para involucrar variables las referencio con su nombre 325 00:19:42,240 --> 00:19:46,660 De ahí la importancia de declarar una variable y darle el nombre 326 00:19:46,660 --> 00:19:49,220 Porque luego me tengo que poder referir a ella cuando la quiero usar 327 00:19:49,220 --> 00:19:50,900 Pero yo puedo referirme de alguna manera 328 00:19:50,900 --> 00:19:53,279 Pues me refiero a ella por su nombre 329 00:19:53,279 --> 00:19:56,720 Bueno, pues esa expresión puede involucrar variables 330 00:19:56,720 --> 00:20:06,339 Que quede muy clara obviamente la diferencia entre usar esta cadena de caracteres así y así 331 00:20:06,339 --> 00:20:11,670 Así no tendría ningún sentido esta asignación 332 00:20:11,670 --> 00:20:15,690 Cuando en Java y en cualquier lenguaje de programación prácticamente 333 00:20:15,690 --> 00:20:20,529 Uno pone una cadena de caracteres entre comillada 334 00:20:20,529 --> 00:20:22,710 Lo que está diciendo es 335 00:20:22,710 --> 00:20:25,410 Esa cadena de caracteres literal tal cual 336 00:20:25,410 --> 00:20:28,829 Eso, no el contenido de la variable que se llama así 337 00:20:28,829 --> 00:20:30,730 No, sino esa cadena tal cual 338 00:20:30,730 --> 00:20:34,789 Entonces aquí multiplicar una cadena de caracteres por dos 339 00:20:34,789 --> 00:20:36,170 ¿Qué sentido tiene eso? Ninguno 340 00:20:36,170 --> 00:20:42,890 Una cadena de caracteres no se multiplica por dos, por dos se multiplican números, no se multiplica una cadena de caracteres. 341 00:20:43,589 --> 00:20:46,009 Entonces, obviamente, aquí el compilador dice, pero ¿qué estás haciendo? 342 00:20:46,009 --> 00:20:54,430 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. 343 00:20:54,690 --> 00:20:58,309 Y esa cadena de texto, ¿qué sentido tiene multiplicarla por dos? Ninguno. 344 00:20:59,329 --> 00:21:05,390 Esa cadena de texto puede tener su sentido en otras sentencias que queramos usar con cadenas de texto, 345 00:21:05,390 --> 00:21:06,710 pero en esta obviamente ninguna 346 00:21:06,710 --> 00:21:07,410 ¿vale? 347 00:21:09,250 --> 00:21:11,289 entonces sin entrecomillar 348 00:21:11,289 --> 00:21:12,670 sin comillas dobles 349 00:21:12,670 --> 00:21:15,509 solo hay una interpretación de eso 350 00:21:15,509 --> 00:21:16,569 solo hay una 351 00:21:16,569 --> 00:21:18,049 que es 352 00:21:18,049 --> 00:21:21,549 el contenido de la variable que se llama así 353 00:21:21,549 --> 00:21:22,910 ¿vale? 354 00:21:22,950 --> 00:21:24,970 cuando vemos un identificador 355 00:21:24,970 --> 00:21:27,029 un identificador sin comillas 356 00:21:27,029 --> 00:21:28,930 un identificador 357 00:21:28,930 --> 00:21:30,470 solo tiene una interpretación 358 00:21:30,470 --> 00:21:32,950 que es el contenido de la variable 359 00:21:32,950 --> 00:21:33,930 que se llama así 360 00:21:33,930 --> 00:21:38,150 y con ese contenido ya cogemos para operar y para hacer lo que toque 361 00:21:38,150 --> 00:21:41,490 multiplicar, restar, sumar, dividir, lo que sea 362 00:21:41,490 --> 00:21:44,829 y como consecuencia de esa expresión nos da un valorcito 363 00:21:44,829 --> 00:21:48,529 y eso ya lo asignamos 364 00:21:48,529 --> 00:21:55,160 vale, pues esto estamos con asignaciones 365 00:21:55,160 --> 00:21:58,980 hasta aquí todo clarísimo 366 00:21:58,980 --> 00:22:01,740 vale, esto 367 00:22:01,740 --> 00:22:04,420 hay muchas posibilidades 368 00:22:04,420 --> 00:22:06,599 desde los cuales os parezca 369 00:22:06,599 --> 00:22:07,319 evidente 370 00:22:07,319 --> 00:22:10,720 hasta los que nunca os hayáis 371 00:22:10,720 --> 00:22:11,880 aproximado a ese tipo de cosas 372 00:22:11,880 --> 00:22:15,039 y os pueda parecer algo evidente 373 00:22:15,039 --> 00:22:16,599 pero si no lo volvéis a pensar 374 00:22:16,599 --> 00:22:18,319 luego por vuestra cuenta, mañana ya 375 00:22:18,319 --> 00:22:19,660 no lo hacéis mal 376 00:22:19,660 --> 00:22:22,460 ¿vale? entonces 377 00:22:22,460 --> 00:22:26,380 cuidado con aunque os parezca 378 00:22:26,380 --> 00:22:28,380 evidente, aunque os parezca 379 00:22:28,380 --> 00:22:30,359 en algunos casos, si no habéis trabajado 380 00:22:30,359 --> 00:22:31,240 nunca con esto 381 00:22:31,240 --> 00:22:33,619 Luego tenéis que darle vuestro vistazo 382 00:22:33,619 --> 00:22:35,119 Y interiorizarlo todo, siempre 383 00:22:35,119 --> 00:22:36,240 Recordad que insisto 384 00:22:36,240 --> 00:22:39,079 Vuestra parte es, ahora mismo 385 00:22:39,079 --> 00:22:41,779 Atender y escuchar 386 00:22:41,779 --> 00:22:44,099 Si algo no queda claro, preguntarme 387 00:22:44,099 --> 00:22:45,599 En casa 388 00:22:45,599 --> 00:22:47,240 Mirarlo y estudiarlo todo 389 00:22:47,240 --> 00:22:48,160 Y a la cabeza 390 00:22:48,160 --> 00:22:52,240 Y lo que no haya quedado claro 391 00:22:52,240 --> 00:22:54,119 Después de ese proceso, al día siguiente preguntarlo 392 00:22:54,119 --> 00:22:55,759 Esa es la parte vuestra 393 00:22:55,759 --> 00:22:57,759 ¿Vale? 394 00:22:58,359 --> 00:23:00,400 Bueno, pues seguimos con asignaciones 395 00:23:00,400 --> 00:23:04,079 asignaciones, matices de asignaciones 396 00:23:04,079 --> 00:23:08,339 que tenemos que ir matizando 397 00:23:08,339 --> 00:23:11,960 aquí claro, es que hay muchísimas cosas 398 00:23:11,960 --> 00:23:14,400 que hay que ir incorporando, muchísimas cosas 399 00:23:14,400 --> 00:23:17,980 hasta que se puede empezar a hacer unas cositas 400 00:23:17,980 --> 00:23:20,579 y luego después si hay muchísimos contenidos que hay que ir incorporando 401 00:23:20,579 --> 00:23:23,000 entonces bueno, vamos poco a poco 402 00:23:23,000 --> 00:23:26,559 vale, pues más matices relacionados con asignaciones 403 00:23:26,559 --> 00:23:31,440 Andrés me distraes 404 00:23:31,440 --> 00:23:35,000 con el ruido de fondo 405 00:23:35,000 --> 00:23:37,319 que me distraes con el ruido de fondo 406 00:23:37,319 --> 00:23:38,359 hablando 407 00:23:38,359 --> 00:23:40,880 vale, pues a ver 408 00:23:40,880 --> 00:23:42,480 hemos dicho que 409 00:23:42,480 --> 00:23:45,180 una asignación para que el compilador 410 00:23:45,180 --> 00:23:47,200 no diga, ¿qué estás haciendo? 411 00:23:48,700 --> 00:23:50,779 le tenemos que dar como valor de asignación 412 00:23:50,779 --> 00:23:53,240 un valor del tipo de dato 413 00:23:53,240 --> 00:23:54,880 que hay aquí 414 00:23:54,880 --> 00:23:58,119 Bueno, esto tiene matices 415 00:23:58,119 --> 00:24:00,339 Matices que nos dan un poquito de flexibilidad 416 00:24:00,339 --> 00:24:02,960 Que son los matices que vamos a incorporar ahora 417 00:24:02,960 --> 00:24:04,180 ¿Vale? Lo voy a poner aquí 418 00:24:04,180 --> 00:24:06,559 Luego este proyecto 419 00:24:06,559 --> 00:24:08,819 Lo subo a la virtual 420 00:24:08,819 --> 00:24:10,720 Por si a alguien los comentarios o algo le viene bien 421 00:24:10,720 --> 00:24:12,799 Tenerlos ahí subidos 422 00:24:12,799 --> 00:24:13,279 ¿Vale? 423 00:24:16,039 --> 00:24:18,660 Matices en cuanto a 424 00:24:18,660 --> 00:24:21,960 La compatibilidad 425 00:24:21,960 --> 00:24:24,920 de datos 426 00:24:24,920 --> 00:24:29,289 en las 427 00:24:29,289 --> 00:24:30,789 asignaciones 428 00:24:30,789 --> 00:24:32,710 matices, vale 429 00:24:32,710 --> 00:24:35,170 a ver, nosotros hemos dicho 430 00:24:35,170 --> 00:24:37,130 que números 431 00:24:37,130 --> 00:24:37,809 enteros 432 00:24:37,809 --> 00:24:40,470 tenemos varias posibilidades 433 00:24:40,470 --> 00:24:43,190 tenemos el tipo byte, el short, el 434 00:24:43,190 --> 00:24:44,910 int y el long, ¿verdad? todo eso lo tenéis 435 00:24:44,910 --> 00:24:45,569 memorizado 436 00:24:45,569 --> 00:24:49,069 ¿y por qué elegimos uno? 437 00:24:49,069 --> 00:24:50,869 ¿por qué elegimos otro? pues en función 438 00:24:50,869 --> 00:24:52,910 de cómo de grande pueden llegar 439 00:24:52,910 --> 00:24:54,930 a ser los números que van a 440 00:24:54,930 --> 00:24:55,769 caer en esas variables 441 00:24:55,769 --> 00:24:58,930 byte es que solo tiene 8 bits 442 00:24:58,930 --> 00:25:00,710 ocupa poquito en memoria RAM, no molesta 443 00:25:00,710 --> 00:25:02,750 pero con 8 bits hay muy poquitos números 444 00:25:02,750 --> 00:25:04,769 que se puedan guardar, 2 elevado a 8 445 00:25:04,769 --> 00:25:05,289 es poquito 446 00:25:05,289 --> 00:25:08,910 con short un poquito más, 2 elevado a 16 447 00:25:08,910 --> 00:25:10,490 pero short tampoco es muy grande 448 00:25:10,490 --> 00:25:12,670 int es el que más se suele usar 449 00:25:12,670 --> 00:25:14,609 porque son 32 bits, con 32 bits 450 00:25:14,609 --> 00:25:16,730 se pueden codificar valores absolutos muy grandes 451 00:25:16,730 --> 00:25:18,529 y con long muchos más 452 00:25:18,529 --> 00:25:20,490 bueno pues entonces 453 00:25:20,490 --> 00:25:23,789 int y long son relativamente usados 454 00:25:23,789 --> 00:25:25,450 entonces 455 00:25:25,450 --> 00:25:27,589 vamos a suponer que declaramos aquí una variable long 456 00:25:27,589 --> 00:25:29,829 porque vamos a utilizar un número 3 457 00:25:29,829 --> 00:25:33,390 una variable número 3 458 00:25:33,390 --> 00:25:35,829 que preveo que va a tener valores muy grandotes 459 00:25:35,829 --> 00:25:37,009 vale 460 00:25:37,009 --> 00:25:39,349 bueno pues entonces 461 00:25:39,349 --> 00:25:41,869 vamos a suponer 462 00:25:41,869 --> 00:25:42,869 que a número 3 463 00:25:42,869 --> 00:25:45,529 yo le voy a asignar ya directamente por ahorrar 464 00:25:45,529 --> 00:25:47,890 una línea en la declaración 465 00:25:47,890 --> 00:25:49,690 le voy a hacer 466 00:25:49,690 --> 00:25:51,970 una primera asignación, lo que se llama inicializar 467 00:25:51,970 --> 00:25:52,970 y le asigno el 6 468 00:25:52,970 --> 00:25:55,589 entonces la máquina virtual lo que hace 469 00:25:55,589 --> 00:25:56,990 cuando ve esta inicialización 470 00:25:56,990 --> 00:25:59,589 pues coge ese 6 471 00:25:59,589 --> 00:26:01,250 lo codifica binario 472 00:26:01,250 --> 00:26:04,549 pero lo guarda en una variable de 64 bits 473 00:26:04,549 --> 00:26:05,930 que es número 3 474 00:26:05,930 --> 00:26:07,930 ahí están los 64 bits 475 00:26:07,930 --> 00:26:09,549 aunque en este caso solamente están ocupados 476 00:26:09,549 --> 00:26:12,210 los primeritos porque el 6 es muy pequeño 477 00:26:12,210 --> 00:26:13,950 ahí están los 64 bits 478 00:26:13,950 --> 00:26:16,470 bueno, entonces resulta 479 00:26:16,470 --> 00:26:17,990 que yo ahora quiero a la variable 480 00:26:17,990 --> 00:26:18,890 número 2 481 00:26:18,890 --> 00:26:21,890 a la variable número 2 482 00:26:21,890 --> 00:26:24,170 le quiero asignar lo que tenía la 3 483 00:26:24,170 --> 00:26:26,130 esto en principio 484 00:26:26,130 --> 00:26:28,029 tiene sentido, porque ambas 485 00:26:28,029 --> 00:26:29,990 tienen números enteros, y resulta que 486 00:26:29,990 --> 00:26:32,049 en algún momento de mi aplicación a mi me ha llegado una variable 487 00:26:32,049 --> 00:26:33,289 long, me ha llegado una variable 488 00:26:33,289 --> 00:26:35,910 y yo quiero recoger su valor en una variable mía 489 00:26:35,910 --> 00:26:38,230 pero tengo restricciones en esa variable 490 00:26:38,230 --> 00:26:40,150 mía y tiene que ser int, porque esa variable tiene que ser 491 00:26:40,150 --> 00:26:42,230 int por cuestiones 492 00:26:42,230 --> 00:26:43,890 varias, tengo restricciones 493 00:26:43,890 --> 00:26:45,890 pero yo quiero recoger el valor que me han pasado 494 00:26:45,890 --> 00:26:48,089 en esa, son situaciones 495 00:26:48,089 --> 00:26:50,089 que se dan mucho cuando nos pasan valores a través de 496 00:26:50,089 --> 00:26:51,910 métodos, cuando ya veamos lo que son métodos 497 00:26:51,910 --> 00:26:54,069 o hoy te pasan un valor, te lo pasan 498 00:26:54,069 --> 00:26:56,210 de un tipo que no puedes elegir, te lo pasan 499 00:26:56,210 --> 00:26:58,089 del tipo que a él le dé la gana, no puedes 500 00:26:58,089 --> 00:27:00,190 elegirlo y a lo mejor tampoco puedes 501 00:27:00,190 --> 00:27:02,089 elegir la variable en la que cae el valor 502 00:27:02,089 --> 00:27:04,130 que te han dado, a lo mejor no puedes elegirlo porque estás haciendo 503 00:27:04,130 --> 00:27:05,690 una parte del programa y no puedes 504 00:27:05,690 --> 00:27:08,230 modificar lo demás, bueno pues esa situación 505 00:27:08,230 --> 00:27:09,910 esa situación muy habitual 506 00:27:09,910 --> 00:27:12,009 cuando estamos utilizando código o cogiendo 507 00:27:12,009 --> 00:27:14,250 podría ser esta 508 00:27:14,250 --> 00:27:16,289 yo quiero asignar a mi variable 509 00:27:16,289 --> 00:27:18,730 número 2, que está aquí declarada 510 00:27:18,730 --> 00:27:19,470 y es entera 511 00:27:19,470 --> 00:27:22,650 le quiero asignar 512 00:27:22,650 --> 00:27:24,789 lo que tenga la variable número 3 513 00:27:24,789 --> 00:27:26,730 y ambas son números enteros 514 00:27:26,730 --> 00:27:28,509 entonces tendría sentido que yo quisiera 515 00:27:28,509 --> 00:27:29,970 hacer esto, esto tiene sentido 516 00:27:29,970 --> 00:27:31,130 es defendible 517 00:27:31,130 --> 00:27:34,490 o sea, no sería defendible 518 00:27:34,490 --> 00:27:36,569 si yo a una 519 00:27:36,569 --> 00:27:38,829 variable boolean le quiero asignar 520 00:27:38,829 --> 00:27:40,089 lo que me han pasado en una int 521 00:27:40,089 --> 00:27:42,470 algo has diseñado mal en tu programa 522 00:27:42,470 --> 00:27:44,269 es estúpido que tú quieras una variable boolean 523 00:27:44,269 --> 00:27:46,049 asignarle lo que te lleva a una int, no tiene ningún sentido 524 00:27:46,049 --> 00:27:48,250 la variable boolean solo puede tener true o false 525 00:27:48,250 --> 00:27:49,250 eso 526 00:27:49,250 --> 00:27:52,509 algo te has planteado muy mal en tu programa 527 00:27:52,509 --> 00:27:54,670 pero que a una variable log 528 00:27:54,670 --> 00:27:55,829 le quieras asignar 529 00:27:55,829 --> 00:27:58,509 lo que te han traído en una int 530 00:27:58,509 --> 00:28:00,490 o viceversa, si que tiene sentido 531 00:28:00,490 --> 00:28:01,470 pues en números enteros 532 00:28:01,470 --> 00:28:04,250 vale, pues eso es lo que vamos a hacer aquí 533 00:28:04,250 --> 00:28:05,910 vamos a asignar a mi variable número 2 534 00:28:05,910 --> 00:28:07,890 lo que me ha venido por la número 3 535 00:28:07,890 --> 00:28:10,069 vale 536 00:28:10,069 --> 00:28:11,309 yo hago esto 537 00:28:11,309 --> 00:28:14,730 bueno, pues como podíais sospechar 538 00:28:14,730 --> 00:28:16,130 Como podíais sospechar 539 00:28:16,130 --> 00:28:19,049 El compilador 540 00:28:19,049 --> 00:28:20,769 Que es muy 541 00:28:20,769 --> 00:28:22,849 Toca pelotas 542 00:28:22,849 --> 00:28:24,369 Pues dice 543 00:28:24,369 --> 00:28:26,710 No, lo siento mucho 544 00:28:26,710 --> 00:28:28,569 Dice 545 00:28:28,569 --> 00:28:30,789 Lo siento, tipos 546 00:28:30,789 --> 00:28:32,369 Los tipos no encajan 547 00:28:32,369 --> 00:28:34,309 Ahí hay un mismatch 548 00:28:34,309 --> 00:28:35,490 No encajan los tipos 549 00:28:35,490 --> 00:28:36,730 No encajan 550 00:28:36,730 --> 00:28:40,390 Pues sí, que sea tipado está muy bien 551 00:28:40,390 --> 00:28:42,809 Pero no me puedo creer 552 00:28:42,809 --> 00:28:44,150 Que yo no pueda asignar 553 00:28:44,150 --> 00:28:45,950 un número entero a otro 554 00:28:45,950 --> 00:28:47,809 ¿cómo puede ser que no pueda ser un número entero a otro? 555 00:28:47,869 --> 00:28:50,470 es que es demasiado, demasiado restringido 556 00:28:50,470 --> 00:28:52,410 bueno, tiene sentido 557 00:28:52,410 --> 00:28:54,170 que te haga esta restricción, tiene sentido 558 00:28:54,170 --> 00:28:55,930 porque lo que te está diciendo es 559 00:28:55,930 --> 00:28:57,029 cuidado 560 00:28:57,029 --> 00:29:00,410 si yo te dejo hacer esta asignación 561 00:29:00,410 --> 00:29:02,470 puede que pierdas información 562 00:29:02,470 --> 00:29:04,049 porque número 3 aquí es 6 563 00:29:04,049 --> 00:29:06,069 nosotros en este caso en particular 564 00:29:06,069 --> 00:29:08,470 en este caso sabemos que no perderíamos 565 00:29:08,470 --> 00:29:09,990 información porque el 6 566 00:29:09,990 --> 00:29:12,049 cabe en 32 bits 567 00:29:12,049 --> 00:29:14,569 ¿verdad? el 6 cabe en 32 568 00:29:14,569 --> 00:29:16,630 entonces yo puedo asignar 569 00:29:16,630 --> 00:29:18,450 el 6 que en este caso 570 00:29:18,450 --> 00:29:20,210 puntualmente tiene número 3 571 00:29:20,210 --> 00:29:22,150 lo puedo asignar al número 2, porque cabe 572 00:29:22,150 --> 00:29:24,650 pero si yo aquí en número 3 573 00:29:24,650 --> 00:29:26,569 pongo un número muy grandote 574 00:29:26,569 --> 00:29:28,730 me he pasado 575 00:29:28,730 --> 00:29:37,359 bueno, es que no quiero 576 00:29:37,359 --> 00:29:38,779 poner esto todavía, bueno, vamos a 577 00:29:38,779 --> 00:29:40,279 pongo un número muy grandote 578 00:29:40,279 --> 00:29:42,359 uno muy grande 579 00:29:42,359 --> 00:29:44,160 que no cabe 580 00:29:44,160 --> 00:29:46,299 en 32 bits 581 00:29:46,299 --> 00:29:48,700 pongo uno muy grande que no cabe en 32 bits 582 00:29:48,700 --> 00:29:50,819 tendría sentido el compilador se queje 583 00:29:50,819 --> 00:29:53,160 porque me diría, oye, es que no cabe 584 00:29:53,160 --> 00:29:55,180 yo vale, yo te guardo 585 00:29:55,180 --> 00:29:57,539 los 32 bits menos significativos 586 00:29:57,539 --> 00:29:58,440 de tu variable long 587 00:29:58,440 --> 00:30:01,000 pero el número va a cambiar completamente 588 00:30:01,000 --> 00:30:03,200 el número va a cambiar, vas a perder información, está claro, ¿no? 589 00:30:03,720 --> 00:30:05,299 si 64 bits 590 00:30:05,299 --> 00:30:07,240 solo nos quedamos 591 00:30:07,240 --> 00:30:08,420 con los 32 primeros 592 00:30:08,420 --> 00:30:11,519 si coincide que los 32 últimos eran 0 593 00:30:11,519 --> 00:30:12,579 no pasa nada 594 00:30:12,579 --> 00:30:14,759 como en el caso de 6, 69, no pasa nada 595 00:30:14,759 --> 00:30:16,519 pero si no eran 0 596 00:30:16,519 --> 00:30:17,960 hemos cambiado el número 597 00:30:17,960 --> 00:30:20,140 entonces tiene sentido el compilador haga esto 598 00:30:20,140 --> 00:30:22,480 ¿vale? entonces la asignación 599 00:30:22,480 --> 00:30:24,640 de long a int no te la deja hacer 600 00:30:24,640 --> 00:30:25,880 no te la deja hacer 601 00:30:25,880 --> 00:30:28,519 podemos hacer un apaño del que hablaremos luego 602 00:30:28,519 --> 00:30:30,319 para que me deje porque yo tengo esa 603 00:30:30,319 --> 00:30:32,380 restricción sí o sí y me han 604 00:30:32,380 --> 00:30:34,339 dado un número en long y yo tengo 605 00:30:34,339 --> 00:30:36,180 que guardar una variable en int para poder seguir 606 00:30:36,180 --> 00:30:38,460 y me arriesgo, si alguna vez me lo pasan muy grande 607 00:30:38,460 --> 00:30:40,400 pues me arriesgo a perder información 608 00:30:40,400 --> 00:30:42,319 asumo que la mayoría de las veces no será tan grande 609 00:30:42,319 --> 00:30:43,859 entonces tengo un truco 610 00:30:43,859 --> 00:30:46,160 para poder saltarme este error 611 00:30:46,160 --> 00:30:48,240 que veremos después, pero tiene sentido 612 00:30:48,240 --> 00:30:49,980 que el compilador no me deje 613 00:30:49,980 --> 00:30:52,059 ¿vale? entonces esto 614 00:30:52,059 --> 00:30:56,200 cuadra con lo que he 615 00:30:56,200 --> 00:30:58,000 dicho antes de que las asignaciones 616 00:30:58,000 --> 00:31:00,140 tienen que ser compatibles, lo que yo 617 00:31:00,140 --> 00:31:02,160 asigno, mismo tipo de datos 618 00:31:02,160 --> 00:31:04,579 que la variable a la que va a parar 619 00:31:04,579 --> 00:31:06,180 pues cuadra con esto 620 00:31:06,180 --> 00:31:07,380 que me está pasando aquí, cuadra 621 00:31:07,380 --> 00:31:10,579 vale, pero claro y si yo luego al revés 622 00:31:10,579 --> 00:31:14,000 si que no tendría sentido que el compilador se pusiera 623 00:31:14,000 --> 00:31:16,380 pejiguero, o sea, si yo a una variable 624 00:31:16,380 --> 00:31:18,380 long le asigno 625 00:31:19,039 --> 00:31:20,619 una variable int 626 00:31:20,619 --> 00:31:22,200 ahí no tiene sentido 627 00:31:22,200 --> 00:31:24,380 que me diga, oye, no es el mismo tipo 628 00:31:24,380 --> 00:31:26,319 porque es que ahí nunca se va a perder 629 00:31:26,319 --> 00:31:28,180 información, ¿no? una variable int 630 00:31:28,180 --> 00:31:30,319 ocupa 32 bits, si yo su valor 631 00:31:30,319 --> 00:31:32,420 lo asigno a una long, lo único que va a 632 00:31:32,420 --> 00:31:34,220 ocurrir es que los 32 más significativos 633 00:31:34,220 --> 00:31:35,700 se van a rellenar con ceros, nada más 634 00:31:35,700 --> 00:31:38,119 pero el valor de la variable 635 00:31:38,119 --> 00:31:39,980 el valor absoluto no se va a tocar 636 00:31:39,980 --> 00:31:42,019 va a ser perfectamente el mismo 637 00:31:42,019 --> 00:31:44,779 entonces hombre, ahí ya si transige 638 00:31:44,779 --> 00:31:45,799 vale 639 00:31:45,799 --> 00:31:48,299 aquí ya si que transige 640 00:31:48,299 --> 00:31:49,980 voy a dejar esto comentado 641 00:31:49,980 --> 00:31:53,279 y si yo a número 3 642 00:31:53,279 --> 00:31:55,519 le asigno 643 00:31:55,519 --> 00:32:02,450 lo que tiene 644 00:32:02,450 --> 00:32:04,529 número 2, aquí el compilador 645 00:32:04,529 --> 00:32:05,609 no me dice nada 646 00:32:05,609 --> 00:32:07,190 vale, se calla 647 00:32:07,190 --> 00:32:10,450 y no es verdad 648 00:32:10,450 --> 00:32:11,470 que el tipo sea el mismo 649 00:32:11,470 --> 00:32:14,490 número 2 es tipo int y número 3 650 00:32:14,490 --> 00:32:15,130 es tipo long 651 00:32:15,130 --> 00:32:17,450 vale 652 00:32:17,450 --> 00:32:38,190 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. 653 00:32:38,190 --> 00:32:41,089 hay muy pocas situaciones en las que eso ocurra 654 00:32:41,089 --> 00:32:41,990 pues una es esta 655 00:32:41,990 --> 00:32:44,910 que es la típica, la estándar 656 00:32:44,910 --> 00:32:47,730 asignar un valor int a una variable long 657 00:32:47,730 --> 00:32:49,109 se puede hacer 658 00:32:49,109 --> 00:32:51,009 el compilador te deja, porque no quieres 659 00:32:51,009 --> 00:32:53,190 información, y esto es lo que se llama 660 00:32:53,190 --> 00:32:54,250 promoción automática 661 00:32:54,250 --> 00:32:56,990 lo voy a escribir aquí en comentarios 662 00:32:56,990 --> 00:32:57,910 vamos a ver 663 00:32:57,910 --> 00:33:03,839 la siguiente asignación 664 00:33:03,839 --> 00:33:07,190 no la podemos 665 00:33:07,190 --> 00:33:07,710 hacer 666 00:33:07,710 --> 00:33:12,759 porque podríamos perder 667 00:33:12,759 --> 00:33:23,309 parte del valor 668 00:33:23,309 --> 00:33:24,670 de 669 00:33:24,670 --> 00:33:29,400 parte del 670 00:33:29,400 --> 00:33:35,529 contenido de número 3 671 00:33:35,529 --> 00:33:39,490 parte del contenido de número 3 672 00:33:39,490 --> 00:33:41,470 si este 673 00:33:41,470 --> 00:33:43,289 ocupa más de 32 bits 674 00:33:43,289 --> 00:33:43,630 ¿verdad? 675 00:33:49,279 --> 00:33:51,599 aquí podríamos perderlo, si el valor de número 3 676 00:33:51,599 --> 00:33:53,640 ocupa más de 32, que podría ser 677 00:33:53,640 --> 00:33:55,460 porque es una variable log, lo perderíamos 678 00:33:55,460 --> 00:33:57,160 entonces el compilador 679 00:33:57,160 --> 00:33:59,799 no te deja, esta no te deja 680 00:33:59,799 --> 00:34:04,220 Pero sin embargo 681 00:34:04,220 --> 00:34:10,659 La siguiente 682 00:34:10,659 --> 00:34:12,340 Si podemos 683 00:34:12,340 --> 00:34:16,929 Porque nunca 684 00:34:16,929 --> 00:34:20,250 Perderíamos 685 00:34:20,250 --> 00:34:22,650 Información 686 00:34:22,650 --> 00:34:25,170 Como lo queréis expresar 687 00:34:25,170 --> 00:34:27,230 En el contenido de número 1 688 00:34:27,230 --> 00:34:30,670 Perdón, de número 2 689 00:34:30,670 --> 00:34:39,900 Número 2 690 00:34:39,900 --> 00:34:41,800 Nunca lo perderíamos porque número 2 691 00:34:41,800 --> 00:34:42,980 Son 32 bits 692 00:34:42,980 --> 00:34:44,880 ¿Vale? 693 00:34:44,880 --> 00:34:47,539 Entonces, ¿qué es lo que hace la máquina virtual cuando ve eso? 694 00:34:47,599 --> 00:34:49,980 Dice, estupendo, no pasa nada, número 2 es entero 695 00:34:49,980 --> 00:34:52,159 Vale, no es long, bueno, no pasa nada 696 00:34:52,159 --> 00:34:53,760 Pero el número 2 ocupa 32 697 00:34:53,760 --> 00:34:55,420 Entonces no pasa nada, ¿qué es lo que hace? 698 00:34:56,099 --> 00:34:56,960 Coge ese valor 699 00:34:56,960 --> 00:35:00,079 Le pone los ceros que hagan falta 700 00:35:00,079 --> 00:35:01,659 Hasta llegar a los 64 701 00:35:01,659 --> 00:35:04,380 Y ahora ya ese valor ya almacenado 702 00:35:04,380 --> 00:35:06,199 Como 64 bits, siendo el mismo 703 00:35:06,199 --> 00:35:07,579 Si es 69, pues es de 9 704 00:35:07,579 --> 00:35:10,119 Siendo el mismo, pero ya como 64 bits 705 00:35:10,119 --> 00:35:12,000 Lo guarda en número 3 706 00:35:12,000 --> 00:35:14,820 ¿Vale? Pero lo amplía hasta 64 bits 707 00:35:14,820 --> 00:35:17,599 porque lo tiene que guardar en la variable número 3 708 00:35:17,599 --> 00:35:21,119 y número 2 por supuesto sigue siendo la variable entera 709 00:35:21,119 --> 00:35:23,539 en ningún momento número 2 cambia ese tipo de datos 710 00:35:23,539 --> 00:35:25,880 número 2 sigue siendo un espacio en RAM de 32 711 00:35:25,880 --> 00:35:32,059 pero su contenido cuando se ha extraído su contenido para copiarlo 712 00:35:32,059 --> 00:35:35,219 su contenido es el que se ha ampliado a 64 713 00:35:35,219 --> 00:35:37,480 pero número 2 sigue siendo su espacio de 32 714 00:35:37,480 --> 00:35:40,579 pues este proceso que hace la máquina virtual 715 00:35:40,579 --> 00:35:43,599 que hemos dicho de coger el contenido, ampliarlo a 64 716 00:35:43,599 --> 00:35:45,920 porque no pierde valor con eso 717 00:35:45,920 --> 00:35:47,739 y llevarlo a número 3 718 00:35:47,739 --> 00:35:49,280 esto es lo que se llama 719 00:35:49,280 --> 00:35:52,539 promoción automática de variables 720 00:35:52,539 --> 00:35:56,840 promoción automática 721 00:35:56,840 --> 00:35:58,099 sin de variable 722 00:35:58,099 --> 00:35:59,099 que eso es más confuso 723 00:35:59,099 --> 00:36:01,940 promoción automática se llama 724 00:36:01,940 --> 00:36:07,280 este es un caso en el que se hace y se puede hacer en algunos otros 725 00:36:07,280 --> 00:36:08,539 vale bueno pues 726 00:36:08,539 --> 00:36:09,699 vamos a