自己手动重写的equals方法会有一些漏洞,比如Man类继承自Person类,当姓名和年龄相同时就认为这两个对象是相同的,当我们用一个Person对象和Man对象去比较,这两个对象肯定应该是不同的,但我们把这两个对象的姓名和年龄设置成一样的,那么自己手写equals方法比较得出来的是true,而实际应该是false。因为这里自动重写的方法中有判断语句getClass() != obj.getClass()。
Person类:
package overrideequalscompare;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/*
//手动重写的equals方法:
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Person) {
Person person = (Person) obj;
return this.age == person.age && this.name.equals(person.name);
}
return false;
}
*/
//自动生成
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
if (age != person.age) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
}
Man类:
package overrideequalscompare;
public class Man extends Person {
public Man(String name, int age) {
super(name, age);
}
}
Test类:
package overrideequalscompare;
public class Test {
public static void main(String[] args) {
Person p = new Person("Tom",22);
Man m = new Man("Tom",22);
System.out.println(p.equals(m));//手动写的equals方法:true 自动生成的equals方法:false
}
}