| En base a su ambiente, abra un Editor de Textos para generar el siguiente ejemplo. |
Código Fuente Asignacion.java
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);
}
}
|
Clase Asignacion
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:- Primeramente se generan dos instancias de la Clase
Numeroa las cuales son asignadas las referencias n1 y n2. - A través de dichas referencias son asignados los valores correspondientes al campo i de la Clase.
- Se imprime a pantalla el valor de cada campo de las dos instancias.
- Se asigna el valor de n2 a la instancia de n1.
- Se imprime a pantalla el valor de cada campo de las dos instancias.
- Se modifica el valor del campo en la instancia n1 al valor de 27.
- Se imprime a pantalla el valor de cada campo de las dos instancias.
- Primeramente se generan dos instancias de la Clase
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.
