初学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方法