tipos - Cambiando los valores de las variables en métodos, Java
tipos de variables en java ejemplos (4)
Esta pregunta ya tiene una respuesta aquí:
- ¿Java es "pass-by-reference" o "pass-by-value"? 74 respuestas
Tengo una pregunta sobre cómo cambiar los valores de las variables en los métodos en Java.
Este es mi código:
public class Test {
public static void funk(int a, int[] b) {
b[0] = b[0] * 2;
a = b[0] + 5;
}
public static void main(String[] args) {
int bird = 10;
int[] tiger = {7};
Test.funk(bird, tiger);
}
}
Después de la ejecución del método Test.funk(bird, tiger)
, el valor del pájaro no se cambia; permanece con el valor 10
, aunque en el método funk()
hemos cambiado el valor con a = b[0] + 5;
Por otro lado, el valor del elemento en el conjunto cambia, porque tenemos el enunciado b[0] = b[0] * 2;
No entiendo por qué una cosa cambia y la otra no? ¿Podría alguien explicar esto por mí?
Básicamente, los objetos (como matrices) se pasan a los métodos "por referencia". Entonces, cuando cambia el objeto, cambia el mismo objeto que se pasó al método.
Las primitivas (como int) son "pasadas por valor", por lo que la variable a la que asigna un valor en a no es la misma que la variable int que se pasó.
Espero que esto ayude...
Mira el artículo de Jon Skeet sobre Parameter-Passing en Java , que explica esto.
En resumen (mira su sitio para una explicación más completa):
Las matrices son tipos de referencia. Si pasa una referencia que apunta a una matriz, el valor de la referencia se copia y se asigna al parámetro de la función. Entonces, el parámetro apuntará a la misma matriz que el argumento que se pasó. Por lo tanto, los cambios que realice en la matriz a través del parámetro de su función serán visibles en la función de llamada. Sin embargo, la función de llamada no cambiará el parámetro en sí mismo (b), por ejemplo al establecerlo en nulo , ya que el parámetro (b) es solo una copia del argumento (tigre) pasado.
Los enteros son los llamados tipos primitivos. Pasar el entero copia su valor y lo asigna al parámetro también. Pero ese valor no es una referencia a los datos reales, sino que es la información en sí misma. Entonces los cambios en el parámetro en la función afectarán el parámetro (a), pero no el argumento pasado en la función de llamada (pájaro).
Eso es porque cuando declaras
public static void funk(int a, int[] b)
El alcance de la variable a es solo ese método. Luego, cuando cambias el valor, estás cambiando solo el valor de esa variable en ese método.
Acerca de b. Esa es una nueva referencia de objeto a la misma matriz creada en main, por eso parece que el valor cambia (lo que está cambiando es el objeto de matriz debajo)
Pero prueba esto:
public static void funk(int a, int[] b) {
// create a new reference for b
int[] c = new int[b.length];
c[0] = b[0];
b = c;
// The same.
b[0] = b[0] * 2;
a = b[0] + 5;
}
Cuando hagas eso, tampoco cambiará el valor de tigre (solo el contenido de la nueva matriz c creada en funk)
Puedes simular el pase ref utilizando un contenedor. Ver esta publicación
Aunque no tengo ningún comentario sobre eso
EDITAR Solo por diversión:
He modificado tu código para usar el contenedor publicado anteriormente.
Se ve bastante extraño, pero parece que funciona.
// By ref simulated.
public class Test {
public static void funk(_<Integer> a, int[] b) {
b[0] = b[0] * 2;
a.s( b[0] + 5 ) ;
}
public static void main(String[] args) {
_<Integer> bird = new _<Integer>(10);
int[] tiger = {7};
Test.funk( bird , tiger );
System.out.println("bird = " + bird );
System.out.println("tiger = " + tiger[0] );
}
}
Huellas dactilares
bird = 19
tiger = 14
: -S
Una variable pasa por referencia y la otra es por valor :)
¿Cuál es la diferencia entre pasar por referencia y pasar por valor?