Arrays 类中的 sort 方法承诺可以对对象数组进行排序 , 但要求满足下列前提 : 对象所属的类必须实现了 Comparable 接口。
下面是Comparable接口的代码
public interface Comparable
{
int compareTo ( Object other ) ;
}
为了让类实现一个接口 , 通常需要下面两个步骤 :
1 ) 将类声明为实现给定的接口 。
2 ) 对接口中的所有方法进行定义 。
要将类声明为实现某个接口 , 需要使用关键字 implements , 例如:
class Employee implements Comparable<Employee> //为泛型 Comparable 接口提供一个类型参数
{
public int compareTo(Employee other)//接口的方法实现一定要带public
{
return double.compare(salary,other.salary);
}
}
接口不是类, 尤其不能使用 new 运算符实例化一个接口 :
Comparable x = new Comparable ( . . . ) ; / / ERROR
然而, 尽管不能构造接口的对象 , 却能声明接口的变量 :
Comparable x ; // OK
接口变量必须引用实现了接口的类对象 :
x = new Employee ( . . . ) ; / / OK provided Employee implements Comparable
如果一个类想实现多个接口,implements 后面的接口名字我们需要用逗号隔开
为什么不用抽象类代替接口呢?
因为Java不能多重继承,一个类只能对一个抽象类进行具体化,而一个类有的时候是需要对多个接口进行实现的。
可以为接口方法提供一个默认实现。 必须用default 修饰符标记这样一个方法。这样做的好处是:
1.如果一个接口有多个方法,那么类中想用到这个接口必须实现全部的方法,而你只想用里面的部分方法,其他方法你并不关心,所以可以在接口方法中提供一个默认实现,这样你只需要去实现你需要的方法就可以了
2.如在在一个接口中突然添加了一个方法,那么最好是给他一个默认方法,不然用到这个接口的类由于没有对新添加的方法进行实现会无法编译
如果类中实现了两个接口,这两个接口有同样的默认方法(参数,返回值),我们需要重新定义这个方法。
class Student extends Person implements Named { . . . }
在这种情况下, 只会考虑超类方法 , 接口的所有默认方法都会被忽略 。这就是"类优先"规则。