¿Qué es una variable primitiva en Java? I – números enteros

Una variable primitiva en Java es, en pocas palabras, una manera de guardar un valor (ya sea un número, un carácter o un valor verdadero/falso) en tu código. A continuación te voy a explicar qué es una variable primitiva, de la manera más gráfica y menos técnica posible, y vas a aprender la diferencia entre un objeto y una variable primitiva. Y si vas a la pastelería más cercana y compras una caja de pasteles, ¡me lo pondrás más fácil!

More...

La primera diferencia visible entre un objeto y una variable primitiva es que los tipos de los objetos empiezan siempre por una letra mayúscula, mientras que una variable primitiva lo hace por una letra minúscula. Esta diferencia es más una convención que otra cosa; de hecho, puedes crear tus propios objetos con tipos en minúscula:

¿Qué diferencia existe entre un objeto y una variable primitiva en Java?

Como ya te expliqué en el artículo que publiqué sobre los objetos en Java, cuando instancias un objeto estás haciendo en realidad dos cosas:

  • check
    Estás instanciando el objeto propiamente dicho, y
  • check
    le estás asignando a ese objeto una referencia.

En cambio, cuando estás declarando una variable primitiva no estás ni instanciando un objeto (las variables primitivas no son objetos) ni estás asignando una referencia.

Para que te hagas una idea, mientras que puedes considerar un objeto en Java como un objeto real, con sus características y su comportamiento regulado por métodos, una variable primitiva en Java es como una caja de pasteles, en la que introduces un valor (un pastel).

Variable primitiva en Java

Lo siento; "donut" no es una variable primitiva válida 🙂

Una referencia es una "etiqueta" unida a un objeto. Una variable primitiva en Java es una cajita que contiene un valor.

Compártelo

¿Cuántas variable primitivas existen en Java?

A diferencia de los objetos, es imposible crear nuevos tipos de variables primitivas en Java. Es decir, puedes crear el objeto Lampara con las características que desees, pero no puedes crear el tipo primitivo lampara.

Existen 8 tipos primitivos (o variables primitivas) en Java. En la tabla que sigue te los muestro ordenados según el tipo de valor que se le pueden asignar.

Número enteros

Números decimales

Carácter

Valor verdadero/falso

No te asustes por las cifras; no necesitas saber el rango exacto de cada variable primitiva. Lo único que tienes que tener bien claro es qué tipo de valor se asocia con cada variable primitiva, ya que, si intentas "guardar" un número decimal en una "caja" int, el código no va a compilar. Es decir, si la caja es de donuts, no metas merengues.

¿Qué relación existe entre el tamaño en bits y el rango de una variable primitiva en Java?

Esta fue una de las cosas en el aprendizaje autodidacta que, cuando las descubres, poco te falta para salir a la calle gritando "¡Eureka!". En realidad es una tontería, como verás a continuación.

Sabes que el ordenador piensa en binario, ¿no? Es decir, que en la memoria no hay fotos, ni documentos de texto. Solo cadenas larguísimas de 1 y 0. Pues con Java pasa igual: tú puedes declarar una variable primitiva de tipo byte y asignarle el valor 3, pero eso no es lo que ocurre en las entrañas de la máquina.

Ahí abajo, Java no ve un 3. Lo que ve Java es 11, es decir, 3 en binario. ¿Recuerdas que te he dicho antes que una variable primitiva en Java es una cajita que contiene un valor? Pues, en este caso, la cajita de tipo byte tiene un tamaño de 8 bits:

Rango de byte en Java

El número 3 en binario ocupa solo dos bits:

Rango de byte en Java - número 3

Así, la cajita byte solo puede contener los números que "quepan" en esos 8 bits. El número más alto que puedes expresar en binario con 8 bits es 127 y, el menor, -128. Si intentas asignar a un byte un valor menor de -128 o mayor de 127, el código no te va compilar.

127 en binario

127 en binario

-128 en binario

-128 en binario

Conclusión: si en la caja caben cuatro pasteles, no intentes meter cinco.

¿Por qué, en binario, -128 es mayor que 127?​

La respuesta es porque el primer bit simboliza el signo: 0 para el signo positivo y 1 para el negativo. En este ejemplo hay solo 7 dígitos y el signo correspondiente:

-128 en binario (con signo)

-128 en binario (con signo)

127 en binario (con signo)

127 en binario (con signo)

Este es un ejemplo ilustrativo para que entiendas el rango de las variables primitivas en Java. Si quieres aprender más sobre el signo en los números binarios, échale un ojo a este artículo en la Wikipedia.

¿Y por qué -128, y no -127?

Porque, en total, en 8 bits se pueden expresar 256 cifras. Es decir, si tomas el número de posiciones de cada bit (2 posiciones, ya que el bit solo puede tener el valor 1 o 0) y lo multiplicas por sí mismo tantas veces como bits (8 veces, en este caso), obtienes el número de combinaciones posibles, que sería el tamaño de la cajita byte:

Calculo del rango a partir del tamaño

Dos dados de seis caras tienen 6 x 6 = 36 combinaciones

256 números caben en la cajita byte. Al dividirlo esta cifra entre dos, obtenemos 128. Así, tenemos 128 números de signo negativo. De los 128 restantes, tenemos el 0, y 127 números con signo positivo:

Rango total de un byte en Java

En el resto de variables primitivas el procedimiento es el mismo: el rango consiste en X números de signo negativo, un 0 y X - 1 números de signo positivo, siendo X el resultado de multiplicar 2 por sí mismo tantas veces como bits tenga el rango.

Otro ejemplo práctico con short

La cajita short tiene un tamaño de 16 bits:

0000 0000 0000 0000

Multiplicamos 2 por sí mismo 16 veces:

2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 = 65536 números caben en la cajita short.

Dividimos entre dos y obtenemos el rango:

65536 / 2 = 32768

Entonces, el rango de short va desde -32768 a 32767.

Todos los números enteros son int

Algo especial que tienen las variables primitivas en Java es que todos los números enteros son int. Es decir, siempre que utilizas un número entero, Java da por sentado que estás utilizando un int. Esto no es ningún problema si estás guardando ese número entero en una variable byte o short, siempre y cuando el número en cuestión no supere el rango de dichas cajitas, pero ¿y si guardas en la cajita long un valor que debería caber en long, pero que es demasiado grande para int? Te lo ilustro con un ejemplo:

El resultado: error de compilación. Imagínate que vas con tu caja a la pastelería, a comprar una tarta que cabe en la caja, pero que el pastelero te dice: No puedes llevarte la tarta en esa caja que traes, porque la tarta no cabe en la caja que tengo yo. No tiene ni pies ni cabeza, pero es así.

¿Por qué, si el rango de long alcanza hasta los 9 trillones? Porque el rango de int alcanza solo hasta los 2 mil millones, y todo número entero es variable de tipo int para Java. La solución consiste en añadir una "L" (en mayúscula o en minúscula, aunque la minúscula se puede confundir con un "1") al final del número entero:

Inserta una "L" al final de un valor asignado a una variable de tipo long, para evitar problemas de compilación si este valor supera el rango de int.

Compártelo

¿Has visto los guiones bajos que he utilizado? Son válidos siempre y cuando se encuentren entre dos dígitos (ni al final, ni al principio, ni entre un dígito y la coma decimal). Puedes colocar varios guiones bajos consecutivos; al imprimir el número no van a aparecer. Son muy útiles para números muy largos y puedes utilizarlos con cualquier variable primitiva, incluidos binario, octales y hexadecimales.

Cómo utilizar cifras en una base distinta a la decimal (binario, octal, hexadecimal)

Exacto: no solo puedes utilizar cifras en base decimal, sino también cifras en binario (ceros y unos, ya sabes), octal (utilizando los dígitos del 0 al 7) y hexadecimal (los dígitos del 0 al 9 y las letras A, B, C, D, E, F).

En los tres casos solo tienes que insertar un prefijo a la cifra, para que Java entienda que no es un número en base decimal (por si solo no lo va a entender, aunque el número contenga letras de la A a la F y sea evidente que es una cifra hexadecimal).

Binario

Primeros diez números en binario

1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010

Prefijo

Inserta 0b o 0B al principio del número

Octal

Primeros diez números en octal

1, 2, 3, 4, 5, 6, 7, 10, 11, 12

Prefijo

Inserta un cero ("0") al principio del número

Hexadecimal

Primeros veinte números en hexadecimal

1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13, 14

Prefijo

Inserta 0x o 0X al principio del número

Aquí tienes un ejemplo de cada:

El número 100 en cada una de las cuatro bases. ¿Cómo crees que se imprimirán? Introduce el código en tu IDE favorita, y ejecútalo, a ver qué pasa 🙂

Continuará...

En el próximo artículo seguiré explicándote todo lo que necesitas saber sobre las variables primitivas en Java, centrándome en las que me he dejado en el tintero: los tipos de números decimales, char y boolean.

¿Qué te han parecido las variables primitivas de Java? ¿Se te ocurre alguna trampa relacionada con ellas que podrían aparecer en el OCAJ8P?

Los recursos con los que yo superé el OCA con una puntuación del 92%

Si estás en serio con la programación en Java, te recomiendo dos recursos esenciales: el manual de Java que te muestro a la izquierda, y los exámenes de práctica de Enthuware. Son los que yo utilicé para obtener un 92% de puntuación.

También existen cursos en español en Udemy, y en inglés en Skillshare, Lynda y Udacity (en este último, gratuitos). Échale un vistazo al apartado Recursos para Java.

Deja una respuesta 0 comentarios

Utilizamos cookies propias y de terceros para realizar el análisis de la navegación de los usuarios y mejorar nuestros servicios. Si continúa navegando, consideramos que acepta su uso. Puede cambiar la configuración u obtener más información en nuestra política de cookies. ACEPTAR

Aviso de cookies