在仿照别人博客写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方法来判断父类属性值内容是否相同,如果不同就不用继续判断子类属性值了,从而减少了工作量,但是越想越不对劲,代码也没有这么写的啊,所以就有了这篇博客。

在仿照别人博客写equals重写方法的时候,我发现在if(!super.equals(o)) return false;这个语句上我的理解一直存在问题,所以写一篇博客记录一下。类重写euqals方法1. 判断两个引用指向的对象是否相等2. 判断传来的参数是否为当前类或者当前类的子类3. 比较各个属性值是否相等(其中包括比较父类值的属性)因为如果一个子类继承了父类,那么这个子类拥有父类所有的成员属性和方法,即使是父类里有private属性的变量,子类也是继承的,只不过父类的私有属性和方法,子类是
一、为什么equals()方法重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象。这样我们往往需要重写equals()方法。 我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法。 二、怎样...
public class July25 {      ==和equals的区别 /* 在讲==和equals之前,我先讨论一下“=”的用法,“=”在java中是赋值号,eg:int a=1; 这里是吧数值为1的
equals()本身是一个方法,并不是运算符,而且仅适用于引用数据类型 “==”在java的引用数据时使用时,比较的并不是具体的数值,而是地址值。此时并不能有效地比较引用数据类型中的具体数据,比较地址值对于引用数据类型而言没有用,就出现了equals()方法重写 //此处需要注意的是,equals()方法重写在编译器中是可以自动生成的 重写equals()的规定 1、对称性 x.equals(y)如果结果为true,那么y.equals(x)的返回结果应该也是true 2、自反性 x.equa
一、equale方法是什么? Object 类中的 equals 方法是用于检测一个对象是否等于另外一个对象。在Object类中实现的 equals 方法将确定两个对象是否具有相同的引用(内存地址)。如果两个对象具有相同的引用,那么他们一定是相等的,看看下面这段代码的运行: public static void main(String[] args) { Object o = new Object(); //分别将 o 赋值给变量o1,o2 Object o1 ...
equals()在哪里 首先我们知道Java中Object类是所有类的父类,它里面定义了equals()方法: public boolean equals(Object obj) { return (this == obj); 可以看到是使用"“来进行比较的,那么”"是什么意思呢?其实是比较两个对象的的内存地址。(这里顺便提一下,可以去了解一下Java的堆栈。
复制构造函数很有用,但它们不是多态的。无参数方法可以帮助弥合差距,使代码保持松散耦合且易于克隆。 这是我Java克隆系列的第三篇文章。在我之前的文章中,用详细的代码解释了Java 克隆和克隆类型(浅克隆和深克隆) 和 Java 克隆:复制构造函数与克隆,我详细讨论了 Java 克隆,并解释了每个概念,如克隆是什么, 它是如何工作的,实现克隆的必要步骤、如何使用 Object.clone()、 浅克...
几个月前,同事给出的一道思考题,为什么spuer.squals(this),结果为true,最近闲下来,各种搜罗,感觉弄清了事实真相。 个人得出的结论是:super只是一个助记词,在字节码文件中,super是不存在的,当调用super.equals(this)的时候,最终的方法是this == this,所以,得到的结果是true。 在jvm中,有四种方法执行机制,super.equals,...
在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承(Inheritance)。 已有的类称为父类,而新类称为子类。父类也可以称为基类、超类,子类也可以称为派生类。这些术语可以互换,但是意思是相同的。 在面向对象编程中,为避免上面所出现的问题,我们需要根据一个简单的规则不断地测试我们的设计:一个对象“有(has a)”一个属性,一...
类中使用static 修饰的成员变量为静态,为类的公用变量,第一次使用时初始化,对于该类所有的成员变量来说,static只有一份 类中使用static 修饰的方法为静态方法,调用该方法时,不会将对象的引用传递给它,所以static中不可以访问非static 的成员 (静态方法不属于对象调用,所以不能访问非静态成员) 原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己...