默认接口方法

如前所述,在JDK8之前,接口不能定义任何实现.这意味着在Java以前的版本中,由接口定义的方法是抽象的,不包括方法体.这是接口的一般形式,在前面的讨论中使用的就是这种类型的接口.JDK8版本的发布改变了这一点,其中给接口添加了一个新的功能–默认方法.默认方法允许为接口方法定义默认实现.换句话说,通过使用默认方法,现在可以为接口方法提供方法体,使其不再是抽象方法.在开发默认方法时,他也被称为扩展方法(extension method),你会看到这两个术语经常被互用.
默认方法的主要作用是,在不破坏现有代码的情况下,提供一种扩展接口的方式.回想一下,由接口定义的所有方法必须有实现.在过去,如果添加一个新方法到一个活跃的,广泛使用的接口,就会破坏现有的代码,因为该方法没有具体的实现.默认方法通过提供要被使用的实现(假设没有其他被显式提供的方法),解决该问题.因此,默认方法的出现不会破坏现有代码.
默认方法的另一个作用是定义接口中的方法,实际上,这是可选的,取决于接口的使用方式.例如,接口可以定义一组处理一系列元素的方法,如方法之一remove(),该方法旨在从序列中删除元素.但如果接口既支持修改的序列又又支持不可修改的序列,那么remove()实质上就是可选的,因为不可修改的序列不会使用他.以前,即使不需要,实现不可修改的序列的类也必须定义remove()的空实现.现在,可以在接口中为remove()指定默认实现,他要么什么也不做,要么报告错误.提供这样的默认方法可以阻止在不可修改序列(环境)中使用的类定义自己的,替代版本的remove().因此,通过提供默认方法,接口可以使类对remove()的实现是可选的.重点要指出的是,默认方法的出现并不会改变接口的如下重要方面:接口仍然不能通过自身来创建实例,而必须由类来实现.因此,从JDK8开始,即使接口可以定义默认方法,但如果没有创建实例,那么仍然必须由类来实现.
最后一点:作为一项通用规则,默认方法仅适用于专用功能.你创建的接口仍主要用于指定要做什么,而不说明如何去做.不过,包含默认方法可以带来更多的灵活性.