接口(Interface)与 回调(callback):Core Java 6.1

接口 interface

接口技术主要用来描述类有什么功能,而并不给出每个功能的具体实现。

接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。

如果类遵从某个接口,那么就履行这项服务。

例如:
方法Arrays :: sort(T [] elements ),可以对数组中的元素进行排序,
但要求类型T必须实现了接口方法Comparable<T> :: compareTo(T other)
此方法要求实现了此接口的类,必须根据业务需求,编码实现对两个对象进行对比,(根据排队一般从矮到高的情况)如果返回方法1,则经过sort()方法排序后this对象排序在other对象后,如果返回-1,则t经过sort()方法排序后this对象排序在other前,如果返回0,则两者相等,无所谓顺序。

public class Employee implements Comparable<Employee>{
	
	private double salary;
	...
	public int compareTo(Employee other){
		return	Double.compare(salary, other.salary);
	}
}

接口语法规则

所有方法默认是public abstract的,无需主动声明。

所有域都是public static final的常量,因此常量前也无需主动声明这些修饰符。

不能有实例域。

接口方法可以有默认实现:default修饰即可。

可以有static方法,在JDK中,有些接口各自有一个伴随类。伴随类都是提供操作那些实现了接口的类对象的工具类,例如:Collection 与 Collections。
可以直接将伴随类中的static方法定义在接口中,无需再定义一个伴随类。

默认方法的意义:接口演化

接口演化(interface evolution),是指最初声明接口的时候只声明了一个方法,而且也定义了不少的类来实现了这个接口。随着功能的优化,需要为接口声明新的方法。

此时如果接口不允许新方法为默认方法,那么已经存在的所有实现了这个接口的类,都必须进行源码级别的修改和重新编译部署。

但默认方法就可以解决接口演化中的问题,因为接口方法有默认实现,那么实现此接口的类就不是必须修改源码去实现新声明的接口方法。

默认方法的冲突问题

  1. 当类的超类和实现的接口中,有相同声明的方法,并且都有实现时,遵循“类优先”原则,选择超类的方法
  2. 当类实现的多个接口中,有相同声明的方法,并且其中一个或以上的接口对于此方法有默认实现时,开发人员必须通过覆盖这个方法进行处理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章