在学习数组时,Arrays类中的sort方法可以对对象数组进行排序但是:

对象所属的类必须实现Comparable接口。

Comparable接口的定义:

【java笔记】常用接口:Comparable接口_子类

java5之后接口可以加上泛型 


例:person类age,name,person按年龄排序: 

【java笔记】常用接口:Comparable接口_子类_02

【java笔记】常用接口:Comparable接口_子类_03

public class person implements Comparable<person>{
     int age;
     String name;
     public person(int age, String name) {
            this.age = age;
            this.name = name;
     }
    @Override
    public int compareTo(person o) {
        return Integer.compare(this.age,o.age);
    }
    @Override
    public String toString() {
        return "person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
public class test {
    public static void main(String[] args) {
        person[] p=new person[3];
        p[0]=new person(10,"a");
        p[1]=new person(5,"b");
        p[2]=new person(15,"c");
        Arrays.sort(p);
        for (int i = 0; i < p.length; i++) {
            System.out.println(p[i]);
        }
        //person{age=5, name='b'}
        //person{age=10, name='a'}
        //person{age=15, name='c'}
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

用到的API:

【java笔记】常用接口:Comparable接口_父类_04

在重写时比较浮点数不能使用相减的技巧,当两个浮点数很接近但又不相等时,它们的差四舍五入后可能为0. 用Double.compare

规定:重写时保证:sgn(x.compareTo(y))+sgn(y.compareTo(x))=0


拓展:如果父类实现comparable接口,子类继承父类override compareTo方法可能出错。

(1)如果不同子类中有不同的含义

if(getClass()!=other.getClass())throw new ClassCastException();
  • 1.

(2)如果父类和子类能够比较,把compareTo声明为final(不可继承)