黑马程序员技术交流社区

标题: 复写equals()方法中的参数必须是Object类型的吗? [打印本页]

作者: 申绪胜    时间: 2011-12-4 18:45
标题: 复写equals()方法中的参数必须是Object类型的吗?
本帖最后由 申绪胜 于 2011-12-4 22:14 编辑

  1. public class Student {
  2.         private String name;
  3.         private int age;
  4.         public Student(String name,int age){
  5.                 this.name=name;
  6.                 this.age=age;
  7.         }
  8.         public boolean equals(Student s){
  9.                 return false;
  10.         }
  11.         public boolean equals(Object o){
  12.                 return true;
  13.         }
  14.         public static void main(String[] args) {
  15.                 Student s1=new Student("zhangsan",20);
  16.                 Student s2=new Student("lisi",19);
  17.                
  18.                 System.out.println(s1.equals(s1));

  19.         }

  20. }
复制代码
如上代码 我把参数改为了Student类型的 然后输出结果就为false了  
可是我记得毕向东老师15-07  11分28秒时 说equals方法的参数类型只能是Object的
可是我这样写不但没报错 反而还调用了Student参数类型的方法
作者: 李盈科    时间: 2011-12-4 19:30
你这叫方法重载 overlaod了  先重写 再重载的过程 你穿的student类型 当然调用public boolean equals(Student s)  最好写成object
作者: 段波    时间: 2011-12-4 19:47
你只是在子类中重载了一个方法,我觉得还是叫开发工具帮忙吧,不要自己手动去写,直接右键source-->Generate hashCode() and equals()这样可以避免因重载带来的麻烦
作者: 申绪胜    时间: 2011-12-4 20:28
感觉楼上二位都没说到我心里,没说到点上...
作者: 许邦存    时间: 2011-12-4 21:33
老师说的并没有错,equals方法的参数类型只能是Object的 ,要重写的话函数应该是public boolean equals(Object o),但是你的 public boolean equals(Student s)相当你自己写了一个新方法而不是重写object中的equals方法,因为你传的参数是student,那么就不是重写了,而是你自己定义的一个新方法。那么System.out.println(s1.equals(s1))调用的是你自己的方法public boolean equals(Student s),打印的结果就是false了。
作者: 郭学文    时间: 2011-12-4 21:38
本帖最后由 郭学文 于 2011-12-4 21:39 编辑

System.out.println(((Object)s1).equals((Object)s1));

你打印这句再想想就明白了
作者: 王德云    时间: 2011-12-4 21:54
equals方法有很多很种,不可能equals方法的参数只能只写Object,例如:在Arrays工具类中就有很多,建议参考API文档.
你如果在你目前这个类写Object代表覆写或重写,你可以在上面加上注解"@Override",编译器没报错就对了.
你如果写成Student代表的是方法的重载,表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。这也是Java面向对象的三大特征之一多态.
作者: 韩军博    时间: 2011-12-4 21:56
本帖最后由 韩军博 于 2011-12-4 21:59 编辑

1.楼主没有弄清楚Override 和OverLoad。
如果是Override的话,则父类中的方法不能是私有的,且子类中写的覆盖方法的方法名,方法返回的类型,参数的个数,参数的类型,以及顺序等等
都要和父类中的相同。
楼主可以在子类的方法上加上注解@Override.这样Eclipse就可以自动检测子类中的方法是否覆盖父类中的方法(即写法是否有错误),
如果写的覆盖方法不正确的话,则编译都通不过。
2.Overload就是类中的某个方法除了和另一个方法参数有区别外,其他的都相同。因为子类自动从父类中继承了equals()方法,所以,你写的是
参数为Student实例的equals()方法只是一个重载的方法。
另外,如果两个方法只是返回值得类型不同的话,则不能叫做是重载。
作者: 申绪胜    时间: 2011-12-4 22:13
谢谢大家 我懂了!!{:soso_e113:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2