Seit Hamburg

Paso de parámetros a funciones en Java

En el paso de parámetros a funciones hay dos aproximaciones clásicas: el paso por valor y paso por referencia.

En el paso por valor se realiza una copia de los valores que se pasan, trabajando dentro de la función con la copia. Es por ello que cualquier cambio que sufran dentro, no repercute fuera de la función.

En el paso por referencia no se realiza dicha copia, por lo que las modificaciones de dentro de las funciones afectan a los parámetros y esos cambios permanecen al final de la función.

En Java el paso por parámetro es por valor, aunque los efectos son de paso por referencia cuando los argumentos son objetos. ¿cómo sucede eso? Pues es muy fácil, si una función tiene como argumento un tipo primitivo (int, float, etc…), en Java se realiza una copia para la función y cualquier cambio a dicho argumento no afecta a la variable original. Este paso de parámetros en Java está orientado a utilizar el valor de la variable para otros cálculos.

En el caso de los objetos es distinto. En realidad lo que sucede es que en Java siempre tenemos referencias a los objetos. Por eso al pasar a una función como argumento un objeto, pasamos la referencia al mismo, es decir, aunque se hace una copia para el paso por valor, como lo que se copia es una referencia, los cambios al objeto referenciado sí son visibles y afectan fuera de la función.

La única excepción es la clase String , cuyos objetos no son mutables. Cualquier modificación de un objeto String lleva aparejada la creación de una nueva instancia del objeto. Si deseamos el mismo comportamiento para el paso de parámetros del resto de objetos, tenemos que recurrir al objeto StringBuffer.

Comentarios originales:

Bueno, decir que la clase String es una excepción es algo equivocado. Efectivamente, la clase String es una clase inmutable, porque no se puede modificar el estado del objeto a través de ningún método del mismo. El objeto String inicializa su valor en el constructor y a partir de ese momento no cambia. Por lo tanto, como tu bien dices, cuando utilizamos el operador suma, ejemplo:

a = a + ” texto añadido.”;

Lo que se está haciendo es crear un nuevo objeto String con el resultado de concatenar el String a con en String ” texto añadido.”. Finalemente el operador de asignación hace que a deje de referenciar al antiguo String y apunte al objeto recién creado. Por supuesto, las otras referencias que puedan haber al antiguo a (en la función que llamo a esta) sigen apuntando al antiguo objeto.

Esto no es ninguna excepción, es simplemente el resultado lógico de la semantica de llamada de función de Java (paso por valor de la referencia) y de la semantica de las variables a objetos (las variables nunca son los objetos “en si” sino una referencia a los mismos).

Cualquier objeto inmutable reflejará este comportamiento.

Referencias:

http://www.error500.net/garbagecollector/java/paso_de_parmetros_a_funciones.html

Abril 28, 2008 - Publicado por backdoormann | programacion | | Aún no hay comentarios

Aún no hay comentarios.

Deja un comentario