首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

初学JAVA,请问一个equals重写有关问题

2012-01-06 
初学JAVA,请教一个equals重写问题比较多,请耐心的看一下,谢谢~~我知道在Object类中equals实际比较的是两个

初学JAVA,请教一个equals重写问题
比较多,请耐心的看一下,谢谢~~

我知道在Object类中equals实际比较的是两个对象是否指向同一个内存区域
那在自己写的类中要让它只比较内容是否相等就要重写这个方法
可是其中有一点必须使用getclass()判断所属类是否相等,在有继承的情况时还不能用instenceof判断,因为会给子类留空子转,不能让子类转空子的原因是违反了JAVA语言规定中对equals对称性的要求
比如A是父类B是子类a,b分别是相应的对象且内容相同
在A中重写equals时不能使用
if   (!(otherObject   instanceof   A))   return   false;
书上的意思似乎是a.equals(b)=ture;
                                                    b.equals(a)!=ture
那是不是B继承A后在B的equals中
if   (!(otherObject   instanceof   A))   return   false;
就变成了
if   (!(otherObject   instanceof   B))   return   false;  

这个instanceof操作符不是判断:左面对象是不是右面的类创造的吗?
那为什么上面那a.equals(b)=ture呢?
子类对象也算是父类创造的吗?

还有就是这个
class   Employee
{     //   .   .   .
      public   boolean   equals(Object   otherObject)
      {
            .   .   .
            //   if   the   classes   don 't   match,   they   can 't   be   equal
            if   (getClass()   !=   otherObject.getClass())
                  return   false;
            .   .   .
      }
}
class   Manager   extends   Employee
{
      .   .   .
      public   boolean   equals(Object   otherObject)
      {
            .   .   .
            if   (!super.equals(otherObject))   return   false;
            .   .   .      
        }
}

昏迷``这里为什么又要用super.equals(otherObject)呀?
那如果otherObject是一个Manager对象比如m,   Employee的一个对象e
那e.getClass()和m.getClass()是不是相同的啊

那如果不同的话,假如有Manager对象a,b(内容相同)
那a.equals(b)返回什么呢?
带到程序里不是这样的吗?
执行if   (!super.equals(b))   return   false;
        =>   Employee中的   if   (getClass()   !=   b.getClass())   return   false;
那不就返回false啦??

郁闷,越搅越晕,我也不知道我是否表达的够清楚,也不知道是否哪里就理解错了
希望有明白我意思的前辈能给我详细的说明一下,
万分感激^0^~~~~~~


[解决办法]
blog 更新:
think in java 各章后练习答案.....
http://blog.csdn.net/heimaoxiaozi/

[解决办法]
ls 你这个问题挺绕人的
[解决办法]
用equals不涉及到继承的 他本身就类似关键字

和重写无关
[解决办法]
楼主说得挺烦的,

if (!(otherObject instanceof A)) return false;
书上的意思似乎是a.equals(b)=ture;
b.equals(a)!=ture
那是不是B继承A后在B的equals中
if (!(otherObject instanceof A)) return false;
就变成了
if (!(otherObject instanceof B)) return false;
---------
当然是不变的,B是A的子类,b.equals(a), a instanceof B=false,而 b instanceof A=true
所以a.equals(b)=ture;
b.equals(a)!=ture
当然要看你具体怎么实现equals方法的,这里是只从instanceof方面解释的,其他的没管


这里为什么又要用super.equals(otherObject)呀?


那如果otherObject是一个Manager对象比如m, Employee的一个对象e
那e.getClass()和m.getClass()是不是相同的啊
-------
super.equals就是直接调用父类的equals方法来进行判断
两个getClass当然是不一样的,只是子类调用父类的方法来判断子类跟父类共有的东西是否相同(子类继承父类的everything)
classBase{
private int i;
public boolean equals(Object o){
return o instanceof Base && ((Base)o).i==this.i;
}
}

class Sub extends Base{
private int j;
public boolean equals(Object o){
return super.equals(o);//这里Sub的变量j就被忽略了,调用的是父类的equals,即比较i的值
}
}

楼主问得实在是罗唆,没耐性了,见谅,看看吧
[解决办法]
我觉得你有点绕里面去了

首先 equal() 比较的是对象 而不是用来比较 类

下面这段-----------------------------------------
比如A是父类B是子类a,b分别是相应的对象且内容相同
在A中重写equals时不能使用
if (!(otherObject instanceof A)) return false;
书上的意思似乎是a.equals(b)=ture;
b.equals(a)!=ture
那是不是B继承A后在B的equals中
if (!(otherObject instanceof A)) return false;
就变成了
if (!(otherObject instanceof B)) return false;

这个instanceof操作符不是判断:左面对象是不是右面的类创造的吗?
那为什么上面那a.equals(b)=ture呢?
子类对象也算是父类创造的吗?
------------------------------------------

“a,b分别是相应的对象且内容相同”

是什么意思
我理解为
A a = new B();
B b = new B();

否则不可能 内容相同
这是 a 的声明类型是A 但实际类型是B
所以a.equal() 仍然是B的equal() 方法


对于
class Employee
class Manager

Emploee 的equal() 写的没有问题
两个对象比价 首先比较的就应该是他们的类型是否相同

而 Manager 中的
if (!super.equals(otherObject)) return false
肯定意图是Employee中比较 类型是否相同的那个意思
还有就是 比较在 Employee 中的需要比较的字段 是否相同 这点由于你省略了
所以看不到


[解决办法]
public int hashCode()
{
return this.getId();
}
public boolean equals(Object obj)
{
return obj == null?false:this.hashCode() == obj.hasCode();
}
[解决办法]
equals是object类的方法,其最初方法是看:引用是否指向的是同一个对象。
如果是指向同一个对象,返回true.在object类中equals和==是一样的意思。

object类的equals方法可以被重写,比如String类是object类的子类,
String类重写了equals方法。它改变了原来equals的意思:只要代表的是相同的字符序列,它们就equals.

所以后面的类要重写equals方法,看你你面怎么写的。假如方法里面写只要一个字母相同就算equals那也行啊,看你自己怎么重写拉。

我的意见。呵呵。
[解决办法]
那如果不同的话,假如有Manager对象a,b(内容相同)
那a.equals(b)返回什么呢?
带到程序里不是这样的吗?
执行if (!super.equals(b)) return false;
=> Employee中的 if (getClass() != b.getClass()) return false;
那不就返回false啦??

函数重载了,不能用两个参数的equals方法

热点排行