equals为什么要验证getclass相不相等?

来源:14-3 Java中的 hashCode 方法

李爽爽爽爽

2018-09-25


老师您好,14-3的19分24秒,equals为什么要验证getclass相不相等?

写回答

1回答

liuyubobobo

2018-09-26

如果类之间存在继承关系的话,没有getClass,equals函数所表达的逻辑可能是错误的。


以我们在这个课程中所写的学生类的equals为例:

@Override    
public boolean equals(Object o){    
    if(this == o) return true;    
    if(o == null)  return false;    
    if(getClass() != o.getClass()) return false;    

    Student another = (Student)o;    
    return this.grade == another.grade &&    
           this.cls == another.cls &&    
           this.firstName.toLowerCase().equals(another.firstName.toLowerCase()) &&    
           this.lastName.toLowerCase().equals(another.lastName.toLowerCase());    
}


设想一下,如果传来的o是Student的一个子类的,由于多态性,一切都是合法的(可以以Object的形式传进来,也可以被强制类型转化为Student)。并且,这个子类的各个字段可能都和当前的Student是一致的。但是,在你的业务逻辑中,他们可能并不是一致的,equals不应该改返回true:)

0
4
_潇潇暮雨
回复
李爽爽爽爽
如果两个对象具有同一个引用,那么两个对象必然相等。但是试想一下我们new了2个学生对象,它们的firstname和lastname完全一样,此时这两个对象的引用不同,但是在绝大多数情况下我们希望程序认为他们是同一个对象。
2019-08-21
共4条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程