日期:2014-05-20  浏览次数:20688 次

初学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)呀?