网上流行的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);}12345678910111213
网上流行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);
}}1234567891011121314
事实上两种方案都是有效的,区别就是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
}}