黑马程序员技术交流社区
标题: 接口实现问题 [打印本页]
作者: First 时间: 2013-5-28 19:30
标题: 接口实现问题
本帖最后由 First 于 2013-5-29 18:09 编辑
- import java.util.Comparator;
- import java.util.Iterator;
- import java.util.TreeSet;
- /*
- 练习:按字符串长度排序。
- */
- class Demo{
- public static void main(String [] args){
- TreeSet ts = new TreeSet(new StringLengthComparator());
- ts.add("a");
- ts.add("adf");
- ts.add("aa");
- ts.add("aaa");
- ts.add("aadf");
- ts.add("addf");
- Iterator it = ts.iterator();
- while(it.hasNext()){
- String s = (String) it.next();
- System.out.println(s.length()+"\t"+s);
- }
- }
- public static void sop(Object obj){
- System.out.println(obj);
- }
- }
- class StringLengthComparator implements Comparator{
- @Override
- public int compare(Object o1, Object o2) {
- // TODO Auto-generated method stub
- String s1 = (String) o1;
- String s2 = (String) o2;
- int num = s1.length()-s2.length();
- if(num == 0)
- return s1.compareTo(s2);
- return num;
- }
- }
复制代码 问题:StringLengthComparator 实现了 Comparator接口,可是Comparator接口有 compare 和 equals 两个方法,为何上面的代码只实现了一个方法也能够通过编译,还能正常运行?
作者: 赵利斌 时间: 2013-5-28 19:47
因为string类型已经实现了Comparable<String> 已经有一个自然排序了!!可以查看API文档
public final class Stringextends Objectimplements Serializable, Comparable<String>, CharSequence
作者: student 时间: 2013-5-28 19:51
equals方法是Object的方法,Comparator是Object的子类,equals方法在Object类中不是抽象方法。
所以,如果子类不覆盖父类方法,则使用父类的方法。所以上面的例子可以通过编译。
作者: 小羽天空 时间: 2013-5-28 20:00
兄弟这是Comparetor的API里的内容,实现Comparetor接口equals方法可以不重写。
equals
boolean equals(Object obj)指示某个其他对象是否“等于”此 Comparator。此方法必须遵守 Object.equals(Object) 的常规协定。此外,仅当 指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时,此方法才返回 true。因此,comp1.equals(comp2) 意味着对于每个对象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。
注意,不 重写 Object.equals(Object) 方法总是 安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。
覆盖:
类 Object 中的 equals
参数:
obj - 要进行比较的引用对象。
返回:
仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。
另请参见:
Object.equals(Object), Object.hashCode()
--------------------------------------------------------------------------------
作者: First 时间: 2013-5-28 20:14
student 发表于 2013-5-28 19:51
equals方法是Object的方法,Comparator是Object的子类,equals方法在Object类中不是抽象方法。
所以,如果 ...
接口中不是只能有抽象方法吗?
那么 Comparator 中的 equals 不是应该是抽象的吗?
作者: First 时间: 2013-5-28 20:19
小羽天空 发表于 2013-5-28 20:00
兄弟这是Comparetor的API里的内容,实现Comparetor接口equals方法可以不重写。
equals
为何不用重写呢? Comparator 是 interface 啊??
作者: 韩明海 时间: 2013-5-28 21:11
First 发表于 2013-5-28 20:14
接口中不是只能有抽象方法吗?
那么 Comparator 中的 equals 不是应该是抽象的吗? ...
Comparator 中的 equals是继承object的,equals在object中不是抽象的,是事实存在的方法。
后面的类实现借口comparator,但是也继承了object,所有的类都是从object继承过来的,java中只有object是没有父类的,所以其他所有的类都可以直接使用object的方法
作者: 小羽天空 时间: 2013-5-28 22:26
First 发表于 2013-5-28 20:19
为何不用重写呢? Comparator 是 interface 啊??
Comparator 中的 equals是继承object的且在object中的equals不是抽象的,就可以直接调用object的equals,,。对于继承你应该知道的吧。所以就可以不用在Comparator中重写了。
作者: 愿㊡╃數曐曐メ 时间: 2013-5-28 23:00
如果要实现一个接口的话,必须实现这个接口中的所有的抽象方法。
作者: 袁梦希 时间: 2013-5-29 07:18
小羽天空 发表于 2013-5-28 20:00
兄弟这是Comparetor的API里的内容,实现Comparetor接口equals方法可以不重写。
equals
非常好
作者: student 时间: 2013-5-29 08:44
First 发表于 2013-5-28 20:14
接口中不是只能有抽象方法吗?
那么 Comparator 中的 equals 不是应该是抽象的吗? ...
我看了源代码,发现Comparator的equals方法并不是抽象的,该方法如下:
boolean equals(Object obj);
只有方法声明,没有方法体。我又开始疑惑了。
作者: 殇_心。 时间: 2013-5-29 16:51
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
作者: First 时间: 2013-5-29 18:09
小羽天空 发表于 2013-5-28 22:26
Comparator 中的 equals是继承object的且在object中的equals不是抽象的,就可以直接调用object的equals, ...
不用覆盖 equals 方法,api 还要把它标记出来,这样是不是有点 多此一举了???
作者: 小羽天空 时间: 2013-5-30 12:00
First 发表于 2013-5-29 18:09
不用覆盖 equals 方法,api 还要把它标记出来,这样是不是有点 多此一举了??? ...
你可以重写啊,你compare方法是根据你的equals方法来判断的,你重写了,他的返回也不一样了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |