概述
接口(interface)用来描述类应该做什么,而不是指定它们具体应该如何做。
接口不是类,而是对希望符合这个接口的类的一组需求。
类可以实现接口,使用关键字implements,一个类可以实现多个接口。
语法细节
1.关于接口的字段
(1).接口绝对不会有实例字段。
(2).接口可以定义字段,但被默认为public static final修饰的常量。
(3).可以声明接口变量,但不能实例化出一个接口的对象,该变量可以引用实现了该接口的类的对象。
2.关于接口的方法
(1).接口的方法都是默认被public修饰。
(2).一个类实现接口时,也必须把该方法声明为public。
(3).在java 8中,允许为接口增加静态方法。
(4).在java 9中,可以定义private方法,同时也可以是静态的,通常仅作为辅助方法。
3.接口的默认方法
(1).可以定义默认方法,也就是有默认实现的方法,用default来声明(访问控制还是public)。
(2).默认方法出现冲突的情况下,实型超类优先,也就是继承的类中的方法优先与接口中的方法。
(3).如果是两个接口中同时出现冲突的默认方法,则需要显式指示具体方法,如:
class Student implements Person,Named{
public String getName(){
return Person.super.getName();
}
...
}
(4).只要有一个接口中的冲突方法提供了默认实现,则必须如上进行显式指定。
(5).绝不能创建一个默认方法重新定义Object中的某个方法,如toString或equals,因为所有的类默认继承Object类,在超类优先原则下,这些方法永远无法超越Object提供的方法。
接口与回调
回调(callback)是一种常见的程序设计模式。本质含义是,可以将一个有特定行为的对象传递给一个方法,这个方法就可以自行的在需要的时候调用这个特定对象的方法。
一个典型的例子是Comparator比较器:
在对ArrayList数组进行排序时,我们可以使给数组中的每一个元素实现Comparable接口并实现comparaTo方法,以提供调用方法Arrays.sort(list);时的默认排序策略。
同时我们也可以自定义一个包含排序策略的对象,并将这个对象传递给sort方法,以此来实现除默认compareTo方法以外的其他排序策略,如Arrays.sort(list,obj);,这就是回调的思想。
具体来说,就是自定义一个比较器类(LengthComparator),其实现Comparator接口,并重写conpare方法,然后通过new的方式传递给sort方法:
public class Main {
public static void main(String[] args){
String[] list = {"xiaoming","xiaoliu","xiaohuang"};
Arrays.sort(list,new LengthComparator());
System.out.println(Arrays.toString(list));
}
}
class LengthComparator implements Comparator<String>,Cloneable{
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(),o2.length());
}
}
经验总结
java不允许多重继承(extends),但允许实现多个接口;多重继承会让语言变得十分复杂(如C++)或是让程序运行效率降低(如Eiffel);但java接口可以提供多重继承的大多数好处,同时还能避免多重继承的复杂性和低效性。