En Java, el paso de parámetros es por valor.

28 06 2007

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.

[leer más…]


Acciones

Information

3 responses

17 04 2010
lucita287

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.

17 05 2010
Ko-Barde

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

2 01 2014
javaniaco

Hola a todos, excelente Articulo, eso que explicas Juan Pablo es algo que yo habia deducido con la practica pura(7 años programando JAVA), y en efecto, en palabras llanas, tu pasas solo el valor donde esta la refencia de memoria, y esta no cambiara mientras en el metodo no le hagas un igual( = ), asi que puedes hacer uso de los metodos publicos del objeto referenciado mientras no uses el igual dentro de tu metodo.

En extremadamente pocas palabras, para los objetos, cada que les haces un igual ( = ), apuntas a otra seccion de memoria, existente o nueva, segun sea el caso para el objeto a igualar…

SALUDOS y feliz 2014!!!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: