Ayuda no entiendo este ejercicio...?

Iniciado por Carlosjava, 25 Julio 2015, 13:56 PM

0 Miembros y 1 Visitante están viendo este tema.

Carlosjava

Código (java) [Seleccionar]
public class TestClass {

   public static void main(String args[]) {
       int i = 1;
       int[] iArr = {1};
       incr(i);
       incr(iArr);
       System.out.println("i = " + i + "  iArr[0] = " + iArr[0]);
   }

   public static void incr(int n) {
       n++;
   }

   public static void incr(int[] n) {
       n[0]++;
   }
}

En la consola sale

i = 1 iArr[0] = 2;

Porque no incrementa el i y si el iArr[0] ???


Mod: Los códigos deben ir en GeSHi

tebilon

Hola.
No soy un experto en Java, pero intentaré responderte.
En Java al pasar un tipo primitivo a un método se pasa el valor, lo que quiere decir, crero, que se creará una copia en otra dirección de memoria con el valor de la variable, por lo que hagas lo que hagas en el método no afectará a la variable. Sin embargo al pasar el array, lo que pasas realmente es su dirección de memoria, con lo que las modificaciones si que se hacen sobre el array.
Espero no haberte liado aún más.
Un saludo.

DarK_FirefoX

- Por favor pon un título al tema que sea más descriptivo del problema.
- Utiliza las etiquetas GeSHi si vas a publicar código.




En java se pasa todo por valor, lo que hay que entender es que pasa los objetos por referencia, y esas referencias se pasan por valor.

Lee esto: http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value

Salu2s

Usuario Invitado

Como te han dicho, todo en Java se pasa por valor. Intentaré explicarlo de una forma for dummies ;)

Supongamos que tienes un objeto de tipo Leon:

Código (java) [Seleccionar]
Leon leon = new Leon("Simba");

¿Qué pasa internamente? Bien, la nueva instancia de León se almacena en una dirección de memoria, supongamos que en la dirección 57. Ahora, le pasamos el objeto leon al método editLeon:

Código (java) [Seleccionar]
public void editLeon(Leon leon) {
    leon.setName("Oscar");
    leon = new Leon("Mustafa");
}



¿Qué está pasando internamente?

Lo que está pasando es que el método editLeon recibe un puntero apuntando a la dirección de memoria del objeto pasado. Entonces, por medio de este puntero podemos acceder al objeto y cambiar sus propiedades. En la siguiente línea, se crea una nueva instancia en la posición 125 por ejemplo, y el puntero cambia de dirección y ahora apunta a la dirección (125) de la nueva instancia. Java funciona igual que C en este aspecto.

Espero se haya entendido.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

daimagination

#4
Código (java) [Seleccionar]
public class TestClass {

   public static void main(String args[]) {
       int i = 1;
       int[] iArr = {1}; //aca el array ocea la matriz aqui la matrix contiene solo un valor ya especificado. si tuviera [] [] seria un array biodimensional
       incr(i);
       incr(iArr);
       System.out.println("i = " + i + "  iArr[0] = " + iArr[0]);//concatenizas aqui los diferentes valores de la matriz
   }

   public static void incr(int n) {
       n++;// aqui el static se usa para que los valores del constructor lo usen todos lo que quiero decir esque cada objeto usara las variables. en este caso es una variable que se comparte con todos los objetos.pa eso sirve static.
   }

   public static void incr(int[] n) {
       n[0]++;
   }
}


Mod: Los códigos deben ir en etiquetas GeSHi

DarK_FirefoX

#5
@daimagination, utiliza las etiquetas GeSHi si vas a publicar código.

Además, ni siquiera utilizaste la manera correcta para hacer comentarios en Java.

Salu2s