接口不是类,而是对类的一组需求描述。
Arrays类中的sort方法承诺可以对对象数组进行排序,但要求满足下列条件:对象所属的类必须实现了Comparable接口。
public interface Comparable
{int compareTo(Object other);
}
Java SE5.0,Comparable接口已经改为泛型类型
public interface Comparable<T>
{int TEST_VAR = 1;int compareTo(T other);
}
1. 任何实现Comparable接口的类都需要包含compareTo方法,并且这个方法的参数必须是一个Object对象,返回一个整型数值。
2. 接口中所有方法自动地属于public。因此,在接口中声明方法时,不必提供关键字public。
但是在实现接口时,必须把方法声明为public,否则编译器将认为这个方法的访问属性是包 可见性。
3. 接口中可以定义常量。与接口中的方法都被自动地被设置为public一样,接口中的域将被自动设为public static final。
4. 接口中不能含有实例域。
5. 接口中可以建档提供方法,但是这些方法中不能引用实例域——接口中没有实例域。
类实现某个接口:
public class Employee implements Comparable<Employee>
{private int id;private String name;/*** compareTo返回一个整型数值。对象不相等,返回一个正值或者负值。在对两个整数域进行比较时,这点非常有用。* 例如:根据id对Employee进行排序,可以返回id-other.id* 但是注意:整数范围不能够过大,以免造成减法计算溢出。* 如果id为非负整数,或者他们的绝对值不超过(Integer.MAX_VALUE - 1) / 2,就不会出现问题。否则,调用Integer.compare方法。 */public int compareTo(Employee other){return Integer.compare(id, other.id);// return id - other.id;// double类型可以用Double.compare()}
}
和.equals方法一样,在子类Manager继承父类Employee的时候,Comparable中compareTo方法也会出现问题,子类中compareTo方法修改方式和.equals方法类似。有两种不同的情况:
- 如果子类之间的比较含义不一样,那就属于不同的子类对象的非法比较。每个compareTo方法都应该在开始时进行下列检测:
if (getClasss() != other.getClass()) throw new ClassCastException();
2. 如果存在这样一种通用算法,它能够对两个不同的子类对象进行比较,则应该在超类中提供一个compareTo方法,并将这个方法声明为final。