java 重写equals()
我们往往需要重写父类的equals()方法来实现自定义的相等比较。比如有个Person类,如果两个Person的身份证号和名字相等,那么这两个对象就相等。代码如下:
public class Person {
private String idStr;
private String name;
public Person(String idStr, String name){
this.idStr = idStr;
this.name = name;
}
public static void main(String [] args){
Person p1 = new Person("23233", "zxy");
Person p2 = new Person("232331", "zxy");
boolean b = p1.equals(p2);
System.out.println(b);
}
@Override
public boolean equals(Object obj) {
//如果引用相等,this和obj时同一个Person对象,strId和name一定相等
if(this == obj){
return true;
}
//obj不为null 并且 this和obj是同一个类的实例
if(obj!=null && this.getClass().equals(Person.class)){
Person p1 = (Person)obj;
//比较strId和name是否相等
if(this.getName().equals(p1.getName()) && this.getIdStr().equals(p1.getIdStr()))
return true;
}
return false;
}
public String getIdStr() {
return idStr;
}
public void setIdStr(String idStr) {
this.idStr = idStr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在判断this和obj是否是同一个类的实例时,没有使用instanceof关键字。因为instanceof比较的是左边的对象是否是右边类的一个实例,或者是子类的一个实例。如果Student类继承了Person,我们将Students的一个实例传递给equals()方法,obj instanceof Person 返回true,这不是我们想看到的。this.getClass().equals(Person.class)反射技术来比较两个对象是否是同一个类的实例更准确。