Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Duda muy tonta que no logro ver!

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.

marzo 23, 2014 | Unregistered Commentershao

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));
}

}

marzo 23, 2014 | Registered Commenterchoces

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.

marzo 23, 2014 | Unregistered Commentershao

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 :)

marzo 23, 2014 | Registered Commenterchoces

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.

marzo 24, 2014 | Unregistered Commentershao

http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html
http://www.cs.utoronto.ca/~dianeh/tutorials/params/

marzo 24, 2014 | Registered Commenterchoces

El paso de parametros en java es siempre por valor y nunca por referencia

marzo 24, 2014 | Unregistered CommenterUnoPorAhi

"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.

marzo 24, 2014 | Registered Commenterchoces

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

marzo 24, 2014 | Unregistered CommenterUnoPorAhi

Me quedó claro ya! Muchas gracias!

Un saludo a tod@s!

marzo 25, 2014 | Unregistered Commentershao