所有类的父类都是都是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这样的参数?就因为父类中这样写的?所以我们继承了重写时候也必须这样写?

解决方案 »

  1.   

    重写就是要求和父类的参数名 返回类型 参数列表都一样哦。而且用Object做参数就可以传递任意类型的引用类型变量。这是因为java的多态性
      

  2.   

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