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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汤密奕 初级黑马   /  2012-7-10 17:38  /  1659 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 汤密奕 于 2012-7-10 23:20 编辑

关于comparator比较器的两点疑问
1、首先comparator是个接口,只有compare和equals两个方法,既然是个接口,实现时必须覆盖其所有方法,在看毕老师“实现Comparator方式排序”这集视频时,并没有覆盖掉equals方法,也能编译通过,为什么?
2、查看comparator的api时,有如下信息
覆盖:
类 Object 中的 equals
参数:
obj - 要进行比较的引用对象。
返回:
仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。
另请参见:
Object.equals(Object), Object.hashCode()

对于这个方法的覆盖我的疑问是,定义一个接口类在覆盖父类的方法时,覆盖的方法上原来可以加上abstract修饰符么

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
一、所有类都默认 extends Object 类,都从Object类中,拿到了 equals, 所以不显示重写equals时,也可编译通过。

二、
对于这个重载我的疑问是,定义一个接口类在重载父类的方法时,

接口可以继承一个类吗? 接口只能继承接口呢.

接口中的方法本来都是 abstract的,你不写,编译器在编译时,也会默认帮你加上去了。
回复 使用道具 举报
对于问题1我的看法是Object类是所有类的超类,Object类实现了equals方法:
  1. public boolean equals(Object obj) {
  2.         return (this == obj);
  3. }
复制代码
自然你写的类就继承了equals方法,不需要去实现,当然你有需要可按自己的需要重写。
引用API文档里的一段话:注意,不重写 Object.equals(Object) 方法总是 安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。
问题2:我认为你说的重载是不正确的,应该叫重写,你写的比较器类实现了接口,根据需要你可以决定是不是要重写equals方法。一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法。重写的方法肯定不能加上abstract修饰符嘛,这样的话你写的比较器类不就变成抽象类了,当然也不能实例化。


评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
首先第一个问题,关于equals方法文档里说的非常清楚:
Note that it is always safe not to override Object.equals(Object). However, overriding this method may, in some cases, improve performance by allowing programs to determine that two distinct comparators impose the same order.
不用重写equals方法也是可以的

第二个问题,我没太看明白,怎么叫接口类,如果是在接口中定义的方法即使你不使用abstract修饰它也必须是抽象的
当然如果你在实现接口的类中仍然使用abstract来修饰该方法时,那么你这个实现接口的类还是个抽象类了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马