if(!super.equals(o)) return false;——equals重写理解误区

本文探讨了在Java中重写equals方法时,为何需要调用`super.equals(o)`的细节。通过一个实例展示了如果不考虑父类属性,子类equals方法可能会导致误判。解释了即使父类属性是私有的,子类在比较时仍需检查这些值,以确保对象内容的正确比较。同时,纠正了一个关于该方法可能用途的误解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在仿照别人博客写equals重写方法的时候,我发现在if(!super.equals(o)) return false;这个语句上我的理解一直存在问题,所以写一篇博客记录一下。

类重写euqals方法

1. 判断两个引用指向的对象是否相等
2. 判断传来的参数是否为当前类或者当前类的子类
3. 比较各个属性值是否相等(其中包括比较父类值的属性)

为什么要用到这句话???

因为如果一个子类继承了父类,那么这个子类拥有父类所有的成员属性和方法,即使是父类里有private属性的变量,子类也是继承的,只不过父类的私有属性和方法,子类是无法直接访问到的。

但是不能直接调用就不代表不能用,这些值不能白白占用内存而无法使用,子类仍然可以通过父类的public修饰的set、get方法来调用这些值。

所以子类之间通过equals方法比较,也要比较从父类继承下来的值的内容,为了代码简洁和复用性,在子类直接调用父类的equals方法,这样就解决了以上问题。

直接来一个代码示例:

import java.util.Objects;

public class People {
    private String code;

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        People people = (People) o;
        return Objects.equals(code, people.code);
    }
}
class Teacher extends People{
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        //不加这句返回true,子类的equals方法没有判断code属性值
        if(!super.equals(o))    return false;
        Teacher teacher = (Teacher) o;
        return Objects.equals(name, teacher.name);
    }

    public static void main(String[] args) {
        Teacher teacher1 = new Teacher();
        teacher1.setCode("1");
        teacher1.setName("张三");

        Teacher teacher2 = new Teacher();
        teacher2.setCode("2");
        teacher2.setName("张三");

        System.out.println(teacher1.equals(teacher2));
    }
}

参考博客:lombok——@EqualsAndHashCode(callSuper = true)注解的使用

理解误区:
我一直以为if(!super.equals(o)) return false;这句话是处理 父类对子类实现的场景例如:

class People{}
class Student extends People{}

public static void main(String[] args){
	People p = new Student();
}

导致我想了很久也没想出来这句话的实际意义,一直以为这句话是冗余的,放在子类的实际判断之前,先用父类的equals方法来判断父类属性值内容是否相同,如果不同就不用继续判断子类属性值了,从而减少了工作量,但是越想越不对劲,代码也没有这么写的啊,所以就有了这篇博客。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值