values passing pass how change java parameter-passing terminology pass-by-reference pass-by-value

passing - Java pass por referencia



java pass object by reference (4)

Cuál es la diferencia entre estos 2 códigos:

Código A:

Foo myFoo; myFoo = createfoo();

dónde

public Foo createFoo() { Foo foo = new Foo(); return foo; }

Vs. Código B:

Foo myFoo; createFoo(myFoo); public void createFoo(Foo foo) { Foo f = new Foo(); foo = f; }

¿Hay alguna diferencia entre estos 2 códigos?


Dado que Java es estrictamente "paso por valor" e incluso las referencias a los objetos se pasan por valor, el segundo código no funcionará como se esperaba. Vea la sección "Relacionados" a la derecha para numerosas discusiones sobre esto.


Java siempre pasa argumentos por valor NO por referencia.

Déjame explicar esto a través de un example :

public class Main { public static void main(String[] args) { Foo f = new Foo("f"); changeReference(f); // It won''t change the reference! modifyReference(f); // It will modify the object that the reference variable "f" refers to! } public static void changeReference(Foo a) { Foo b = new Foo("b"); a = b; } public static void modifyReference(Foo c) { c.setAttribute("c"); } }

Explicaré esto en pasos:

  1. Declarar una referencia llamada f de tipo Foo y asignarla a un nuevo objeto de tipo Foo con un atributo "f" .

    Foo f = new Foo("f");

  2. Desde el lado del método, se declara una referencia de tipo Foo con un nombre a y se asigna inicialmente a null .

    public static void changeReference(Foo a)

  3. Cuando llame al método changeReference , la referencia a se asignará al objeto que se pasa como argumento.

    changeReference(f);

  4. Declarar una referencia llamada b de tipo Foo y asignarla a un nuevo objeto de tipo Foo con un atributo "b" .

    Foo b = new Foo("b");

  5. a = b está reasignando la referencia a NOT f al objeto cuyo atributo es "b" .

  6. Cuando llame al modifyReference(Foo c) , se crea una referencia c y se le asigna al objeto con el atributo "f" .

  7. c.setAttribute("c"); cambiará el atributo del objeto que hace referencia a la referencia c , y es el mismo objeto que la referencia f señala.

Espero que comprendan ahora cómo funcionan los objetos con argumentos en Java :)


Otro punto importante que debes saber es el tipo de objeto que pasas al método. si es un objeto mutable o un objeto inmutable. Si pasa un objeto inmutable como String, creará otra copia y realizará la modificación. Los cambios no se reflejan en su copia original.


Piense en los parámetros del método como sus propias declaraciones de variables. Si tuviera que sustituir la llamada al método con un solo bloque de código, se verá así:

Foo myFoo; { //Method call starts here Foo foo; foo = myFoo; Foo f = new Foo(); foo = f; } //Method call ends here

Incluso si el parámetro del método tiene el mismo nombre que otra variable, el parámetro del método sigue siendo su propia referencia única que solo el método conoce. Eso es lo mismo que dice Eng.Fouad arriba.