2011-05-02 13 views
5

Sé que Java realmente no usa el pase exacto por referencia, sino que pasa por copia de referencia. Esta es la razón por la cual una función de intercambio que acaba de tratar de intercambiar referencias no funcionaría en Java. ¿Un bucle for-each hace esto también? Por ejemplo, dado el siguiente código ...¿El Java para cada ciclo devuelve una referencia, o una copia de referencia?

for (Constraint c : getLeafNodes(constraintGraph)){ 
    c = new Constraint(); 
} 

... Quiero ir a través de una estructura de árbol de forma recursiva definida, y encontrar todos los nodos hoja. Cada nodo hoja debe reemplazarse con un nuevo nodo vacío. ¿Hará esto lo que espero, o simplemente establecerá una copia de la referencia a cada nodo hoja en un nuevo nodo?

Escribí un método similar en otra pieza de código que pasaba pruebas unitarias, lo que me hace pensar que un bucle for-each utiliza referencias, no copia de referencia, pero nuestro software de calidad de código lo marcaba como un almacén muerto a un local variable, error mayor.

Gracias.

+0

El bucle for-each no devuelve nada (¿a quién?). Tu pregunta no coincide con el título. –

Respuesta

10

No va a hacer cualquiera. Eso es similar a decir

Object c = getObject(); 
c = new Object(); 

Todo lo que hemos hecho es cambiar lo que se refiere a c. Esto no funcionaría incluso si Java admitido true pass-by-reference

+2

D'oh, tienes razón. No sé lo que estaba pensando. Debería recuperar el padre de cada hoja, y luego llamar a algún tipo de método parent.setChild (nuevo Constraint()). Gracias. – rybosome

0

No, no hará lo que esperas. c es una variable local que hace referencia/apunta a un elemento en la colección devuelta por getLeafNodes. Java no tiene el concepto de referencia que menciona, todo es una copia de referencia . Si sabes, por ejemplo, C o C++, piense en variables de objetos en java como punteros sin referencias.

4

Respuesta corta: referencia copia

Cuando se asigna la variable de un iterador, no va a ser reproducido a la colección. Vea el iterador como un acceso de solo lectura a la lista.

Java de bucle funciona exactamente como for-each bucle de C# 's, en el que el whileEnumerator puede moveNext se asignará a la variable local del elemento Current

Cuestiones relacionadas