equals()方法在包含继承时,需要注意写问题。equals的约定声明:如果p和q不是null,
p.equals(q)也该和q.equals(p)返回同样的值。下面的代码是种错误的写法
正确的实现应该是
p.equals(q)也该和q.equals(p)返回同样的值。下面的代码是种错误的写法
class BaseClass {
private int x;
public BaseClass(int i) {
x = i;
}
public boolean equals(Object rhs) {
if (!(rhs instanceof BaseClass))
return false;
return x == ((BaseClass) rhs).x;
}
}
class DerivedClass extends BaseClass {
private int y;
public DerivedClass(int i, int j) {
super(i);
y = j;
}
public boolean equals(Object rhs) {
if(!(rhs instanceof DerivedClass))
return false;
return super.equals(rhs) && y == ((DerivedClass) rhs).y;
}
}
public class EqualWithInheritance {
public static void main(String[] args) {
BaseClass a = new BaseClass(5);
DerivedClass b = new DerivedClass(5, 8);
DerivedClass c = new DerivedClass(5, 8);
System.out.println("b.equals(c)" + b.equals(c));
System.out.println("a.equals(b)" + a.equals(b));
System.out.println("b.equals(a)" + b.equals(a));
System.out.println("b.instanceof BaseClass" + (b instanceof BaseClass));
}
}
正确的实现应该是
class BaseClass {
private int x;
public BaseClass(int i) {
x = i;
}
public boolean equals(Object rhs) {
if (rhs == null || getClass() != rhs.getClass())
return false;
return x == ((BaseClass) rhs).x;
}
}
class DerivedClass extends BaseClass {
private int y;
public DerivedClass(int i, int j) {
super(i);
y = j;
}
public boolean equals(Object rhs) {
//Class test not needed; getClass() is done in superclass equals
return super.equals(rhs) && y == ((DerivedClass) rhs).y;
}
}
public class EqualWithInheritance {
public static void main(String[] args) {
BaseClass a = new BaseClass(5);
DerivedClass b = new DerivedClass(5, 8);
DerivedClass c = new DerivedClass(5, 8);
System.out.println("b.equals(c)" + b.equals(c));
System.out.println("a.equals(b)" + a.equals(b));
System.out.println("b.equals(a)" + b.equals(a));
System.out.println("b.instanceof BaseClass" + (b instanceof BaseClass));
}
}