aashintan
Messages postés6Date d'inscriptionlundi 2 novembre 2009StatutMembreDernière intervention14 janvier 2010
-
12 janv. 2010 à 11:36
aashintan
Messages postés6Date d'inscriptionlundi 2 novembre 2009StatutMembreDernière intervention14 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 ?
aashintan
Messages postés6Date d'inscriptionlundi 2 novembre 2009StatutMembreDernière intervention14 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 ?
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 20116 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 !