Matriz pasada por valor o pasada por referencia en Java
Este tutorial presenta un array pasada por valor o referencia en Java.
Cuando llamamos a un método, sus argumentos se pueden pasar como valor o como referencia. Antes de discutir estos dos, entendamos dos términos:
- llamado: Este es el método llamado por otro método
- llamador: este es el método que llama a otro método
Ahora aprendamos qué significa pasar por valor y pasar por referencia.
¿Qué se pasa por valor en Java?
Cuando decimos que los argumentos se pasan por valor, se hace una copia del valor del parámetro real en la memoria.
La persona que llama y la persona que llama mantienen dos variables independientes con el mismo valor. Si la persona que llama modifica el valor del parámetro, no podemos ver el cambio en la persona que llama.
Puntos importantes:
- El destinatario no tiene acceso al elemento original en el código de llamada.
- Se envía una copia de los datos (valores de los parámetros) al destinatario.
- Los cambios en la variable pasada no afectan el valor final.
Lo que se pasa por referencia en Java
Cuando decimos que los argumentos se pasan por referencia (también llamado paso por dirección), significa pasar la referencia de un argumento en la función de llamada al parámetro formal correspondiente.
En esta situación, se realiza una copia de la dirección del argumento real. La persona que llama y la persona que llama usan la misma variable para el parámetro y, por lo tanto, si la persona que llama modifica la variable del parámetro, podemos ver el cambio en la variable de la persona que llama.
Puntos importantes:
- Callee da una referencia al elemento de programación en el código de llamada.
- La dirección de memoria de los datos almacenados se pasa en lugar del valor.
- Cualquier cambio en el valor afectará a los datos originales
Java se pasa por valor
A diferencia de C++, en Java podemos pasar argumentos solo como valores. Pero hay un problema: cuando los objetos se pasan como argumentos, su referencia se pasa como valor al destinatario.
En otras palabras, aunque Java se pasa estrictamente por valor, se comporta como pasado por referencia para los objetos. Usemos algunos ejemplos para entender mejor este concepto.
Pasar tipos de datos primitivos en Java
En el siguiente código, pasamos dos enteros como argumentos a una función y luego cambiamos sus valores.
Dado que los argumentos se pasan por valor en Java, la función mantiene una copia separada de los argumentos. Cualquier cambio que hagamos a los argumentos se hace solo en la copia de la función y no en la copia que mantiene la función principal (llamadora).
Por lo tanto, obtenemos los valores originales cuando imprimimos los valores después de que finaliza la llamada a la función. Mira el código de ejemplo a continuación:
public class SimpleTesting {
static void JE_function(int n1, int n2) {
n1 = -232;
n2 = -90;
}
public static void main(String args[]) {
int JE_numa = 6932;
int JE_numb = 8934;
System.out.println("Numbers before function call :" + JE_numa + " and " + JE_numb);
JE_function(JE_numa, JE_numb);
System.out.println("Numbers after the JE_function call :" + JE_numa + " and " + JE_numb);
}
}
Producción :
Numbers before function call:6932 and 8934
Numbers after the JE_function call:6932 and 8934
Pasar matriz en Java
Cuando se trata de objetos, la referencia al objeto se pasa por valor como argumento.
En el siguiente código, pasamos un Array como argumento, y cuando imprimimos el valor del objeto (arreglo), se imprime una ubicación de memoria. Esto tiene que ver con el hecho de que una variable de objeto almacena la ubicación de la memoria donde se almacena el objeto.
Mira el código de ejemplo a continuación:
public class SimpleTesting {
static void JE_function(String[] sentence) {
System.out.println(sentence);
}
public static void main(String args[]) {
String[] sent = {"I", "Love", "Delftstack"};
JE_function(sent);
}
}
Producción :
[Ljava.lang.String;@442d9b6e
Usando el código anterior, tratamos de transmitir una referencia a el array pasada como argumento. Por lo tanto, si cambiamos el valor de el array (no la ubicación de la memoria), el cambio se reflejará en el receptor de la llamada.
Mira el código de ejemplo a continuación:
public class SimpleTesting {
static void JE_function(String[] sentence) {
sentence[1] = "Visit";
}
public static void main(String args[]) {
String[] sent = {"I", "Love", "Delftstack"};
System.out.println("Sentence before calling the function");
for (String word : sent) {
System.out.println(word);
}
JE_function(sent);
System.out.println("Sentence after calling the function");
for (String word : sent) {
System.out.println(word);
}
}
}
Producción :
Sentence before calling the function
I
Love
Delftstack
Sentence after calling the function
I
Visit
Delftstack
Como se ve en el código anterior, cualquier cambio en el array se refleja en el bloque principal.
Piense en ello como si dos amigos estuvieran trabajando en un proyecto. Cualquier trabajo que haga uno de los amigos se reflejará en el proyecto general.
La función, en este caso, se refiere al mismo array que usa el bloque principal.