Liste chainée en java >.<

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)
Configuration: Windows XP
Safari 532.0

3 réponses

  • Votes
  • Date
  • Date décroissante
  1. 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. 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. 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 ?