Java8中引入的默认方法,充分展现了Java平台概念的一致性与JDK向前兼容之间的矛盾,并且以牺牲概念的一致性而知足JDK向前兼容。java
【曾经】Java接口纯粹是契约的集合,是一种程序设计的表达方式。从数据抽象的角度看,可以在不定义class的同时又能够定义type,将是程序设计中强大而有用的机制。Java接口就是这些纯粹的接口组成的数据抽象。Java接口只可以拥有抽象方法,它不涉及任何实现,也不能建立其对象(这一点和抽象类一致)。程序员
多重继承模型致使额外的复杂性,其中最著名的是钻石问题或者叫“讨嫌的菱形派生”(Dreadful Diamond onDerivation、DDD)。为何Java接口可以避免多继承的复杂性,关键在于它仅仅包含abstract方法。然而从设计的角度看,Java接口放弃了多继承的内在/固有目标,而显得是一个权宜之计。框架
【如今】Java8以前,接口不能升级。由于在接口中添加一个方法,会致使老版本接口的全部实现类的中断。λ表达式做为核心出现,为了配合λ表达式,JDK中Collection库须要添加新的方法,如forEach(),stream()等,因而引入了默认方法(defender methods,Virtual extension methods)。它是库/框架设计的程序员的后悔药。对于之前的遗留代码,你们都不知道有这个新方法,既不会调用,也不会去实现,如同不存在;编写新代码的程序员能够将它视为保底的方法体。类型层次中任何符合override规则的方法,优先于默认方法,由于遗留代码可能正好有一样的方法存在。ide
默认方法,理论上抹杀了Java接口与抽象类的本质区别——前者是契约的集合,后者是接口与实现的结合体。固然,语法上二者的差异和之前同样。这就须要程序员来自觉维护二者的本质区别,把默认方法做为库、框架向前兼容的手段。spa
默认方法的一个好处:多继承的著名的是钻石问题(The Diamond Problem )再次须要关注。于是使之前某些人认为的“为了解决多继承问题而引入接口机制”的说法变成明显的错误——之前也是错误的认识。设计
有关java1.8 的详细说明参考 http://lucida.me/blog/java-8-lambdas-insideout-language-features/对象