Question

Si j'ai une variable membre telle que celle-ci (déclarée dans le corps d'une classe)

private Dot[] dots=new Dot[numDots];

Je parcoure tous les membres de ce tableau et:

1) Passez chaque objet Point à une fonction d'une autre classe, laquelle:

2) Le transmet à une autre fonction d'une 3e classe, si certaines conditions sont remplies

3) Et la 3ème classe modifie certaines propriétés de l'objet Point

puis, lorsque cet objet est renvoyé à la classe d'origine / parent, ces modifications apportées à ses propriétés auraient-elles été conservées? Ou serait-il traité comme une variable locale par les 2ème / 3ème fonctions?

Était-ce utile?

La solution

Oui, les modifications apportées aux propriétés sont conservées. Java est 100% valeur par passe. Toutefois, lorsque vous transmettez un objet, la valeur "valeur" passé est vraiment un pointeur sur l'objet. Ainsi, lorsque vous modifiez un objet dans une méthode, vous modifiez l'objet réel transmis.

En d’autres termes, si vous utilisez la méthode suivante, la méthode d’appel verra les modifications:

private void updateMyDot(final Dot aDot) {
  aDot.dotColor = new Color(255,255,255);
}

mais si vous procédez comme suit, la méthode d'appel ne ne verra pas les modifications.

private void updateMyDot(/* not final */ Dot aDot) {
  aDot = new Dot();
  aDot.dotColor = new Color(255,255,255);
}

Dans le deuxième exemple, l'appelant ne voit pas les modifications et ne verra pas le nouvel objet Dot .

Autres conseils

Les objets sont passés par la valeur [ reference ) où la valeur est la référence ] (éléments hérités de Object), des valeurs primitives (int, long, double, etc.). ) sont passés par valeur.

Cela signifie que lorsqu'une primitive est passée d'un appelant à une méthode, elle est copiée, alors qu'avec un objet, une valeur [ de la référence ] est transmise.

Ce qui à son tour signifie que lorsqu'un objet est muté par une méthode, l'appelant voit ces modifications car il contient une référence au même objet.

Inversement, quand une méthode mute une primitive, l'appelant ne voit pas les modifications car la méthode fonctionne sur une copie.

[raison des modifications]

Si Java passait par référence, vous pourriez le faire:

Object x;

x = new Integer(42);
foo(x);
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float

où foo est défini comme:

void foo(Object o)
{
   o = new Float(43);
}

Etant donné que Java passe la référence par la valeur o = new Float (43); est autorisé - mais la valeur de l'appelant restera sous la forme new Integer (42);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top