2009-02-26 21 views
10

¿Es Java realmente compatible con pasar por referencia?¿Pasa Java por referencia?

Si no es así, ¿por qué tenemos el operador == para encontrar dos objetos con la misma referencia?

+0

Llamar por referencia y pasar por referencia son lo mismo, ¿no? Si no, alguien puede cambiar la pregunta a lo que era. –

+0

Java admite copias de referencias (no las referencias originales), de modo que cualquier cambio en las referencias dentro del método no se refleja fuera de ella. Verifique esto: [Java - pase por referencia o pase por valor] (http://programmergate.com/java-pass-reference-pass-value/) –

Respuesta

14

Java utiliza paso por valor, no por referencia ...

Pero, para los tipos primitivos no el valor es el valor de la referencia.

So == compara los valores de las referencias para Objetos.

+0

Pero en el nivel de código de bytes tiene referencia ... ¿no? https://en.wikipedia.org/wiki/Java_bytecode –

3

Java no usa use pasa-por-referencia, sino más bien pasa-por-valor. Los parámetros de valores primitivos son copiados en a la pila, así como punteros a los objetos.

El operador == se debe utilizar para comparar valores primitivos y para comparar referencias de objeto.

2

respuesta corta es no. En Java solo hay un valor por pasaje, y cuando trabajas con objetos (por ejemplo, Object obj = new Object();), trabajas con referencias a objetos. Que pasa por valor

Para más detalles, ver: Parameter passing in Java

4

El punto de distinción es entre "pasan ** - por caso de referencia" y "pasar ing una referencia **". También a veces ves "call-by-..." y "pass-by -..." que se usan indistintamente. Para simplificar, me quedaré con "pasar por ...".

  1. En la vieja escuela académica, FORTRAN-relevante, la terminología comp-sci, pase por referencia significa que el código de llamada tiene acceso (referencia) a una variable pasada por el llamante. Asignar al parámetro formal en el código llamado en realidad hace una asignación a la variable de la persona que llama. La distinción es versus (entre otros) pase por valor, que le da al código llamado una copia de los datos (cualquiera que sea) conocidos por el que llama.

  2. En el mundo actual de OO relevante para Java, "tener una referencia" a un objeto significa poder llegar al objeto mismo. Esto se distingue de "tener un puntero" para enfatizar (entre otras cosas) que uno no hace "aritmética del puntero" en una referencia. (De hecho, una "referencia" en este sentido no necesariamente tiene que ser una dirección real de memoria puntero similar.)

Java pasa argumentos por valor (en el primer sentido), pero para los argumentos de objeto, el valor es una referencia (en el segundo sentido). Aquí hay un poco de código que depende de la diferencia.

// called 
public void munge(List<String> a0, List<String> a1) { 
    List<String> foo = new List<String>(); foo.add("everybody"); 
    a0.set(0, "Goodbye"); 
    a1 = foo; 
} 

// caller 
... 
List<String> l0 = new List<String>(); l0.add("Hello"); 
List<String> l1 = new List<String>(); l1.add("world"); 
munge(l0, l1); 
... 

Al regresar de munge, primera lista de la persona que llama, l0 contendrá "Goodbye". Se pasó una referencia a esa lista al munge, que llamó a un método de mutación en ese objeto referido.(En otras palabras, a0 recibió una copia del valor de l0, que era una una lista de cadenas referencia a que quedó modificado.)

Sin embargo, al regresar de munge, segunda lista de la persona que llama, l1 todavía contiene "world" porque no se invocaron métodos en la referencia del objeto pasado (el valor de l1, pasado por el valor a munge). En cambio, la variable de argumento a1 se estableció en un nuevo valor (la referencia de objeto local también se mantiene en foo).

SI Java había usado pase por referencia, a continuación, a su regreso, l1 habría contenido "everybody" porque a1 habría hecho referencia a la variable del1 y no simplemente han inicializado a una copia de su valor. Por lo tanto, la asignación a a1 también habría sido una asignación a l1.

Este mismo problema se discutió en another question, con ASCII-art para ilustrar la situación.

Cuestiones relacionadas