在重写 equals 时在派生 class 中调用 super.equals()

calling super.equals() in derived class while overriding equals

我有一个基础 class,年龄和名字作为实例成员,派生 class 有奖金。我在 Derived class 中重写 equals。我知道当只有一个基数 class 时,equals 在 Java 中是如何工作的。但是我无法理解它在继承的情况下是如何工作的。我想检查两个派生对象是否相等。

我原以为输出是
此 class = 基础,其他 class = 派生
相反,输出是 此 class = 派生,其他 class = 派生

derivedclass的equals方法中的super到底是干什么的?不是指Base吗?

<br/>

public class Base{

    private int age;
    private String name;

    public Base(int age, String name){
        this.age = age;
        this.name = name;
    }

    public int getAge(){
        return age;
    }

    public String getName(){
        return name;
    }

    @Override
    public boolean equals(Object otherBase){

        //Check if both the references refer to same object
        if(this == otherBase){
            return true;
        }

        if(otherBase == null){
            return false;
        }

        System.out.println("This class       ="+this.getClass().getCanonicalName()+", Other class = "+otherBase.getClass().getCanonicalName());

        if(this.getClass() != otherBase.getClass()){
            return false;
        }

        if(! (otherBase instanceof Base)){
            return false;
        }

        Base other = (Base) otherBase;

        return this.age == other.age && this.name.equals(other.name);
       }


    public static void main(String[] args){
        Derived d1 = new Derived(10,6,"shri");
        Derived d2 = new Derived(10,5, "shri");
        if(d1.equals(d2)){
            System.out.println("Equal");
        }else{
            System.out.println("Not Equal");
        }
    }
}

class Derived extends Base{

    private int bonus;

    public int getBonus(){
        return bonus;
    }

    public Derived(int bonus, int age, String name){
        super(age, name);
        this.bonus = bonus;
    }

    @Override
    public boolean equals(Object otherDerived){
        if(!(super.equals(otherDerived))){
            return false;
        }

        Derived derived = (Derived) otherDerived;
        return bonus == derived.bonus;
    }
}

所以equals()方法正确实现,其工作方式如下

  1. agename 的比较委托给 Base class
  2. 如果不一样,return false
  3. 否则比较Derivedclass
  4. bonus字段的值

super.equals()的调用会从superclass调用equals()Base),但是this仍然代表真实的例子,例如Derived 你的情况。

What is super in equals method of derived class exactly doing?Isnt it referring to Base?

super 用于调用 overriden equals 方法(在 Base 中定义的方法)。更一般地说,super 引用它所使用的类型的超级 class,所以在这种情况下是的,它引用 Base。但是,引用对象的类型在运行时仍然是Derived.

Base#equals()方法中,表达式this.getClass().getCanonicalName() returns运行时对象的名称class。即使在基class的equals方法中调用了表达式,实际类型也是Derived。这就是 Javadocs 中提到的 getClass 方法的作用:

Returns the runtime class of this Object.

如果你需要获取超级class的名字,你可以使用this.getClass().getSuperclass().getCanonicalName().