对super.equals方法的讨论

yeyu269 2004-04-08 12:09:10
正在学Java,下面是一个对 Core Java中例子EqualsTest.java的一个简化版本,以突出我想讨论的问题:
public class EqualsTest
{
public static void main(String[] args)
{
Manager carl = new Manager("Carl Cracker", 80000);
Manager boss = new Manager("Carl Cracker", 80000);
System.out.println("carl.equals(boss): "
+ carl.equals(boss));
}
}

class Employee
{
public Employee(String n, double s)
{
name = n;
salary = s;
}

public boolean equals(Object otherObject)
{
if (this == otherObject) return true;
if (otherObject == null) return false;

//我想讨论的地方
if (getClass() != otherObject.getClass())
return false;


Employee other = (Employee)otherObject;
return name.equals(other.name)
&& salary == other.salary;
}

private String name;
private double salary;
private Date hireDay;
}

class Manager extends Employee
{
public Manager(String n, double s)
{
super(n, s);
bonus = 0;
}

public boolean equals(Object otherObject)
{
if (!super.equals(otherObject)) return false;
Manager other = (Manager)otherObject;
// super.equals checked that this and other belong to the
// same class
return bonus == other.bonus;
}

private double bonus;
}

讨论1:
两个子类对象做比较,调用超类的equals方法,当程序执行到这一步时,查看表达式"this.getClass().getName()"的值为"Manager",我原本还以为该"Employee"。这在文档java.lang.Object中对getClass方法给出了说明,它returns the runtime class of an object。我觉得这个实现is interesting :P ,因为在Object类中它被声明为public final Class getClass(),而声明为final的方法
是不能被子类覆盖的,所以不是通过动态绑定的机制。

讨论2:
另外,我觉得执行super.equals(otherObject),到了超类的equals方法中后,this引用就指向carl(子类对象)所指对象,这个隐式参数的传递让人觉得比较含糊。

问题:
我想在超类(Employee类)的equals方法中,比较那里的this引用和otherObject参数是否指向同一块内存区域,如何做?表达式this == otherObject是比较两个引用的地址。
...全文
158 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nouveau 2004-04-10
  • 打赏
  • 举报
回复
说错了:同一个对象意味两个对象肯定相等,但是相等不一定是同一个对象

我想楼主疑惑的可能是这里super.equals(otherObject),
这里,调用的是super类的同名方法。
但是this指的对象从来都是一个manager,而不是employee
nouveau 2004-04-10
  • 打赏
  • 举报
回复
不大明白楼主的意思。

if (this == otherObject) return true;
if (otherObject == null) return false;
虽然这段代码在父类里。但是,this指的是调用这个方法的对象,(也就是manager carl)
这是说如果this和otherobject指的是同一个对象。
同一个对象并不意味两个对象相等。
同一对象,指的是指向同一块内存区域。
相等:我想本题就是相等的一个很好的例子
先看是不是同一个对象,如果是肯定相等(所以有return true)。
再看是不是同一个类。不是肯定不等
如果是同一个类,再看字段相不相等

子类的相等判断:先调用父类方法。然后再看子类字段是否相等
如果某个对象在new时是manager,那this一直都指这个manager,而不是它的任何父类
programer23 2004-04-08
  • 打赏
  • 举报
回复
帮你顶一下。
yeyu269 2004-04-08
  • 打赏
  • 举报
回复
自己顶一下

62,633

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧