网上流行的getClass()
版本如下
class Student {
private String name;
private String address;
@Override
public boolean equals(Object object) {
if (object == this)
return true;
if (object.getClass() != getClass())
return false;
Student student = (Student) object;
return getName() != null && getName().equals(student.getName());
}
// 为限制文章长度,忽略getter,setter方法
}
网上流行instanceof
版本如下
class Student {
private String name;
private String address;
@Override
public boolean equals(Object object) {
if (object == this)
return true;
if (!(object instanceof Student)) {
return false;
}
Student student = (Student) object;
return getName() != null && getName().equals(student.getName());
}
// 为限制文章长度,忽略getter,setter方法
}
事实上两种方案都是有效的,区别就是getClass()
限制了对象只能是同一个类,而instanceof
却允许对象是同一个类或其子类,这样equals
方法就变成了父类与子类也可进行equals
操作了,这时候如果子类重定义了equals
方法,那么就可能变成父类对象equlas
子类对象为true
,但是子类对象equlas
父类对象就为false
了,如下所示
class GoodStudent extends Student {
@Override
public boolean equals(Object object) {
if (object == this)
return true;
if (!(object instanceof Student)) {
return false;
}
Student student = (Student) object;
return getAddress() != null && getAddress().equals(student.getAddress());
}
public static void main(String[] args) {
GoodStudent son = new GoodStudent();
Student father = new Student();
son.setName("test");
son.setAddress("address1");
father.setName("test");
father.setAddress("address2");
// 当使用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
}
}
版权声明:本文为NEWCIH原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。