Affectation et instanciation

aashintan Messages postés 6 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 14 janvier 2010 - 12 janv. 2010 à 11:36
aashintan Messages postés 6 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 14 janvier 2010 - 14 janv. 2010 à 09:03
Bonjour à tous,

J'ai un petit problème, j'ai "appris" et ca se comprend que les variables objets en Java sont des références et que l'instanciation ne peut se faire qu'avec new MaClass(); ...

Cependant, que se passe-t-il lors d'une affectation ?

String x;
String y;
x = new String("a");
y = x;
x = x + " b";
System.out.println("y : " + y.toString());
System.out.println("x : " + x.toString());


Il n'y a donc ici qu'une seule instance de la classe String, référencée par x.
Elle est également référencée par y lors de l'affectation y = x;
Du coup, quand on modifie le contenu de x avec x = x + " b"; cela devrait donc concerner le seul objet qui a été instancié, et x et y devrait "pointer" vers le même...
Or à l'affichage, y pointe vers un objet de valeur "a" et x vers un objet de valeur "a b".
Il y a donc une seconde instance de la classe String du à l'affectation ?

Si vous pouviez m'aider à y voir plus clair...

Merci d'avance,

Aash

4 réponses

super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
12 janv. 2010 à 11:46
Hello,

le fait de faire x= x+ " b" crée effectivement une nouvelle instance en memoire qui a pour valeur "a b".

Tu te retrouves donc en memoire avec
ancien x -> a
nouveau x -> a b

Or y "pointait" sur l'ancien x et on ne "le notifie" nulle part que x a changé d'endroit.

C'est donc pour ça qu'il pointe toujours sur l'ancienne valeur, cad a

++
0
aashintan Messages postés 6 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 14 janvier 2010
12 janv. 2010 à 14:19
Merci beaucoup,

Si j'ai bien compris, x = x + " b" est équivalent à passer par un StringBuffer et utiliser la méthode append, qui retourne une nouvelle instance contenant la concaténation voulue.

Ce qui m'étonne cependant, c'est que x "change d'endroit", ou soit réaffecté de manière transparente et que l'ancien x, vers lequel pointe y ne soit pas détruit vu qu'il n'a plus son affectation principale, le gc devrait passer et y se retrouver à null ?

Encore merci !
0
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
12 janv. 2010 à 16:12
Pour le StringBuffer, c est exactement ça, le compilateur traduit ta ligne comme tel.
L'ancien x n'est pas détruit par le GC puisque y pointe toujours dessus !

++
0
aashintan Messages postés 6 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 14 janvier 2010
14 janv. 2010 à 09:03
Merci pour toutes ces explications, je pense avoir bien compris maintenant.

++
0
Rejoignez-nous