/**
* 深入了解equals
*/
//定义一个Person类
class Person
{
private String name;
private String idStr;
public Person(){}
public Person(String name , String idStr)
{
this.name = name;
this.idStr = idStr;
}
//下面是name和idStr的setter和getter方法。
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
public void setIdStr(String idStr)
{
this.idStr = idStr;
}
public String getIdStr()
{
return this.idStr;
}
//重写equals方法,提供自定义的相等标准
public boolean equals(Object obj)
{
//待比较的两个对象是同一个对象,直接返回true
if(this == obj)
{
return true;
}
//只有当obj是Person对象,这里用到了反射的基础知识
if (obj != null && obj.getClass() == Person.class)
{
Person personObj = (Person)obj;
//并且当前对象的idStr与obj对象的idStr相等才可判断两个对象相等
if (this.getIdStr().equals(personObj.getIdStr()))
{
return true;
}
}
return false;
}
}
/*
由于instanceof运算符的特殊性,当前面对象是后面类的实例或其子类的实例都将返回true,
所以实际上重写equals()方法时判断2个对象是否为同一个类的实例时使用instanceof是有问题的,
如果比较的两个对象是同一个对象,则可以直接返回true即可。
public boolean equals(Object obj)
{
//只有当obj是Person对象
if (obj != null && obj instanceof Person)
{
Person personObj = (Person)obj;
//并且当前对象的idStr与obj对象的idStr相等才可判断两个对象相等
if (this.getIdStr().equals(personObj.getIdStr()))
{
return true;
}
}
return false;
}
*/
public class OverrideEqualsRight
{
public static void main(String[] args)
{
Person p1 = new Person("毛泽东" , "123434");
Person p2 = new Person("毛主席" , "123434");
Person p3 = new Person("毛小三" , "9993343");
//p1和p2的idStr相等,所以输出true
System.out.println("p1和p2是否相等?" + p1.equals(p2));
//p2和p3的idStr不相等,所以输出false
System.out.println("p2和p3是否相等?" + p2.equals(p3));
}
} |