【Java为什么要实现Comparable接口】

握草 2018-01-20 10:51:45
举个最简单的例子(代码来源:http://blog.csdn.net/u010839723/article/details/44300943):

class Student implements Comparable<Student>{
private String name;
private int age;
private float score;

public Student(String name, int age, float score) {
this.name = name;
this.age = age;
this.score = score;
}

public String toString()
{
return name+"\t\t"+age+"\t\t"+score;
}

@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
if(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部
return -1;//由高到底排序
else if(this.score<o.score)
return 1;
else{
if(this.age>o.age)
return 1;//由底到高排序
else if(this.age<o.age)
return -1;
else
return 0;
}
}
}

public class ComparableDemo01 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu[]={new Student("zhangsan",20,90.0f),
new Student("lisi",22,90.0f),
new Student("wangwu",20,99.0f),
new Student("sunliu",22,100.0f)};
java.util.Arrays.sort(stu);
for(Student s:stu)
{
System.out.println(s);
}
}
}

Comparable接口就像是一份“契约”,一旦继承了该接口就要实现comparTo方法,但是我们完全可以在Student类中自己写一个comparTo()方法啊,为什么还要大费周章的“先继承Comparable接口再调用java.util.Arrays.sort()方法以间接的调用被我们实现的compareTo方法”,这样不是显得很多余吗??
为例区别对待,我再举另一个接口的例子:
class MyThread implements Runnable{..}

这时候我们“必须”继承Runnable接口,因为我们要覆写run方法,才能从CPU调度上实现“多线程”。。这是一种规范,但是必须遵守(否则就无法写出多线程)。。
但是这里,如果不继承comparable接口,而是在自己的Student类中写一个自己的比较方法,不也是可以实现比较的功能吗?即然这样,为什么还是要大费周章的继承comparable接口呢——这样做有什么好处??
...全文
853 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2018-01-20
  • 打赏
  • 举报
回复
两种方法都可以。继承就是规范可以限制。而额外实现就灵活。
握草 2018-01-20
  • 打赏
  • 举报
回复
@weixin_39670158,对于你的回复我想提及点: 1. “假如按照你的说法,在自己的Student类中写一个自己的比较方法 那么sort(Student [] stus)方法需要做怎样的改动呢? 重载一个Student[] 的方法? 不现实,每次增加新的类比如Teacher都要写重载的sort()方法” 回复:那也不一定要继承自Comparable接口吧。。只要可以有这样规定的一份契约,我们大可以自己写一个接口名曰“MyComparable”,然后搞一个comparTo方法,这样让Teacher和Student都继承自MyComparable接口不就好了吗? 2. “上转型Object[] 然后调用compareTo()方法? 这个也不行,转成Object类后compareTo方法也看不到了” 回复:为什么要向上转型??不明白你是怎么想的。。 还是那句话,“为什么要继承自Comparable接口呢”,好好好继承接口~~~即然“合同上写的都是抽象的方法”,为什么非要继承自Compareable接口呢,也可以继承自MyComparable、YourComparable之类的啊喂~~
weixin_39670158 2018-01-20
  • 打赏
  • 举报
回复
sort方法点进去 Comparable pivot = (Comparable) a[start]; if (pivot.compareTo(a[mid]) < 0) 简单来说 里面用到了Comparable接口的compareTo方法 但是我们完全可以在Student类中自己写一个comparTo()方法啊? 1.源码写死了强转Comparable接口然后调用comparTo方法排序 2.要排序的数组元素只要继承comparable接口(按照你的说法) 然后调用方法compareTo比较,排序,数组元素类型与排序方法完全解耦(完全好像有点夸张)。 假如按照你的说法,在自己的Student类中写一个自己的比较方法 那么sort(Student [] stus)方法需要做怎样的改动呢? 重载一个Student[] 的方法? 不现实,每次增加新的类比如Teacher都要写重载的sort()方法 上转型Object[] 然后调用compareTo()方法? 这个也不行,转成Object类后compareTo方法也看不到了。 继承comparable接口,实现其中的比较方法,sort()方法中只需将数组中的元素强转为Comparable接口,再调用其中的比较方法就可以进行排序了。 不管你的数组元素是什么类型,Student,Teacher,blablabla 只要你实现了Comparable的compareTo方法就可以使用sort()方法进行排序 3.在自己的Student类中写一个自己的比较方法 也可以,但是排序的方法你要自己写, public static sort(Student[] students){ for(int i=0;i<students.length-1;i++) if(students[i].compareTo(students[i+1])<0){ //交换 //参考代码仅供说明,根据情况自己使用排序算法 }}可以跟使用了接口的代码对比,好处应该很明显了

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧