2009-03-08 8 views
8

Si j'ai une variable membre comme celui-ci (déclarée dans le corps d'une classe)Java objet référence/scope question

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

boucle I par tous les membres de ce tableau, et:

1) Passez chaque objet Dot à une fonction d'une autre classe, qui:

2) Laissez-passer à une autre fonction d'une 3ème classe, si certaines conditions sont remplies

3) et la 3e classe change certains prope rties de l'objet Dot

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

+0

J'aime votre nom et voté sans lire la question. – Cheeso

Répondre

12

Oui, les modifications apportées aux propriétés sont conservées. Java est 100% valeur de passage, cependant, quand vous passez un objet, la "valeur" passée est vraiment un pointeur vers l'objet. Ainsi, lorsque vous modifiez un objet dans une méthode, vous modifiez l'objet réel passé dans

qui est, si vous avez la méthode suivante, la méthode d'appel verra les changements.

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

mais si vous procédez comme suit, la méthode appelante et non affichera les modifications.

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

Dans le second exemple, l'appelant ne voir aucun changement et ne verra pas le nouvel objet Dot.

2

objets sont passés par [ référencevaleur où la valeur est la référence] (les choses qui héritent de l'objet), les valeurs primitives (int, long, double, etc.) sont passés par valeur.

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

Qui à son tour signifie que lorsqu'un objet est muté par une méthode, l'appelant voit ces changements parce qu'il a une référence au même objet. Inversement, lorsqu'une méthode mute une primitive, l'appelant ne voit pas les modifications car la méthode fonctionne sur une copie.

[raison pour les modifications]

Si Java a passer par référence alors vous pouvez 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); 
} 

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

+0

Comme indiqué dans un million d'autres endroits, ce n'est pas strictement vrai. Tous les paramètres sont passés par valeur en Java. Cependant, les variables d'objet se réfèrent en fait à des références d'objet. Passer un objet en tant que paramètre de méthode copie la variable d'objet, c'est-à-dire copie la référence. – mtruesdell