Liste chainée en java >.<

Fermé
otakuu Messages postés 302 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 13 mai 2014 - 13 janv. 2010 à 03:58
otakuu Messages postés 302 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 13 mai 2014 - 15 janv. 2010 à 11:12
Bonjour,
j'ai definit une classe complexe
j'ai creer un objet "com" de type complexe
et un autre objet "com2" de type complexe
j'ai fait : com2 = com;
apès j'ai manipuler "com2" (j'ai changé les valeurs) et j'étais surpris de voir que les changement sont appliquer à "com" aussi.
mes questions:
est ce que c'est normal? si oui comment remédier a ce problème ?sinon pour quoi "com" est modifier alors que j'ai pas toucher.
merci infiniment pour vos réponses ( sa fait 3 jours que sa me casse la tete :s)
A voir également:

3 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
13 janv. 2010 à 04:17
les noms de variable objet, ce sont des références vers un objet.
Lorsque tu écris com2 = com, tu dis maintenant que la variable com2 va "pointer" vers le même objet que com.

C'est donc tout à fait normal.

Si tu veux y remedier : crée un constructeur de copie pour ta classe : Complexe(Complexe obj) qui se charge de bêtement copier les variables membres (x = obj.x; ...)

Ainsi tu pourras faire com2 = new Complexe(com) pour que com2 se réfère bien à un objet différent, mais avec les mêmes valeurs.

sinon quel est le lien avec les liste chainées dont tu parles dans le titre ?
1
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
13 janv. 2010 à 04:23
voici un exemple en code pour illustrer ce que je dis :

public class TestSimple {
	
	public static void main(String[] args) {
		Complexe com, com2;
		
		com = new Complexe();
		com.x=1;
		com.y=2;
		com2 = new Complexe();
		com2.x=3;
		com2.y=4;
		System.out.printf("com = %s    com2 = %s", com, com2);
		
		com2 = com; // après cette ligne il n'y a plus qu'un objet
		//l'ancien com2 est en fait détruit.
		// si je change le com2
		com2.y= 5;
		System.out.printf("com = %s    com2 = %s", com, com2);
		
		//ou si je change com, c'est en fait le meme objet qui est modifié
		com.x=6;
		System.out.printf("com = %s    com2 = %s", com, com2);
		
		//par contre ici j'ai bien 2 objets indépendants
		Complexe com3 = new Complexe(com);
		System.out.printf("com = %s    com3 = %s", com, com3);
		com3.x=200;
		System.out.printf("com = %s    com3 = %s", com, com3);
		
	}

}


public class Complexe {
	public int x, y;
	
	public Complexe(complexe obj) {
		x = obj.x;
		y = obj.y;
	}
	
	public Complexe() {
		
	}

	public String toString() {
		return Integer.toString(x) + " + i*" + Integer.toString(y);
	}
}
1
otakuu Messages postés 302 Date d'inscription dimanche 14 octobre 2007 Statut Membre Dernière intervention 13 mai 2014 38
15 janv. 2010 à 11:12
Merci beaucoup,
j'ai très bien compris ton exemple !
liste chainée par ce qu'en fait j'ai deux classe: listecomplexe qui contient des nombre complexe
les nombre complexe j'ai representer avec la classe complexe
je vais essayer avec l'idée que tu m'as dit et je vais voir.
merci beaucoup
1