class Numero { int i; } public class Asignacion { public static void main(String[] args) { Numero n1 = new Numero(); Numero n2 = new Numero(); n1.i = 15; n2.i = 45; System.out.println("a) n1.i: " + n1.i + ", n2.i: " + n2.i); n1 = n2; System.out.println("b) n1.i: " + n1.i + ", n2.i: " + n2.i); n1.i = 27; System.out.println("c) n1.i: " + n1.i + ", n2.i: " + n2.i); } } |
En el código fuente son definidas dos Clases, una de ellas (Numero
) simplemente contiene un campo, mientras la segunda (Asignacion
) incluye la lógica central del programa.
Dentro del método principal (main
) de la Clase principal (Asignacion
) es definida la siguiente secuencia de eventos:
Numero
a las cuales son asignadas las referencias n1 y n2.Aunque el comportamiento del programa anterior parece predecible, para muchas personas no familiarizadas con lenguajes orientados a Objetos puede resultar una sorpresa, la ejecución del programa anterior da como resultado:
a) n1.i: 15, n2.i: 45 b) n1.i: 45, n2.i: 45 c) n1.i: 27, n2.i: 27 |
Los primeros resultados no presentan sorpresa alguna, puesto que simplemente se imprimen los valores recién asignados; la segunda impresión puede resultar confusa y esto se debe a la asignación n1 = n2
.
Al utilizar la sintaxis n1 = n2
, se esta indicando que la referencia n1
apunte hacia aquella de n2
; al ser llevada acabo esta asignación el valor n1.i
cambia efectivamente hacia el mismo de n2.i
. El comportamiento anterior se debe a que fueron utilizadas referencias en la asignación de valores, la instancia de n1
fue efectivamente perdida, a partir de ese punto ambas referencias apuntan hacia la instancia del Objeto n2
; este mecanismo en Java es denominado aliasing y suele ser un poco difícil de entender para aquellos que inician en este lenguaje.
La tercer impresión es llevada acabo después de la asignación n1.i = 27
, al llevar acabo este proceso el valor n1.i
será modificado, así como el valor de n2.i
, puesto que ambas referencias apuntan hacia la misma instancia.
Para evitar aliasing y mantener las dos instancias de Objetos se utilizaría una asignación más explicita : n1.i = n2.i
; en la siguiente sección se observará un comportamiento de equivalencia que también puede resultar inusual para un programador no familiarizado con el lenguaje Java.