Se utiliza cuándo se requiere pasar el valor de una variable a una función y que está realize alguna operación sobre ese Valor, la función o método crea una Variable Local y trabaja sobre ella.
int a=5;
metodo(a):
void metodo(int c) {
System.out.println(c);
}
La variable c, es una variable local y que recibe una copia del valor de la variable a, es decir se pasa el parámetro por valor.
Paso por Referencia.
El paso por referencia en vez de mandar el valor de la variable, se mánda la dirección de memoria en la que se encuentra almacenada, para de está manera modificar el contenido de la variable. Sin embargo este tipo de paso de parámetros en Java no existe pero si lo quisieramos hacer en C++ sería algo así:
include <iostream>
using namespace std;
void funcion(int &a) {
a = 10;
}
int main() {
int var = 5;
funcion(&var);
cout <<>
}
El resultado de la ejecución sería, 10 ya que la variable 10 se pasa por referencia y la función modifica su valor.
Ahora regresando a lo importante ¿Cómo pasa los parámetros Java? En java sólo existe una forma de hacerlo y con el paso de parámetos por valor, aquí dejo un ejemplo de esto:
public class PasoPorValor {
public static void main(String [] args) {
int a = 20;
metodo(a);
System.out.println(a);
}
public static void metodo(int c) {
c = 10;
}
}
El valor de la variable a siempre es el mismo. Ahora veamos un ejemplo utilizando objetos, en este caso utilizaré un arreglo, ya que por definición los arreglos son objetos:
public class PasoPorValor {
public static void main(String [] args) {
int[] a = new int[1]; //declaramos un arreglo de una posición;
metodo(a);
System.out.println(a[0]);
}
public static void metodo(int[] c) {
c[0] = 10;
}
}
Pero que ocurrió!!! Por qué cambió el valor mi objeto? En realidad esto ocurre por la sencilla razón de que en Java las variables que apuntan a objetos, no son el objeto, sino una referencia al él, es decir en Java cuando hacemos esto:
int[] a = new int[1];
Estamos creando una referencia que tiene cómo identificador a y que el tipo de datos al que hace referencia es un arreglo de int y además ahí mismo con el operador new se crea el objeto, y por lo tanto la variable a, hará referencia a la locación de memoria de ese objeto.
Entonces cuándo el método recibe la referencia y lo modifica, estamos modificando el valor del objeto, pero ojo, esto no quiere decir que Java pase parámetros por referencia, sino que PASA EL VALOR DE LA REFERENCIA
Si Java pasara valores por referencia cuándo hacemos esto:
public class PasoPorValor {
public static void main(String [] args) {
String a = "Hola";
metodo(a);
System.out.println(a);
}
public static void metodo(String c) {
c = "Nuevo Objeto";
}
}
El resultado debería ser "Nuevo Objeto" Sin embargo esto no sucede por la simple y sencilla razón de que Java sólo pasa parámetros por valor
Espero con esto quede un poco más claro cómo pasa los parámetros Java
Saludos
Hola, los String no cambian y no es porque no sean un objeto sino porque son los únicos objetos que no se inmutan, pueden leer este link para más detalles, Saludos
ResponderEliminarhttp://www.adrformacion.com/cursos/java/leccion3/tutorial1.html
Eso no es correcto. Paso un ejemplo que demuestra que todos los objetos se pasan por valor. En realidad, cuando paso una variable definida como un objeto el valor que guarda la variable es la dirección donde se encuentra el objeto. Java hace una copia del contenido de esa variable, y su contenido es una dirección por tanto copia la dirección. Ejemplo de que se hace una copia: El método no cambia el contenido del vector que paso por parámetro.
Eliminarpublic class ParamVector {
public static void main(String[] args) {
int vector [] = {0,1,2,3};
System.out.println("La posicion 0 en el vector ANTES de la llamada es = " + vector[0]);
metodo(vector);
System.out.println("La posicion 0 en el vector DESPUES de la llamada es = " + vector[0]);
}
public static void metodo(int [] vectorParam) {
int [] vectorLocal={7,8,9,8};
vectorParam = vectorLocal ;
vectorParam[0]=32;
System.out.println("La posicion 0 en el vector DENTRO del metodo es = " + vectorLocal[0]);
}
}
excelente
ResponderEliminar