Java equals方法的重写

会用equals其实没什么用,它的脸上写着:请重写我,谢谢。
本文基于Mars老师的Java4Android视频。

equals函数

我们知道,“==” 是用来比较两个值是否相等,这在基本数据类型中没有什么异议,而在引用数据类型(也就是对象)中,“==”判断两个引用是否指向堆内存中的同一块地址。

equals是用来比较两个对象的内容是否相等。内容相等是指:对象的类型相同(可用instanceof操作符比较);对象的成员变量的值完全相同。

equals函数在Object类中。Object类又是所有类的父类,因此所有类都有equals方法。问题是,Object类中有equals方法,是想让用到equals方法的子类,都去重写它。因为Object只是随便写了写equals,代码如下:

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

是不是和“==”毫无区别?因此我们需要重写它。重写的原则,就是上面提到的内容相等:对象的类型相同、对象的成员变量的值相同。

举个栗子:

class User {
    String name;
    int age;
    
    public boolean equals(Object obj) {
        if(this == obj) 
            return true;
        boolean b = obj instanceof User;
        if(b) {
            //向下转型
            //这里没有先向上转型,是因为先用instanceof判断过了
            User u = (User)obj;
            if(this.age == u.age && this.name.equals(u.name)) 
                return true;
            else 
                return false;           
        } else {
            return false;
        }
    }
}
public class Test {
    public static void main(String args []) {
        User u1 = new User();
        User u2 = new User();
        User u3 = new User();
        
        u1.name = "Ada";
        u1.age = 16;
        u2.name = "Ben";
        u2.age = 16;
        u3.name = "Ada";
        u3.age = 16;
        
        System.out.println(u1.equals(u2));
        System.out.println(u1.equals(u3));
    }
}

运行结果:

推荐阅读更多精彩内容