Buscar este blog

jueves, 29 de abril de 2010

Asignacion de Objetos

La asignación de tipos primitivos de datos es bastante sencilla y directa. Dado que el dato primitivo alberga el valor actual y no una referencia a un objeto, cuando se asignan primitivas se copian los contenidos de un sitio a otro. Por ejemplo, si se dice A = B para datos primitivos, los contenidos de B se copian a A. Si después se intenta modificar A, lógicamente B no se verá alterado por esta modificación. Como programador, esto es lo que debería esperarse en la mayoría de situaciones.
Sin embargo, cuando se asignan objetos, las cosas cambian. Siempre que se manipula un objeto, lo que se está manipulando es la referencia, por lo que al hacer una asignación "de un objeto a otro" se está, de hecho, copiando una referencia de un sitio a otro. Esto significa que si se escribe C = D siendo ambos objetos, se acaba con que tanto C como D apuntan al objeto al que originalmente sólo apuntaba D. El siguiente ejemplo demuestra esta afirmación.
class Numero {
  int i;
}

public class Asignacion {
  public static void main(String[] args) {
    Numero n1 = new Numero();
    Numero n2 = new Numero();
    n1.i = 9;
    n2.i = 47;
    System.out.println("1: n1.i: " + n1.i +
      ", n2.i: " + n2.i);
    n1 = n2;
    System.out.println("2: n1.i: " + n1.i +
      ", n2.i: " + n2.i);
    n1.i = 27;
    System.out.println("3: n1.i: " + n1.i +
      ", n2.i: " + n2.i);
  }
}

La clase Número es sencilla, y sus dos instancias (n1 y n2) se crean dentro del método main(). Al valor i de cada Número se le asigna un valor distinto, y posteriormente se asigna n2 a n1 , y se varía n1 . En muchos lenguajes de programación se esperaría que n1 y n2 fuesen independientes, pero dado que se ha asignado una referencia, he aquí la salida que se obtendrá:
Al cambiar el objeto n1 parece que se cambia el objeto n2 también. Esto ocurre porque, tanto n1 , como n2 contienen la misma referencia, que apunta al mismo objeto. (La referencia original que estaba en n1 que apuntaba al objeto que albergaba el valor 9 fue sobreescrita durante la asignación y, en consecuencia, se perdió; su objeto será eliminado por el recolector de basura.)
A este fenómeno se le suele denominar uso de alias y es una manera fundamental que tiene Java de trabajar con los objetos.

No hay comentarios:

Publicar un comentario