2011-07-23 24 views
5

Perdónenme si es un duplicado, parece que no encuentro nada que explique lo que estoy viendo bien.java copia de referencia nula

El siguiente programa:

Object a = new Object(); 
    Object b = a; 

    System.out.println("a: " + a); 
    System.out.println("b: " + b); 

    a = null; 

    System.out.println("a: " + a); 
    System.out.println("b: " + b); 

Rendimientos esto:

a: [email protected] 
b: [email protected] 
a: null 
b: [email protected] 

Pero QUÉ?!? Estoy tan confundido por esto. ¿No debería "b" estar haciendo referencia a "a"? Por lo tanto, si "a" ya no hace referencia a nada más (p. Ej .: nulo), ¿no debería "b"? Obviamente me falta algo fundamental aquí.

Gracias de antemano.

editar # 1

Creo que lo que me confundió fue estoy imprimiendo a cabo la dirección. Por alguna razón, en mi opinión, estaba imprimiendo algún valor mágico que indica los punteros \ referencias - cuando en realidad la configuración b = a no los está haciendo iguales, simplemente está creando un nuevo puntero al mismo lugar en el montón. Espero que esto ayude a alguien más.

Respuesta

8

b no hace referencia a a haciendo referencia al mismo objeto a hace referencia a cuando se realizó la asignación.

Sé que esto no es el mismo idioma, pero si usted está familiarizado con C, es como:

int someNum = 5; 
int * a = &someNum; // a points to someNum 
int * b = a; // b points to someNum too 
a = NULL; // a doesn't point to anything (points to address 0), b still points to someNum 

(que utiliza C, ya que le da un aspecto más claro de direcciones y referencias)

+0

Gracias. Con mucho, la explicación más clara: sabía que me estaba perdiendo algo bastante obvio; o tal vez necesitaba un refresco, DOH! – javamonkey79

+0

Me alegro de que salga claro :) – MByD

1

Tanto a como b son referencias a la instancia de objeto que usted creó. Significa que ambos apuntan a la misma área de memoria. Entonces destruyes una de estas referencias. Ahora apunta a nulo. Pero tanto el objeto como la segunda referencia a él b están vivos. Esto es lo que ves

4

permite echar una mirada detallada a lo que está sucediendo:

//A is pointing to a new Object lets assume memory location for 1 for simplicity 
Object a = new Object(); 
//B is now also pointing to memory location 1 
    Object b = a; 

//Both print the same they are both pointing to memory location 1 
    System.out.println("a: " + a); 
    System.out.println("b: " + b); 

//a is now pointing to null, but there is no change to b which is still pointing to memory location 1 
    a = null; 

    System.out.println("a: " + a); 
    System.out.println("b: " + b); 
1

una referencia a un nuevo objeto (Object a = new Object())
b referencia al mismo objeto como un (Object b = a)
una referencia nada (a=null)
b aún hace referencia al objeto

2
Object a = new Object(); 

Este li ne crea un nuevo objeto en el montón y pone una referencia en la variable a.

Object b = a; 

Java es pasar por valor, por lo que esta línea pasa/asigna el valor de referencia que en la variable b.

a = null; 

Esto significa que la variable a debería ya no apuntan a ese lugar en el montón, sino que debe apuntar a ninguna parte.Pero no debería significar que b apunta a ninguna parte, ya que pasamos la referencia por el valor, por lo que b todavía apunta a ese objeto en el montón.

La observación clave aquí es paso por valor. Dado que, esencialmente, fotocopiamos el valor de a en b, cambiar el original no afectará a la apariencia de la fotocopia, ya que ya se tomó.

3

Java siempre pasa por valor, eso es todo.

0

null no es premitive y es considerado como objeto, por lo que cuando se llama a a = null, a se referirá a nada mientras b sigue refiriéndose al mismo objeto new Object()

Cuestiones relacionadas