2017-10-12 6 views
-2

en java Disons que je une classe A et de classe B qui étend A.Equals en java avec des objets et des classes

Note: les classes A et B ne ont une méthode equals en eux!

je fais:

A a = new B(); 
B b = new B(); 
a.equals(b); 

Il sort faux. J'ai pensé que lorsque nous l'avons fait, il est lié dynamiquement à a et b ce qui le rendrait vrai. Ou est-ce parce qu'au moment de la compilation il regarde a et suppose que les égales seraient égales à (A) et puisque c'est un B pour B b = new B(); ça dit faux? Ou ai-je tort sur les deux fronts?

+2

Si vous ne définissez pas une méthode 'equals()', la méthode par défaut 'equals()' (définie pour tout 'Object's) est la même que' == '. Ce qui signifie qu'il ne renvoie "true" que si les objets sont le même objet (il ne regarde aucune donnée de l'objet). Vous avez créé deux objets, ils ne sont donc pas identiques. – ajb

+0

Étant donné que 'a' et' b' désignent clairement différents objets, pourquoi s'attendre à ce que leur comparaison par 'a.equals (b)' soit 'true'? – dave

+0

Si vous aviez défini une méthode 'equals()' pour 'B', alors' a.equals (b) 'appellerait en effet cette méthode. Donc vous aviez presque raison - 'equals' se lie dynamiquement. Mais vous avez eu tort de ce qui se passe quand vous ne le définissez pas. – ajb

Répondre

4

Comme vous ne surchargez pas equals il utilisera la méthode de Object

Si vous regardez le code source pour objet

@param obj the reference object with which to compare. 
public boolean equals(Object obj) { 
    return (this == obj); 
} 

Il est évident que a a un autre refernce à bfalse ainsi

+0

Ahhh je t'ai eu! J'étais sous l'impression pour une raison quelconque que l'Object est égal aux arguments if (instanceOf) ou autre. Merci pour la clarification tout! – Newb18