En Java, las referencias son como punteros a objetos en la memoria. Es decir, una variable de tipo objeto no contiene directamente el objeto, sino que guarda una referencia que apunta al lugar donde está almacenado en la memoria.
Cuando creo una instancia de un objeto, lo que realmente sucede es que se reserva un bloque de memoria para ese objeto, y la variable que uso actúa como una especie de "puerta de acceso" a esa memoria. Por ejemplo:
Pelicula pelicula1 = new Pelicula("Avatar", 2009);
Aquí, lo que hice fue crear un nuevo objeto de la clase Pelicula
y guardar la referencia a ese objeto en la variable pelicula1
.
Es importante tener en cuenta que una referencia no es el objeto en sí, solo nos da acceso a él. Si paso esa referencia a un método o la asigno a otra variable, no estoy duplicando el objeto, simplemente estoy copiando la dirección de memoria. Por ejemplo:
Pelicula pelicula1 = new Pelicula("Avatar", 2009);
Pelicula pelicula2 = new Pelicula("The Matrix", 1999);
Pelicula pelicula3 = pelicula1;
En este caso, solo existen dos objetos reales en memoria. La variable pelicula3
no crea un nuevo objeto, sino que simplemente apunta al mismo objeto que pelicula1
.
Algo que siempre tomo en cuenta es que, al comparar objetos con ==
, en realidad estoy comparando las referencias, no el contenido. Por ejemplo:
Pelicula pelicula1 = new Pelicula("Avatar", 2009);
Pelicula pelicula2 = new Pelicula("Avatar", 2009);
if (pelicula1 == pelicula2) {
System.out.println("Iguales");
} else {
System.out.println("Diferentes");
}
Aunque ambos objetos contienen la misma información, el resultado será "Diferente", porque están almacenados en lugares distintos de la memoria. Por eso, si lo que quiero es comparar el contenido, debo usar el método equals()
.