在重写 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()
方法正确实现,其工作方式如下:
- 将
age
和 name
的比较委托给 Base
class
- 如果不一样,return false
- 否则比较
Derived
class 中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()
.
我有一个基础 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()
方法正确实现,其工作方式如下:
- 将
age
和name
的比较委托给Base
class - 如果不一样,return false
- 否则比较
Derived
class 中
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()
.