¿Pasa Java por referencia?

¿Java realmente admite pasar por referencia?

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

Java usa pasar por valor, no por referencia …

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

Entonces == compara los valores de referencias para Objetos.

Para una explicación detallada, vea mi artículo “Java es Pass-By-Value, Dammit!”

http://javadude.com/articles/passbyvalue.htm

El punto de distinción es entre “pase ** – por referencia” y “paso a ** 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 terminología comp-sci académica, de la vieja escuela, relevante para FORTRAN, pass-by-reference significa que el código llamado tiene acceso (referencia) a una variable pasada por la persona que llama. 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) pass-by-value , que le da al código llamado una copia de los datos (sea lo que sea) conocidos por la persona 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 de memoria real similar a un puntero).

Java pasa los argumentos por valor (en el primer sentido), pero para los argumentos del 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 a0, List a1) { List foo = new List(); foo.add("everybody"); a0.set(0, "Goodbye"); a1 = foo; } // caller ... List l0 = new List(); l0.add("Hello"); List l1 = new List(); l1.add("world"); munge(l0, l1); ... 

A su regreso de munge , la primera lista de la persona que llama, l0 contendrá "Goodbye" . Una referencia a esa lista se pasó a munge , que llamó un método de mutación en ese objeto referido. (En otras palabras, a0 recibió una copia del valor de l0 , que era una referencia a una lista de cadenas que se modificó).

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

Si Java hubiera utilizado pass-by-reference, entonces al regresar, l1 habría contenido "everybody" porque a1 se habría referido a la variable l1 y no habría sido inicializado a una copia de su valor. Entonces la asignación a a1 también habría sido una asignación a l1 .

Este mismo tema fue discutido en otra pregunta , con ASCII-art para ilustrar la situación.

Java no usa pass-by-reference sino más bien pass-by-value. Los parámetros de valores primitivos se copian en la stack, así como también los punteros a los objetos.

El operador == debe usarse para comparar valores primitivos y para comparar referencias de objetos.

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

Para más detalles, ver: Parámetro que pasa en Java