Object类中equals方法的实现机制

在Java中,Object类是所有类的父类,Java中的每一个类都扩展了Object。例如,我们有如下一个员工类:

public class Employee {

    private String name;//员工姓名
    private double salary;//薪水
    private LocalDate hireDay;//入职日期
    
    //下面是构造方法
    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }
    public Employee() {}
}

我们可以使用Object类型的变量引用任何类型的对象
Object object = new Employee("John",5000);
但是,Object类型的变量只能用于作为任意值的一个泛型容器。要想对其中的内容做具体的操作时,还需要清楚对象的原始类型,并进行相应的强制类型转换
当我们想对对象变量object进行操作时,就必须先进行强转:
Employee employee = (Employee) object;
然后对employee进行操作。

Object类中的equals方法

Object类中的equals方法用于检测一个对象是否等于另外一个对象。接下来通过一个例子来了解equals方法的实现机制:

public class Employee {
    private String name;//员工姓名
    private double salary;//薪水
    
    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }
    public Employee() {}

    public boolean equals(Object object){
        //接收参数时是使用Object类型来接收参数

        //先判断这两个对象的引用是否相同,如果这两个对象的引用相同,
        // 那么就直接返回true
        if (this == object)
            return true;

        //如果参数是空,直接返回false
        if (object == null)
            return false;

        //如果两个对象的引用不同,就在判断它们所属的类是否相同,
        // 只有当两个对象属于同一个类时,才有可能相等;如果不属于同一个类,
        // 就直接返回false
        //注意:对放在Object泛型容器里的对象进行getClass()时,会返回其原始类型
        if (getClass() != object.getClass())
            return false;

        //如果两个对象属于同一个类,就先进行类型转换,然后在对其实例字段进行比较
        Employee employee = (Employee) object;

        //返回两个对象实例字段比较的结果:都相等返回true,否则返回false
        return Objects.equals(name,employee.name)
                && salary == employee.salary;
        //因为name是String类型,为了防备name为null,在这里使用了工具类Objects的equals方法。
        // 如果两个参数都为空,Objects.equals(a,b)调用将返回true;
        // 如果其中一个参数为null,则返回false;
        // 如果两个参数都不为null,则调用 a.equals(b)。
        // 如果写成 name.equals(employee.name),那么当name为null时,就会产生空指针异常错误
    }
}

通过上面例子可知,equals方法实现机制大概分为以下几步:

  1. 判断两对象引用是否相同
  2. 判断参数是否为空
  3. 判断两对象是否属于同一个类
  4. 进行强制类型转换,并逐一比较对象的实例字段。

当我们需要新定义一个类(Manager)继承自Employee,并在其中添加一些字段,那么就需要重写父类的equals方法。
在子类中重写equals方法时,需要首先调用父类的equals。如果父类的equals方法返回了false,那么对象就不可能相等。如果父类中的字段都相等,再继续比较子类中新增的实例字段。

public class Manager extends Employee{
    public Manager(){}
    private double bons;
    @Override
    public boolean equals(Object object) {
        //先调用父类的 equals方法比较从父类中继承得到的实例字段,
        // 如果相等再进一步比较子类中新增加的实例字段
        if (!super.equals(object))
            return false;
        Manager manager = (Manager) object;
        return bons == manager.bons;
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小挫折_仅此而已

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值