Juan Pablo Angamarca.
Existe comúnmente la creencia errónea de que en Java es posible pasar parámetros por referencia, y no es así. Java siempre pasa los parámetros por valor. Esta confusión se da debido a que todas las variables de objeto son referencias a objetos [1]. En el libro “The Java Programming Language” de Ken Arnold y James Gosling (autores de Java), sección 2.6.1., tenemos la siguiente cita: “There is exactly one parameter passing mode in Java – pass by value – and that helps keep things simple.” [2] (Existe un solo modo de paso de parámetros en Java – paso por valor – y eso ayuda a mantener las cosas simples.).
Antes de continuar, vamos a recordar cuáles son las definiciones de paso por valor y paso por referencia: [3]:
Paso por valor significa que cuando un argumento se pasa a una función, la función recibe una copia del valor original. Por lo tanto, si la función modifica el parámetro, sólo la copia cambia y el valor original permanece intacto.
Paso por referencia significa que cuando un argumento se pasa a una función, la función recibe la dirección de memoria del valor original, no la copia del valor. Por lo tanto, si la función modifica el parámetro, el valor original en el código que llamó a la función cambia.
Vamos a valernos de ejemplos para explicar el mecanismo con el que Java pasa parámetros a los métodos.








Es por referencia lo tengo muy comprobado:
los datos primitivos son los unicos que funcionan por valor. Pero todas las clases ya funcionan por referencia.
Si haces un new ya tienes una nueva dirección de memoria y puedes mandártelo por parámetro e implementarlo, en lo personal me gusta usar (this) para enviarse a si mismo.
En c++ usas un apuntador en java se usa el objeto en si.
por experiencia personal.
Juan Pablo, gracias por una explicación tan detallada.
Creo que la forma tan purista de explicarlo puede haber causado cierta confusión a los seguidores de java mas prácticos.
Intentaré no liarlo mas y reitero mi agradecimiento por tu esfuerzo y los gráficos tan claros:
En java todo son punteros, sólo que no hay necesidad de emplear la aritmética que hay en C para los mismos, en Java todo eso es automático.
Pasemos lo que pasemos como parámetro a una función, esta recibe una copia del puntero del parámetro, es decir, que los punteros son pasados por valor. Esto para Java no es relevante.
Cuando el parámetro que se pasa es un tipo primitivo (int, double, boolean) lo que se pasa es un puntero a una copia de su espacio de memoria, es decir, dentro de la función se trabaja la copia (el efecto es equivalente al de pasar el parámetro por valor).
Cuando el parámetro es un objeto, se pasa una copia del puntero al objeto (sin clonar el espacio de memoria del objeto, que sería un derroche de la misma y de tiempo de CPU), es decir, dentro de la función se trabaja sobre el espacio de memoria del objeto, actuando sobre el contenido del objeto (el efecto es equivalente al de pasar el parámetro por referencia).
Espero haber sido de ayuda