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
fde tipoFooy asignarla a un nuevo objeto de tipoFoocon un atributo"f".Foo f = new Foo("f");Desde el lado del método, se declara una referencia de tipo
Foocon un nombreay se asigna inicialmente anull.public static void changeReference(Foo a)Cuando llame al método
changeReference, la referenciaase asignará al objeto que se pasa como argumento.changeReference(f);Declarar una referencia llamada
bde tipoFooy asignarla a un nuevo objeto de tipoFoocon un atributo"b".Foo b = new Foo("b");a = bestá reasignando la referenciaaNOTfal objeto cuyo atributo es"b".Cuando llame al
modifyReference(Foo c), se crea una referenciacy 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 referenciafseñ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.