domingo, 2 de mayo de 2010

Paso de Parametros de una función

Generalmente existen dos tipos de pasos de parámetros, Por Valor y Por Referencia.

Para los pasos por Valor, se crea una copia del parametro sobre el cual trabaja la función, por lo que cualquier cambio que hagamos al parámetro este cambio no se verá reflejado fuera de la función.

Para los pasos por Referencia, el parámetro dentro de la función copia la referencia de la variable (parametro real) que ha sido enviada por medio de este parametro (parametro formal) por lo que cualquier cambio del valor del parametro dentro de la función afectaría al valor de la variable original por lo que se ve reflejado desde fuera de la función.

Para el caso de Java, las variables de tipos de datos primitivos pasan por Valor, miestras que las varibles tipo objeto pasan por referencia.

Cuando se pasan Objetos, realmente pasa por valor su referencia, en el grafico a continuación se representa la referencia como una flecha, la variable A almacena una referencia al objeto, en este caso de clase Imaginario.


Si se crea una función en la cual tenemos un parametro llamado pA, y enviamos el objeto A, el parametro pA copia la referencia que se encuentra almacenada en A, es decir en este instante los dos elementos pA y A hacen referencia al mismo objeto, gracias a esto si desde pA se cambia el valor de algun atributo del objeto es decir ParteReal o ParteImaginaria el cambio se refleja hacia el exterior de la función, similar a un paso por referencia.



Pero, si se crea un nuevo objeto y se le asigna a pA, la variable A mantiene la referencia sin cambiar (paso por valor) en el exterior de la función, porque si bien es cierto pasa la referencia, pero esta referencia es pasada por valor, los cambios del objeto completo no se pueden llevar a cabo, ya que crearía una nueva referencia al objeto nuevo.


Por este motivo en varios sitios se indica que realmente para JAVA solo existe paso por varlor, ahora si lo que pasa es un valor ya sea numérico o cadena o lo que pasa es el valor de una referencia (en C++ llamado puntero) siempre es por valor.

No hay comentarios: