Egalité de deux objets

Résolu
abdell22 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   -  
abdell22 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
s'il vous plait je veux savoir comment faire la comparaison entre deux objets soit avec (==) ou avec la méthode equals .
par exemple le programme suivant donnera false true false false et j'ai pas compris pourquoi ??

public class B {
private int x,y;

public B(int x,int y ) {
this.x=x;
this.y=y;
}

boolean equals(B p){ return((p.x==x)&&(p.y==y)); }

}}

public class Test {

public static void main(String[] args) {

Object a=new B(1,2);
Object b=new B(1,2);
B c=new B(1,2);
B d=new B(1,2);
System.out.println(a.equals(b));
System.out.println(c.equals(d));
System.out.println(a==b);
System.out.println(c==d);
}
}


A voir également:

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Tu ne manipules jamais les objets avec tes variables, mais des références à ces objets, c'est à dire une adresse en mémoire de l'objet.

Si tu fais x==y avec x et y deux objets, ce que tu vas comparer c'est la référence à l'objet. Ce ne pourra donc être true que si x et y référencent le même objet. Si ce sont deux objets différents ce sera forcément false.

Exemple :

Object x = new Object();
Object y = x;
Object z = new Object();
System.out.println(x==y); // true
System.out.println(y==z); // false

La méthode equals va plus loin, car elle ne regarde pas si deux références pointent sur le même objet, mais si le contenu des deux objets sont égaux, dans ce cas on va comparer ses champs un à un, et renvoyer true si les objets sont égaux, même si ce sont deux objets distincts.

De plus, ton code
boolean equals(B p){ return((p.x==x)&&(p.y==y)); } 
est faux.
En effet la méthode equals telle que définie dans Object doit être public et prendre en argument un Object, si en argument tu mets autre chose, comme ici un objet de B, ce n'est plus une redéfinition de la méthode equals de Object mais une surcharge de celle-ci, c'est à dire que les deux vont exister en même temps. Du coup lorsque tu as Object a et Object b, tu appelles la méthode equals(Object) qui va te renvoyer false, même si a et b sont égaux, alors qu'avec B c et B d, tu appelles la méthode equals(B) qui va elle regarder les x et les y comme il faut.

Voici une implémentation rigoureuse de equals pour ta classe B :

@Override // permet de s'assurer que c'est bien une redéfinition
public boolean equals(Object obj)
{
// this ne peut pas être null donc si obj est null on a pas égalité.
    if (obj == null)
        return false;

// on compare les références, c'est rapide et permet de tout de suite
// de savoir que les "deux" objets sont égaux puisque c'est le même.
    if (obj == this)
        return true;

// si obj n'appartient pas à la classe B (ou une de ses classes filles)
// alors il ne peut pas être égal à this.
    if (!(obj instanceof B))
        return false;

// maintenant on est sûr que obj est bien un objet de B
    B p = (B) obj;

// seulement maintenant on peut comparer son contenu champ par champ
    return (x == p.x) && (y == p.y);
}
3
abdell22 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
maintenant ca marche j'ai compris ,Merci pour votre explication :)
0