網上流行的getClass()
版本如下
public class Student {
private String name;
@Override
public boolean equals(Object object){
if (object == this)
return true;
// 使用getClass()判斷對象是否屬於該類
if (object == null || object.getClass() != getClass())
return false;
Student student = (Student)object;
return name != null && name.equals(student.name);
}
網上流行instanceof
版本如下
public class Student {
private String name;
@Override
public boolean equals(Object object){
if (object == this)
return true;
// 通過instanceof來判斷對象是否屬於類
if (object == null || !(object instanceof Student))
return false;
Student student = (Student)object;
return name!=null && name.equals(student.name);
}
}
事實上兩種方案都是有效的,區別就是getClass()
限制了對象只能是同一個類,而instanceof
卻允許對象是同一個類或其子類,這樣equals
方法就變成了父類與子類也可進行equals
操作了,這時候如果子類重定義了equals
方法,那麼就可能變成父類對象equlas
子類對象爲true
,但是子類對象equlas
父類對象就爲false
了,如下所示
class GoodStudent extends Student {
@Override
public boolean equals(Object object) {
return false;
}
public static void main(String[] args) {
GoodStudent son = new GoodStudent();
Student father = new Student();
son.setName("test");
father.setName("test");
// 當使用instance of時
System.out.println(son.equals(father)); // 這裏爲false
System.out.println(father.equals(son)); // 這裏爲true
// 當使用getClass()時
System.out.println(son.equals(father)); // 這裏爲false
System.out.println(father.equals(son)); // 這裏爲false
}
}