我们在用equals时常常不注意这个问题,a.equals(b)和b.equals(a)能一样么?答案是不一样!因此用的时候多注意不同的顺序,我也看到过说用getClass的,我不同意这种用法,毕竟getClass就屏蔽了好多子类。
public class EqualsDemo {
public static void main(String[] args) {
Father father = new Father("HS");
Son son1 = new Son(1001, "HS");
Son son2 = new Son(1002, "HS");
System.out.println(son1.equals(son2));
System.out.println(son1.equals(father));
System.out.println(son2.equals(father));
System.out.println(father.equals(son1));
}
}
class Father {
private String name;
public Father(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Father) {
Father that = (Father) obj;
return this.name.equals(that.name);
}
return false;
}
}
class Son extends Father {
private int id;
public Son(int id, String name) {
super(name);
this.id = id;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Son) {
Son that = (Son) obj;
return this.id == that.id && super.equals(that);
}
return false;
}
}
1001
false
false
false
true