Maison > Java > javaDidacticiel > Comment Java gère-t-il le passage d'objets : par valeur ou par référence ?

Comment Java gère-t-il le passage d'objets : par valeur ou par référence ?

DDD
Libérer: 2024-11-11 03:18:02
original
847 Les gens l'ont consulté

How Does Java Handle Passing Objects: By Value or by Reference?

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();
Copier après la connexion

Code B :

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo)
{
   Foo f = new Foo();
   foo = f;
}
Copier après la connexion

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; }
   }
}
Copier après la connexion

Lors de l'exécution de ce code :

  • Foo f = nouveau Foo("f"); crée un objet avec "f" comme attribut.
  • changeReference(f); crée une nouvelle copie de l'objet Foo, en attribuant "b" comme attribut, mais cela n'affecte pas l'objet d'origine référencé par f.
  • modifyReference(f); modifie l'objet vers lequel f pointe, en changeant son attribut en "c".

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal