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

关于object的equals方法的问题.请教。。。
所有类的父类都是都是object.继承时都是要默认继承object这个类.
object中的equals方法.他的参数是boolean   equals(Object   obj)如果覆盖这个类的话为什么我的参数还要写成(Object   obj)?
class   student
{
String   name;
int   age;
public   boolean   equals(Object   obj)
{
student   st=null;
if(obj   instanceof   student)
{
st=(student)obj;
}
else
{
return   false;
}
if(st.name==this.name   &&   st.age==this.age)
{
return   true;
}
else
return   false;

}
}
class   xue
{
public   static   void   main(String   []   args)
{
student   p=new   student();
student   q=new   student();
p.name= "zhangsan ";
p.age=20;
q.name= "zhangsan ";
q.age=20;
if(p.equals(q))
System.out.println( "p=q ");
else
System.out.println( "p!=q ");
}
}
我知道在在写父类时并不知道子类的名字叫什么.但为什么就要传递Object   obj这样的参数?就因为父类中这样写的?所以我们继承了重写时候也必须这样写?


------解决方案--------------------
呵呵,就死记住吧
------解决方案--------------------
lz同样的问题发了两个帖子哦,呵呵。
见另一篇帖子的回答。
------解决方案--------------------
重写就是要求和父类的参数名 返回类型 参数列表都一样哦。而且用Object做参数就可以传递任意类型的引用类型变量。这是因为java的多态性
------解决方案--------------------
如果你想覆盖的话当然必须和父类的方法一样了(方法的签名必须相同),重载方法中的参数是可以不一样的.

------解决方案--------------------
同样的名字,同样的参数才叫覆盖,不然就叫重载了.
------解决方案--------------------
参数类型是方法签名的一部分,只有方法签名完全一致的才称为“Override”!否则,是你自定义的equals方法和从Object类继承的equals方法发生了“Overload”,即重载!
当然,如果你只是简单比较两个student对象是否相同,你完全可以写一个方法,参数是一个Student类的对象。而我建议你不要将它命名为equals以免混淆!
但是如果你需要一个使用场合更为复杂的比较方法,比如判断一个Animal类对象是否等于一个Student类对象(当然一般你不会有意这样比较,也许是你不小心这样比了,或者其它情况),那么我建议你重写一个equals方法来覆盖Object类的equals方法,同时我建议你也重写一个hashCode方法来保持一致性。这样一来你就万无一失了,如果有一个10岁的学生小强,和一个10岁的宠物小强,当你调用equals方法时你不会得出它们是同一个人的错误结论!