Liste chainée en java >.<

otakuu Messages postés 302 Date d'inscription   Statut Membre Dernière intervention   -  
otakuu Messages postés 302 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
     
    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
  2. Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
     
    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
  3. otakuu Messages postés 302 Date d'inscription   Statut Membre Dernière intervention   38
     
    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