2014-10-04 2 views
0

IDE: Eclipse; Язык: Java ядро ​​Почему объекты ниже не равны в Java?

package p1; 

public class StringTestA { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     Object o1 = new StringTestA(); 
     Object o2 = new StringTestA(); 

     StringTestA o3 = new StringTestA(); 
     StringTestA o4 = new StringTestA(); 

     if (o1.equals(o2)) { 
      System.out.println("Object o1 and o2 are eqals"); 

     } 

     if (o3.equals(o4)) { 
      System.out.println("Object o3 and o4 are eqals"); 
     } 

    } 

    public boolean equals(StringTestA other) { 
     System.out.println("StringTestA equals mathod reached"); 
     return true; 
    } 

} 

Выход:

StringTestA equals method reached 
    Object o3 and o4 are equals 

Нет выхода, если равен в не переопределены.

Вопрос: Почему System.out.println("Object o1 and o2 are eqals"); строка не печатается как equals, возвращается true;

ответ

8

Вы не являетесь основным equals(Object). Аргумент должен быть Object, а не StringTestA. Вместо этого вы заменяете перегрузкойequals (создание другого метода с тем же именем).

Всегда комментируйте методы, которые вы хотите переопределить @Override. Это приведет к ошибке компиляции, если вы допустили ошибку в объявлении метода, как вы это делали.

@Override 
public boolean equals(Object obj) { 
    //... 
} 
+2

Если вы переопределите equals(), вы ДОЛЖНЫ также переопределить hashCode(). В противном случае произойдет нарушение общего контракта для Object.hashCode, что может иметь неожиданные последствия, когда ваш класс связан со всеми хэш-коллекциями. –

+0

@AndreaBorgogelliAvveduti: Хотя это правда и хороший совет, это касательно вопроса. Насколько нам известно, OP действительно переопределял hashCode, но не включал его, потому что он не имел никакого отношения к вопросу. –

+0

Я бы не назвал это несущественным. Он * * только касательно связан. Я бы, конечно, упомянул об этом в качестве побочного комментария в конце ответа, например: «Сторона примечания: если вы переопределяете« равные », вам также нужно переопределить« hashCode ». (+1, кстати, хорошее объяснение, особенно аннотация). –

Смежные вопросы