Java Pass By Value vs. Reference : Analyser les différences
En Java, les arguments sont transmis par valeur et non par référence. Ce concept peut prêter à confusion, surtout lorsqu’il s’agit d’objets. Examinons les différences subtiles entre deux extraits de code :
Code A :
Foo myFoo; myFoo = createfoo();
Code B :
Foo myFoo; createFoo(myFoo); public void createFoo(Foo foo) { Foo f = new Foo(); foo = f; }
Comprendre le Code A
Dans le Code A, une variable de référence myFoo est créé et affecté à l'objet renvoyé par createfoo(). Cependant, en Java, les objets sont transmis par valeur et non par référence. Cela signifie qu'une copie de l'objet est créée et attribuée à myFoo. Toute modification apportée à cette copie n'affectera pas l'objet d'origine dans createfoo().
Comprendre le code B
Le code B utilise la fonction createFoo() avec un paramètre foo . Encore une fois, foo est une copie de la variable de référence originale myFoo. Ainsi, lorsque f est créé et attribué à foo, il remplace en fait la copie de myFoo dans createFoo(). Toutes les modifications apportées à foo dans createFoo() seront reflétées dans la variable de référence myFoo d'origine.
Exemple pour illustrer les différences
Pour clarifier davantage, considérons l'exemple suivant :
public class Main { public static void main(String[] args) { Foo f = new Foo("f"); changeReference(f); // Will not change the reference! modifyReference(f); // Will modify the object referred by "f"! } public static void changeReference(Foo a) { Foo b = new Foo("b"); a = b; // Re-assigns 'a' reference to the new object, not 'f'. } public static void modifyReference(Foo c) { c.setAttribute("c"); // Modifies the object referred by 'c', same as 'f'. } private static class Foo { private String attribute; public Foo(String attribute) { this.attribute = attribute; } public void setAttribute(String attribute) { this.attribute = attribute; } } }
Lors de l'exécution de ce code :
Conclusion
En Java, les objets sont passés par valeur, ce qui signifie une copie de l'objet est passée en argument. Toute modification apportée à la copie dans la méthode n'affecte pas l'objet d'origine. Cependant, si la méthode modifie l'objet lui-même (par exemple en changeant ses attributs), l'objet d'origine sera affecté. Il est important de comprendre ce concept lorsque vous travaillez avec des objets en Java pour éviter toute confusion potentielle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!