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:
Declarar una referencia llamada
f
de tipoFoo
y asignarla a un nuevo objeto de tipoFoo
con un atributo"f"
.Foo f = new Foo("f");
Desde el lado del método, se declara una referencia de tipo
Foo
con un nombrea
y se asigna inicialmente anull
.public static void changeReference(Foo a)
Cuando llame al método
changeReference
, la referenciaa
se asignará al objeto que se pasa como argumento.changeReference(f);
Declarar una referencia llamada
b
de tipoFoo
y asignarla a un nuevo objeto de tipoFoo
con un atributo"b"
.Foo b = new Foo("b");
a = b
está reasignando la referenciaa
NOTf
al objeto cuyo atributo es"b"
.Cuando llame al
modifyReference(Foo c)
, se crea una referenciac
y se le asigna al objeto con el atributo"f"
.c.setAttribute("c");
cambiará el atributo del objeto que hace referencia a la referenciac
, y es el mismo objeto que la referenciaf
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.