java-variables-tipos-primitivos

Variables y tipos primitivos en Java

  • 5 min

Una variable es un nombre asociado a un valor de un tipo concreto que el programa puede consultar o modificar.

Una vez que sabemos compilar y ejecutar, el siguiente paso lógico es aprender a guardar datos.

Si vienes de lenguajes como JavaScript o Python, aquí vas a notar el primer gran cambio de mentalidad. Java es un lenguaje de tipado estático y fuerte.

¿Qué significa esto? Que en Java, una variable es una caja diseñada para guardar un solo tipo de cosa.

  • Si defines una caja para guardar zapatos (int), no puedes intentar meter una camisa (String). El compilador te gritará antes incluso de intentar ejecutar el programa.

Esto, que al principio parece una limitación molesta, es en realidad una de las mayores ventajas de Java: el compilador te protege de cometer errores tontos de tipos.

¿Qué es una variable?

Una variable no es más que un espacio reservado en la memoria RAM para almacenar un valor que puede cambiar durante la ejecución del programa.

En Java, para usar una variable, primero debemos declararla (decirle al sistema: “resérvame espacio para un entero”) e inicializarla (darle un valor).

// Declaración
int edad;

// Inicialización
edad = 35;

// Todo en una línea (Lo más común)
int puntuacion = 100;
Copied!

Los tipos primitivos (the big 8)

En Java, todo son Objetos… excepto los tipos primitivos.

Por razones de rendimiento, Java mantiene 8 tipos de datos básicos que no son objetos. Son valores puros que se almacenan directamente en la memoria Stack (pila), lo que los hace extremadamente rápidos de procesar.

Se dividen en cuatro grupos: Enteros, Flotantes, Caracteres y Booleanos.

Números enteros (integer types)

Sirven para contar cosas que no tienen decimales. Hay 4 tipos, dependiendo de lo grande que sea el número que quieras guardar.

TipoTamañoRango AproximadoUso
byte8 bits-128 a 127Datos binarios crudos / Arrays masivos.
short16 bits-32,768 a 32,767Casi en desuso hoy en día.
int32 bits-2 mil millones a 2 mil millonesEl estándar. Úsalo por defecto.
long64 bitsGigantesco (9 trillones…)Para IDs de base de datos, timestamps, etc.

El tipo habitual es int. En Java, cuando escribes un número 10 en el código, el compilador asume que es un int.

Si quieres usar un long, debes poner una ‘L’ al final del número, porque si no, Java intentará tratarlo como un int y si es muy grande, dará error.

int habitantes = 45000000;
long distanciaEstrella = 9460730472580800L; // Fíjate en la 'L' final
Copied!

Números decimales (floating point types)

Para números con parte fraccionaria se utiliza el estándar IEEE 754.

TipoTamañoPrecisiónUso
float32 bits6-7 decimalesGráficos 3D, arrays de datos científicos.
double64 bits15-16 decimalesEl estándar. Úsalo para matemáticas generales.

Al igual que con los enteros, el rey aquí es el double. Java trata cualquier decimal (3.14) como un double por defecto. Si quieres forzar un float, debes usar la ‘f’.

double pi = 3.1415926535;
float gravedad = 9.8f; // Necesaria la 'f', si no, error de compilación
Copied!

El problema de la precisión Nunca, bajo ningún concepto, uses double o float para dinero. Los ordenadores guardan los decimales en binario y hay números que no se pueden representar exactamente (igual que 1/3 en decimal es 0.33333…).

Prueba a imprimir 0.1 + 0.2 en Java. Te dará 0.30000000000000004. Para cálculos financieros exactos, se usa una clase especial llamada BigDecimal.

Caracteres (char)

El tipo char se usa para almacenar un solo carácter. A diferencia de C++, donde un char es 1 byte (ASCII), en Java un char ocupa 2 bytes (16 bits) porque Java usa Unicode (UTF-16) internamente. Esto permite guardar caracteres chinos, emojis, etc.

Se definen siempre con comillas simples ' '.

char letra = 'A';
char simbolo = '@';
char unicode = '\u0041'; // Es la letra 'A' en código Unicode
Copied!

¡Cuidado! 'A' (char) no es lo mismo que "A" (String). Las comillas dobles indican una Cadena de caracteres, que es un Objeto, no un primitivo.

Booleanos (boolean)

El tipo más simple. Solo tiene dos valores posibles: true (verdadero) o false (falso).

Es la base de toda la lógica de control (condicionales y bucles) que veremos más adelante.

boolean esJavaDivertido = true;
boolean meGustaPHP = false;
Copied!

Curiosamente, el tamaño en memoria de un boolean no está estrictamente definido en la especificación de Java y depende de la implementación de la JVM, aunque lógicamente representa 1 bit de información.

Desbordamiento (overflow)

¿Qué pasa si intentas guardar un número más grande del que cabe en la caja? Imagina un byte (máximo 127).

byte numero = 127;
numero++; // Sumamos 1
System.out.println(numero); // ¿Resultado?
Copied!

El resultado no es 128. El resultado es -128. Al sumar 1, los bits dan la vuelta (como el cuentakilómetros de un coche viejo) y pasamos al valor negativo más bajo. Esto se llama Integer Overflow y es una fuente común de bugs.