Paso de parámetros en Java

logo java

El paso de parámetros, o comunicación de datos del algoritmo invocante al método invocado, puede hacerse de dos formas:

  • Por valor: los parámetros pasados al método no se modifican para fuera de este método.
  • Por referencia: los parámetros pasados al método sí se modifican para fuera de este método.

Los métodos, como sabes, pueden tener una serie de parámetros en su declaración, que se denominan parámetros formales.

Por ejemplo, un método que realice el cuadrado de un número (elevar a 2 este número), como se muestra a continuación:

public static double cuadrado(double n){
  return n*n;
}

En esta declaración del método, «n» es el parámetro formal.

Cuando el método se invoca, se le pasan entre paréntesis los valores de los parámetros y a éstos se les llama parámetros actuales, por ejemplo:

double resultado = cuadrado(4);

En esta invocación del método cuadrado(), el parámetro actual es 4.

Al invocar un método, los parámetros actuales son asignados a los parámetros formales en el mismo orden en el que fueron escritos. Dentro del método, los parámetros se utilizan como variables convencionales. Así, en el ejemplo anterior, dentro del método cuadrado(), el parámetro es, como una variable a la que se le hubiera asignado el valor 4.

Paso de parámetros por valor

En esta forma de realizar el paso de parámetros los valores que se pasan como parámetros permanecen en el ámbito del método que se ha invocado. Por lo tanto, cualquier modificación que sufra el parámetro a lo largo del método no se verá en el resto del programa.

Con el ejemplo del video se ha creado un método que modificaba el valor del parámetro del método, pero esta modificación no observa fuera del método, se puede ver a continuación:

public static void prueba(int n){
    n*=n;
}

La llamada sería por ejemplo de la siguiente forma:

int num = 9;
prueba(num);

Después de la llamada al método prueba() la variable num sigue teniendo un valor de 9.

Paso de parámetros por referencia

En el paso de parámetros por referencia se produce una ligadura entre parámetro actual y el parámetro formal. Así, si el parámetro formal se modifica dentro del método, el parámetro actual, propio del método invocador, también será modificado.

En Java, el paso por referencia NO existe, los argumentos se pasan siempre por valor. Pero cuando el argumento es un objeto en lugar de un tipo primitivo, lo que se pasa pro valor es una referencia, es decir, la posición que ocupa en memoria y, por lo tanto, podemos acceder y modificar su contenido desde el método.

Entonces, ¿en el caso de los objetos si existe el paso por referencia en Java?. La respuesta sigue siendo NO, porque nosotros no elegimos como pasar el argumento al método, simplemente se pasa así, por lo tanto tenemos una especie de paso por referencia, pero no como en otros lenguajes que eliges como pasar tus parámetros como es el caso de C. En este lenguaje podemos pasar parámetros por valor de la forma tradicional o pasar parámetros por referencia usando punteros.

En el video hemos visto como un objeto Persona se modificaba globalmente invocando un método, se muestra a continuación:

Persona p = new Persona("Persona 1");
System.out.println(p.getNombre());
prueba2(p);
System.out.println(p.getNombre());
public static void prueba2(Persona p){
    p.setNombre("Persona");
}

Resumiendo, el paso de parámetros en Java es siempre por valor pero al pasar objetos se envía la dirección de memoria del mismo, por lo que, en la práctica, funciona como si fuera por referencia. Así parece un paso de parámetros por referencia, y este es el motivo por el que muchos dicen que, en Java, los tipos primitivos se pasan por valor y los objetos y tipos complejos por referencia.

 

Deja un comentario