概述
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的。
- 抽象类能够定义非 static final 的属性(field)
与接口相比,抽象类不能搞定的
- 接口可以多继承(实现),而抽象类不能。抽象类只能单继承。
结语
虽然默认方法在JDK里面主要用于扩展已有类库,不过新的项目默认方法依然很有价值。
曾今的写接口,写抽象类,写具体类这个流程,某些时候可以省去中间的这个步骤。而且接口里面也可以存放一些工具方法了(接口静态方法)。不过,记得接口的方法都是public的,如果想要严格控制访问,那么还得使用抽象类。
最后
以上就是阳光雪碧为你收集整理的Java 8 之默认方法(Default Methods)的全部内容,希望文章能够帮你解决Java 8 之默认方法(Default Methods)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复