类Object
是所有Java
类的基类,Object
类含有一个方法equals
,默认实现是:
public boolean equals(Object obj) {
return (this == obj);
}
默认比较两个引用变量是否指向同一个对象。
用户自定义类应该重写这个方法,以比较两个不同对象的内容是否相同。
很多Java 类都重写了这个equals
方法,例如java.lang.String
和java.util.Date
,以比较两个对象是否内容相同。
比较操作符 ==
强于 equals
,因为==
用于比较两个原始数据类型是否有相同的值,或者两个变量是否指向相同的对象。而假若equals
方法被重写,equals
就是用于比较两个对象是否有相同的内容。
下面的例子,如果Circle
为Case 1, 输出false
,如果为Case 2, 输出true
, Case 1 中的equals
非重写,加@Override
会出错,main
中的equals
调用Object
中的equals
,会绕过Case 1中的equals
方法, 只有Case 2 的equals
才是正确的重载。简而言之,如果重写equals
方法,equals
的参数类型必须是基类Object
。
public class Test {
public static void main(String[] args) {
Object circle1 = new Circle();
Object circle2 = new Circle();
boolean x = circle1.equals(circle2);
// boolean x = ((Circle)circle1).equals((Circle)circle2); //for Case 1
System.out.println(x);
}
}
// Case 1:
class Circle {
double radius;
//@Override
public boolean equals(Circle circle) {
return this.radius == circle.radius;
}
}
// Case 2:
class Circle {
double radius;
@Override
public boolean equals(Object circle) {
return this.radius == ((Circle)circle).radius;
}
}
Introduction to Java Programming 10.th edition 11.10