Después de la introducción que vimos en la entrada de ¿qué son las variables en Java?, ahora veremos que tipos de variable en Java tenemos.
A modo de introducción podríamos decir que tenemos variables clásicas y el resto de variables. Básicamente las variables clásicas son las primitivas y el resto de las variables son clases (lo cuál ya sabes lo que es) que será algo que veremos posteriormente.
¿Qué nombres podemos utilizar para declarar una variable?
Lo primero que tenemos que saber para declarar variables es que nombres de variables podemos utilizar para declarar variables de Java. Todas las variables deben de tener un nombre que cumpla con lo siguientes requisitos:
- No puedes utilizar un nombre que sea utilizado por el lenguaje de Java (por ejemplo el comando “break”) o un literal booleano que serían “true” o “false”.
- Puedes utilizar todos los carácteres Unicode pero no puede empezar con un número (Unicode es un conjunto de caracteres, de lo cual puedes obtener más información aquí).
- No puedes usar operadores como son +, -, ?, *.
Y finalmente hay otra cosa que habría que tener en cuenta que en Java hay una convención sobre como escribir código y que deberías seguir (aunque es algo que puedes escoger no hacer), y en este caso todas las variables deberían comenzar con una letra en minúscula y la letra inicial de cada palabra que forme el nombre completo tendría que comenzar con mayúscula. Por ejemplo: holaMundo.
¿Qué tipos de variables de Java hay?
Quizás recuerdes que hace un tiempo comenté que todo en Java son clases y objetos y bueno, es algo que no es totalmente cierto, porque en el comienzo de la vida de Java, se añadieron una serie de primitivas que son variables sin ser clases, pero con el tiempo han intentado pulir utilizar para ello unos objetos llamados Wrappers que podremos utilizar directamente dado que es ya una clase (básicamente un wrapper consiste en un envoltorio con el que puedes manejar algo de una manera diferente a como ha sido creado).
Podemos ver los tipos de primitivas que tiene Java en la tabla siguiente:
Nombre | Tipo y tamaño | Rango | Clase wrapper asociada |
---|---|---|---|
byte | integer, 8 bits | -2^7 to 2^7 - 1 | Byte |
short | integer, 16 bits | -2^15 to 2^15 - 1 | Short |
int | integer, 32 bits | -2^31 to 2^31 - 1 | Integer |
long | integer, 64 bits | -2^63 to 2^63 - 1 | Long |
float | real number, 32 bits | Float | |
double | real number, 64 bits | Double | |
char | unicode character, 16 bits | \u0000 to \uffff | Character |
boolean | boolean, 1 bit | true or false | Boolean |
Pero como siempre no hay una verdad absoluta, así que veremos algunas peculiaridades en las siguientes nota:
Nota 1: Si te fijas en el rango, verás que hay un valor mínimo y un valor máximo que son los máximos a los que puede llegar ese valor. Por ejemplo, para el tipo de variable byte, el valor oscila entre -2^7 y2^7 – 1 (el símbol ^ significa exponente), lo cual quiere decir que el rango es de -128 a 127.
Nota 2: La tabla también nos enseña que hay 8 primitivas y que cada primitiva tiene su propio wrapper. Este wrapper es una clase que puede almacenar el valor de ese tipo.
Nota 3: Desde la versión de Java 5, tenemos disponible el autoboxing y el autounboxing en las clases de wrapper. Estas palabras raras nos ofrecen una funcionalidad que nos facilita bastante la vida y es que podemos asignar directamente el valor de una primitiva a una clase wrapper (autoboxing) y que también podemos asignar directamente el valor a una primitiva desde una clase wrapper (autounboxing). Un poco lioso, ¿no? Lo mejor un ejemplo:
int intValue = 10; Integer testValue = intValue; int testIntValue = testValue;
Nota 4: Pero recuerda, aunque podemos utilizar los wrappers y pensar que las variables primitivas son clases, pero no lo son. Los wrappers son clases pero las primitivas no lo son y esto significa que puedes tener algunos problemas si no tienes cuidado, por ejemplo cuando quieres asignar el valor nulo a un objeto. Es posible hacer lo siguiente:
Integer testValue = null;
Pero no esto:
int testValue = null;
¿Qué es el valor null?
El valor null es nada… Bueno, realmente esto suena raro. Lo que significa es que estamos diciendo que un objeto en Java no existe. Esto es muy útil para hacer algunas comprobaciones (y para inicializar el objeto de alguna manera) pero también es peligroso. Imagina que intentas acceder al método de un objeto que es nulo, es decir, que no existe. No puedes hacerlo y, si lo intentas, verías un bonito error en la salida del sistema.
Y por último solo recordar lo que he dicho en la nota 4: podemos “manejar” un wrapper con un valor de null, pero una primitiva no puede hacerlo. Cuidado con ello, porque puede ser un dolor de cabeza.