Vamos a ver que es una variable primitiva y un objeto, y sus diferencias, en Java.
Explicación inicial
¿Recuerdas cuando el String
solía escribirse con mayúscula? Vamos a desentrañarlo rápidamente, ¿vale?
Por ahora, comprendemos que una variable guarda un valor (texto, número, etc.), y eso es correcto para las variables primitivas, pero para los objetos es diferente.
Imaginemos una especie de tabla mental que represente un poco cómo funciona todo por dentro (como la ^^RAM^^):
int numero = 2;
String nombre = "Pol";
Variable | Valor |
---|---|
numero | 2 |
nombre | 0x00 |
Es cierto, nombre no es igual a Pol
. Esto ocurre porque la variable numero
es de tipo primitivo, mientras que nombre
es un objeto. Déjame explicarlo con más detalle.
Variables primitivas
Las variables primitivas generalmente están en minúsculas, como int
, boolean
, etc. Cuando se les asigna un valor, este se guarda bajo el nombre de la variable, como se ha mostrado en la tabla anterior. Debes entender que ese nombre siempre corresponde a ese valor.
Objetos
Los objetos generalmente comienzan con mayúscula, como String
o los primitivos en mayúsculas: Int
, Boolean
.
Estos SÍ tienen el valor que les asignamos. De hecho, he omitido una tabla. Permíteme mostrarte cómo funciona realmente:
Variable | Valor |
---|---|
numero | 2 |
nombre | 0x00 |
Dirección | Objeto |
---|---|
0x00 | "Pol" |
Podemos ver que, en realidad, la variable nombre
no guarda el valor, sino una dirección. Para acceder al objeto, necesitamos consultar la segunda tabla y encontrar el valor asociado a la dirección.
Es un poco complejo, pero ten en cuenta que más adelante esto será muy útil.
Diferencias entre variables primitivas y objetos
Ahora sí, estamos listos para ver la clara diferencia. Vamos a declarar 4 variables y a hacer sus tablas:
int a = 5;
int b = a;
Integer c = 10;
Integer d = c;
Variable | Valor |
---|---|
a | 5 |
b | 5 |
c | 0x00 |
d | 0x00 |
Dirección | Objeto |
---|---|
0x00 | 10 |
Como se puede observar en la primera tabla, la asignación hace que b
tenga el mismo valor que a
, y d
tenga la referencia del objeto de c
.
a
y b
tienen su propio valor independiente. Si modificáramos a
, b
seguiría teniendo el valor 5.
c
y d
, en cambio, comparten valor, ya que la dirección asignada apunta al mismo objeto. Si ahora modificáramos c
y cambiamos el valor a 15
, d
también tendría el valor de 15
. Esto se debe a que hemos modificado el objeto en 0x00
, pero no la dirección en c
y d
.
Ahora bien, si asignamos 0
a d
, la historia cambia. Veámoslo en código y en las tablas:
d = 0;
Variable | Valor |
---|---|
a | 5 |
b | 5 |
c | 0x00 |
d | 0x01 |
Dirección | Objeto |
---|---|
0x00 | 15 |
0x01 | 0 |
Puedes observar que, al asignarle otro valor, automáticamente se ha creado el objeto en la segunda tabla y se le ha asignado una dirección. Esto es lo bueno de Java. Has de saber cómo funciona a nivel de código, pero no tienes que preocuparte de nada, ya que el lenguaje de programación se encarga de todo.
Si no te ha quedado muy claro o no lo has terminado de entender, no te preocupes. A medida que avances en el curso, todo irá encajando.