ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
原文链接:[Java 8 之默认方法(Default Methods)](http://blog.csdn.net/kimylrong/article/details/47277577) --- Oracle官网是这样介绍默认方法的,使用默认方法,可以达到往接口里面增加新的功能,而且保持与老版本代码兼容,也就是原来的实现类可以不需要被动修改。所以,默认方法位置是在接口里面;默认方法具有实现,不会强制具体类来现。Java 8要充分利用Lambda,需要增强大量的类库,但是又希望做到兼容性,只能用默认方法这个大招。 ## 默认方法 默认方法与普通的接口方法相比,最前面增加**default**关键字,参数列表之后接大括号,实现该方法,再后面没有分号。 ### 默认方法的例子 ~~~ public interface Player { String getName(); default boolean isMale() { return true; } } ~~~ ### 扩展包含默认方法的接口 当一个接口扩展另外一个包含默认方法的接口的时候,有以下3种处理方式。 * **完全无视默认方法**  直接继承了上级接口的默认方法 * **重新申明默认方法**  重新把默认方法申明为抽象方法(无实现,具体子类必需再次实现该方法) * **重新实现默认方法**  重写了默认方法的实现,依然是一个默认方法。 抽象类实现包含默认方法的接口和上述描述一样。具体类实现包含默认方法的接口的,没有第二条。 ## 接口静态方法 Java 8 接口也可以有静态方法了。静态方法,从职责定位来讲,就是个工具方法。 ~~~ public interface Player { String getName(); public static void printContact(Contact contact) { // TODO print contact for play in the following } } ~~~ ## 接口与抽象类 记得在什么地方看到过,Java之父说,再给他一次设计Java的机会,Java里就不会有抽象类。面试的时候也有很多时候问接口与抽象类的区别。 总的来说抽象类和接口越来越接近了,是接口向抽象类靠近,剥夺抽象类的生存空间。  默认方法和接口静态方法都是重型武器。 * **与抽象类相比,接口不能搞定的** * 抽象类能够定义非 static final 的属性(field)  ,而接口不能。接口的属性都是static final的。 * 抽象类能够定义非public方法,而接口不能。接口的方法都是public的。 * **与接口相比,抽象类不能搞定的** * 接口可以多继承(实现),而抽象类不能。抽象类只能单继承。 ## 结语 虽然默认方法在JDK里面主要用于扩展已有类库,不过新的项目默认方法依然很有价值。  曾今的写接口,写抽象类,写具体类这个流程,某些时候可以省去中间的这个步骤。而且接口里面也可以存放一些工具方法了(接口静态方法)。不过,记得接口的方法都是public的,如果想要严格控制访问,那么还得使用抽象类。