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