2008-12-19 15 views

Respuesta

10

Aquí es exactamente lo que está sucediendo.

Obj t[] = new Obj[10]; // 1 

Obj a = new Obj("a"); // 2 
t[0] = a; 

a = new Obj("b");  // 3 
t[1] = a;    // 4 
  1. se crea una matriz que puede contener 10 referencias a instancias de Obj. Llame a este obj01. Lo asigna al t. Tenga en cuenta que la variable t y el objeto real obj01 tienen una relación bastante informal.

  2. Crea una instancia de Obj, llame a este obj02. Asigne una referencia a este objeto a la variable a. Tenga en cuenta que la variable a y el objeto real obj02 tienen una relación bastante informal.

    También puso esta referencia en t[0]. Usted tiene un objeto conocido en dos lugares. El objeto obj02 (con un valor de "a") se conoce como a y también se conoce como t[0].

  3. Crea una instancia de Obj, llame a este obj03. Asigne una referencia a este nuevo objeto a la variable anterior a. Tenga en cuenta que la variable a y el objeto real obj03 tienen una relación bastante casual. a se usa para hacer referencia a obj02, pero ya no hace referencia a eso.

    Por lo tanto, obj01 (una matriz) se hace referencia en t; obj02 (y instancia de Obj) se conoce como t[0]; obj03 (una instancia de Obj) se conoce como a.

  4. Poner la referencia que está en a en t[1]. Por lo tanto, t[1] obtiene una referencia a obj03.

En este punto, todos los objetos están referenciados por variables que están dentro del alcance. Como todos los objetos tienen referencias, no se pueden recolectar como basura.

1

Cuando lo hace t [0] = a; usted asigna la dirección del objeto que creó mediante el nuevo Objeto ("a") en la matriz; cualquiera que sea la reutilización, una variable no cambiará el valor contenido en la matriz.

6

El problema es que Java no tiene punteros.

Cuando asigna una variable de objeto a otra, cambia a qué apunta esa variable, pero no a ninguna otra referencia que pueda tener.

Así:

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

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

// At this point, a = "b" 
// and b = "c" 

Como se puede ver, aunque se configura por primera a = b, cuando, a continuación de la serie B a ser un nuevo objeto, un todavía conserva la referencia al objeto antiguo.

+0

¿Qué es exactamente lo que uno esperaría y no un “problema ", actualmente. :) – Bombe

+0

Lo siento, debería haber dejado en claro que este es el comportamiento esperado. Característica de diseño de Java en lugar de un problema como tal. –

+0

Bueno, no tener punteros NO es un problema de Java. – OscarRyz

2

El valor de la matriz es solo una referencia. Es como hacer esto:

Obj a = new Obj("a"); 
Obj t0 = a; 
a = new Obj("b"); 

Al final, la variable t0 tiene el valor que se le dio en la línea 2 - es decir, una referencia a la primera Obj que se crea en la línea 1. El cambio del valor de la a variable no cambia el valor de t0.

Una vez que comprenda lo anterior, solo piense en una matriz como una colección de variables, p.

Obj[] t = new Obj[10]; 

es más o menos como declarar:

Obj t0, t1, t2, t3, t4, t5, t6, t7, t8, t9; 

(Hay un montón de diferencias, pero en el contexto de esta pregunta son similares.)

0

¿Por qué en Java, cuando accedo a t [0], me devuelve "a", en lugar de "b"?

Porque le dijo que mantenga una referencia al objeto con "a".

Java no manipular directamente los objetos. En cambio, yo uso tiene referencias de objeto. Pero esta referencia contiene el valor de la referencia (no la referencia) Entonces cuando asigna a t [0] el valor de a, ambos hacen referencia al mismo objeto.

Vamos a ver si esta foto lo explica mejor:

alt text http://img520.imageshack.us/img520/8857/referencesq4.png

En primer lugar, A y T [0] hacen referencia al mismo objeto.

Más tarde una gota que referencia pero t [0] no.

Al final a y t 1 referencia el mismo objeto y t [0] permanece sin cambios.

¿Esto se debe a la GC?

Sin

y puedo creo que es seguro hacerlo tal operación

Cuestiones relacionadas