A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 申绪胜 于 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参数类型的方法

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

8 个回复

倒序浏览
你这叫方法重载 overlaod了  先重写 再重载的过程 你穿的student类型 当然调用public boolean equals(Student s)  最好写成object
回复 使用道具 举报
你只是在子类中重载了一个方法,我觉得还是叫开发工具帮忙吧,不要自己手动去写,直接右键source-->Generate hashCode() and equals()这样可以避免因重载带来的麻烦
回复 使用道具 举报
感觉楼上二位都没说到我心里,没说到点上...
回复 使用道具 举报
老师说的并没有错,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了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 郭学文 于 2011-12-4 21:39 编辑

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

你打印这句再想想就明白了

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
equals方法有很多很种,不可能equals方法的参数只能只写Object,例如:在Arrays工具类中就有很多,建议参考API文档.
你如果在你目前这个类写Object代表覆写或重写,你可以在上面加上注解"@Override",编译器没报错就对了.
你如果写成Student代表的是方法的重载,表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。这也是Java面向对象的三大特征之一多态.

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
韩军博 黑马帝 2011-12-4 21:56:32
8#
本帖最后由 韩军博 于 2011-12-4 21:59 编辑

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

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
申绪胜 黑马帝 2011-12-4 22:13:42
9#
谢谢大家 我懂了!!{:soso_e113:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马