没有满意答案,在抛一次equals问题!

wl3072102 2008-03-07 07:46:50
public boolean equals(object obj){
Name name=null;
if(obj instanceof Name){
name=(Name)obj;
if(name.firstname==this.firstname&&name.lastname==this.lastname){
return true;
}else return false;
}
return super.equals(obj)
}
在这个方法中为什么最后要写上super.equals(obj),难道写返回false不行吗,有点不理解!
为什么还要让交到Object去比较?
有的是这么回答的:后调用super.equals()的意思是,当obj是Name的父类的实例时,调用父类的equals方法来判断是否相等。不能直接返回false,有可能是true的。
但我想问的是:难道传进来的是obj=老子;通过判断返回true了,就认为老子=儿子了?这逻辑上也不成立啊!!!
...全文
158 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
老紫竹 2008-03-09
  • 打赏
  • 举报
回复
这个方法是否需要调用父类,取决于需求和设计。没有什么特别的理由可言!

比如,你判断传过来的类,根本不是你希望的,你完全可以return false. 至少我会这么做。

至于让父类去判断,呵呵,
1 代码是你写的,我想你自己清楚
2 代码是其他人写的,那是他的应用设计需要这样,不需要过多的理由。 需求如此!

比如,声明采用的是父类,对象实例是子类。 而子类定义了一个完全不同的eauals方法。

如果发生了一个父类实例和一个子类实例判断equals的时候,会怎么样呢???

1 我们完全可以按照子类的要求来判断,return false.这是我推荐的。
2 在某些特殊的业务需求下,调用父类的equals还是有可能需要的,毕竟传过来的有可能是一个父类。

OVER.
wl3072102 2008-03-09
  • 打赏
  • 举报
回复

public boolean equals(object obj){
Name name=null;
if(obj instanceof Name){
name=(Name)obj;
if(name.firstname==this.firstname&&name.lastname==this.lastname){
return true;
}else return false;
}
return super.equals(obj)
}
wl3072102 2008-03-09
  • 打赏
  • 举报
回复
[code=Java][/codpublic boolean equals(object obj){
Name name=null;
if(obj instanceof Name){
name=(Name)obj;
if(name.firstname==this.firstname&&name.lastname==this.lastname){
return true;
}else return false;
}
return super.equals(obj)
}
e]
findself 2008-03-08
  • 打赏
  • 举报
回复
最后也可以把return super.equals(obj); 改成
return false;
因为Object的equals方法实际是比较是否指向同一对象。既然传进来的obj不是Name类型,就不可能指向同一对象。super.equals(obj)必然返回false
wl3072102 2008-03-08
  • 打赏
  • 举报
回复
请回答一下为什么,不要回答是什么!!
wl3072102 2008-03-08
  • 打赏
  • 举报
回复
有必要让父辈去判断吗?
老紫竹 2008-03-08
  • 打赏
  • 举报
回复
子辈继承自父辈
如果传进来的不是子辈,让父辈去判断吧

OVER
JadoNet 2008-03-08
  • 打赏
  • 举报
回复
如果没有进入第一层if处理,那么表示obj并不是与Name是同类“产品”。所以必须要调用父类的equlas方法再次进行比较。
zapdos 2008-03-07
  • 打赏
  • 举报
回复
因为儿子并不是一种老子

好色的老子跟暴躁的老子都属于一种老子
wl3072102 2008-03-07
  • 打赏
  • 举报
回复
6楼你的意思是?
insiku 2008-03-07
  • 打赏
  • 举报
回复
并不是所有的人都适合做开发的
LZ完全没有面向对象的思想和观念

A extends B
并不表示B是老子 A是儿子

即便是有老子 儿子2个类 也不会设计儿子继承老子
你以为你将来继承你老爸的遗产 你就extends你爸
愚蠢之极
Squall1009 2008-03-07
  • 打赏
  • 举报
回复
我该怎么说呢?
可能每个人的理解不一样吧
wl3072102 2008-03-07
  • 打赏
  • 举报
回复
2楼你说的对称性,跟我问的问题有关吗?
rover_y 2008-03-07
  • 打赏
  • 举报
回复
完美的equals
public boolean equals(object obj){
if(obj==null){
return false;
}
if(this==obj){
return true;
}
if(this.getClass()!==obj.getClass()){
return false;

}

Name name=null;
if(obj instanceof Name){
name=(Name)obj;
if(name.firstname==this.firstname&&name.lastname==this.lastname){
return true;
}else return false;
}
return false;
}
Squall1009 2008-03-07
  • 打赏
  • 举报
回复
equals应该有一致性,比如 x.equals(y)是true的话,在x和y都没改变的情况下y.equals(x)也应该是true;
那我定义两个class

class Person
{
public Person(String name)
{
this.name = name;
}
pubclis Sting name;
}

class Employee extends Person
{
public Employee(Sting name, double salary)
{
super(name);
this.salary = salary;
}

pubclic double salary;
}

Person a = new Person("Squall");
Employee e = new Employee("Squall", 0.1);

那么假如a.equals(e)返回true的话,(只判断人的名字)
e.equals(a)不调用 return super.equals(obj) ;显然返回false
不符合equals应该有一致性
睿音 2008-03-07
  • 打赏
  • 举报
回复

public boolean equals(object obj){
Name name=null;
if(obj instanceof Name){ //判断的前提条件传入的obj必须是Name的实例,如果不是没有对比的可能。
name=(Name)obj;
if(name.firstname==this.firstname&&name.lastname==this.lastname){ //这里才是判断传入的obj是否符合要求。符合的条件是firestname相等,lastname相等。
return true; //完全相等,则回true
}else return false; //不相等则会false
}
return super.equals(obj)
}

这里注意的是 instanceof 不是判断超类与子类的。而是判断一个实例是否是某个类的实例
就像用Name name = new Name();比较的就是name与Name之间,像这个就是返回true.

62,623

社区成员

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

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