黑马程序员技术交流社区

标题: 接口实现问题 [打印本页]

作者: First    时间: 2013-5-28 19:30
标题: 接口实现问题
本帖最后由 First 于 2013-5-29 18:09 编辑
  1. import java.util.Comparator;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;


  4. /*
  5. 练习:按字符串长度排序。
  6. */

  7. class Demo{
  8. public static void main(String [] args){
  9. TreeSet ts = new TreeSet(new StringLengthComparator());

  10. ts.add("a");
  11. ts.add("adf");
  12. ts.add("aa");
  13. ts.add("aaa");
  14. ts.add("aadf");
  15. ts.add("addf");


  16. Iterator it = ts.iterator();
  17. while(it.hasNext()){
  18. String s = (String) it.next();
  19. System.out.println(s.length()+"\t"+s);
  20. }
  21. }

  22. public static void sop(Object obj){
  23. System.out.println(obj);
  24. }
  25. }


  26. class StringLengthComparator implements Comparator{

  27. @Override
  28. public int compare(Object o1, Object o2) {
  29. // TODO Auto-generated method stub
  30. String s1 = (String) o1;
  31. String s2 = (String) o2;

  32. int num = s1.length()-s2.length();

  33. if(num == 0)
  34. return s1.compareTo(s2);
  35. return num;
  36. }

  37. }
复制代码
问题: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