Foro sobre Java SE > Duda muy tonta que no logro ver!
Falta una parte del código. De todos modos, a ver si el siguiente test lo aclara:
public class Test {
public static void main(String[] args) {
int a[] = {1, 3, 5};
int[] b = {2, 4, 6, 8};
a[0] = b[0]; // a0=2
b[1] = a[1]; // b1=3
a[2] = b[2]; // a2=6
a = b; // a toma la referencia de b, luego su contenido será igual al de b
System.out.println("contenido de a " + Arrays.toString(a));
System.out.println("contenido de b " + Arrays.toString(b));
}
}
No sé porque se come el código lo vuelvo a poner sin la etiqueta code:
class Ej48 {
static int a[] = {1, 3, 5};
public static void modificarArray(int a[]){
int [] b = {2, 4, 6, 8};
System.out.println("metodo a: "+a);
a[0] = b[0];
b[1] = a[1];
a[2] = b[2];
a = b;
System.out.println("metodo despues a: "+a);
System.out.println("metodo b: "+b);
System.out.println("metodo b: "+a.length);
for (int i = 2; i < a.length; i++) System.out.println(a[i]);
}
public static void main(String [] args){
System.out.println("main a: "+a);
modificarArray(a);
System.out.println("main despues a: "+a);
for (int i = 0; i < a.length; i++) System.out.println(a[i]);
}
}
La salida por consola es:
6
8
2
3
6
Pero yo la salida que yo esperaba es:
6
8
2
3
6
8
Por qué?? Porque si dentro del método hago que a apunte donde apunta b, entonces a se quedará apuntando allí que el tamaño del vector es 4 y no 3. No logro entender porque a despues de hacer a=b sigue apuntando a a.
Ayudaaaaa
Saludos.
Así tal vez se vea más claro:
public class Ej48 {
private static int a[] = {1, 3, 5};
public static void modificarArray(int a[]) {
int[] b = {2, 4, 6, 8};
System.out.println("metodo a: " + Arrays.toString(a));
a[0] = b[0];
b[1] = a[1];
a[2] = b[2];
a = b;
System.out.println("metodo despues a: " + Arrays.toString(a));
System.out.println("metodo b: " + Arrays.toString(b));
}
public static void main(String[] args) {
System.out.println("main a: " + Arrays.toString(a));
modificarArray(a);
System.out.println("main despues a: " + Arrays.toString(a));
}
}
Lo que sucede es que la asignación a = b; solo funciona dentro del método, porque no se puede asignar una referencia local al método a un parámetro del mismo.
Puedes modificar el contenido del array del parámetro; pero no reasignarlo.
Olvida los punteros de C, porque no funciona igual en Java :)
Gracias choces.
Algún sitio donde pueda indagar más sobre ese tema? Pensaba que el paso de parámetros por referencia hacia referencia tocaba el contenido del mismo incluso si lo reasignabamos a otro array.
Saludos.
http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html
http://www.cs.utoronto.ca/~dianeh/tutorials/params/
El paso de parametros en java es siempre por valor y nunca por referencia
"Primitive arguments, such as an int or a double, are passed into methods by value. This means that any changes to the values of the parameters exist only within the scope of the method. When the method returns, the parameters are gone and any changes to them are lost."
"Reference data type parameters, such as objects, are also passed into methods by value. This means that when the method returns, the passed-in reference still references the same object as before. However, the values of the object's fields can be changed in the method, if they have the proper access level."
Las referencias en Java son identificadores que crea la VM. En el segundo caso, se pasan las referencias "como valor". Nada que ver con las referencias en C.
Mejor explicación que la de este artículo de hace 14 años creo que no la puede haber:
http://www.javaworld.com/article/2077424/learn-java/does-java-pass-by-reference-or-pass-by-value.html
Un saludo
Me quedó claro ya! Muchas gracias!
Un saludo a tod@s!
Hola a tod@s,
os pongo un trozo de código que la salida no la logro entender y explico a continuación:
class Ej48 {
static int a[] = {1, 3, 5};
public static void modificarArray(int a[]){
int [] b = {2, 4, 6, 8};
a[0] = b[0];
b[1] = a[1];
a[2] = b[2];
a = b;
for (int i = 2; i
La salida por consola es:
6
8
2
3
6
Pero yo la salida que esperaba es:
6
8
2
3
6
8
Por qué?? Porque si dentro del método hago que a apunte donde apunta b, entonces a se quedará apuntando allí que el tamaño del vector es 4 y no 3. No logro entender porque a despues de hacer a=b sigue apuntando a a.
Ayudaaaaa
Saludos.