Egalité de deux objets

Résolu/Fermé
abdell22 Messages postés 14 Date d'inscription mercredi 5 mars 2014 Statut Membre Dernière intervention 18 mai 2014 - 16 mars 2014 à 12:08
abdell22 Messages postés 14 Date d'inscription mercredi 5 mars 2014 Statut Membre Dernière intervention 18 mai 2014 - 16 mars 2014 à 23:27
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
16 mars 2014 à 13:16
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 mercredi 5 mars 2014 Statut Membre Dernière intervention 18 mai 2014
16 mars 2014 à 23:27
maintenant ca marche j'ai compris ,Merci pour votre explication :)
0