[Java] 类 Object 的 equals 方法

Object是所有Java类的基类,Object类含有一个方法equals,默认实现是:

public boolean equals(Object obj) {
    return (this == obj);
}

默认比较两个引用变量是否指向同一个对象。
用户自定义类应该重写这个方法,以比较两个不同对象的内容是否相同。

很多Java 类都重写了这个equals方法,例如java.lang.Stringjava.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

猜你喜欢

转载自blog.csdn.net/ftell/article/details/82746469