jdk1.8新特性之default关键字
前言
今天学习集合源码时,在Iterable接口中发现default关键字。
是什么?
default是在java8中引入的关键字,也可称为Virtual extension methods——虚拟扩展方法。
是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。
为什么要?
之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类。
默认方法使得开发者可以在不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法。
二进制兼容性:所谓“二进制兼容性”指的就是在升级(也可能是 bug fix)库文件的时候,不必重新编译使用这个库的可执行文件或使用这个库的其他库文件,程序的功能不被破坏。
怎么用?
1、继承接口,实现接口
public interface Interface1{ default void helloWorld() { System.out.println("Interface1"); } }
public class MyImplement implements Interface1{ public static void main(String[] args) { MyImplement myImplement = new MyImplement(); //直接调用helloWorld()方法 myImplement.helloWorld(); } }
2、同时实现两个有同名默认方法的接口
public interface Interface2{ default void helloWorld() { System.out.println("Interface2"); } }
/** * 实现接口Interface1,Interface2 */ public class MyImplement implements Interface1,Interface2{ public static void main(String[] args) { MyImplement myImplement = new MyImplement(); //直接调用helloWorld()方法 myImplement.helloWorld(); } }
报错,不知道该调用哪个方法。解决办法:在实现类中重写该方法。
3、类优于接口
public class MyImplement2 extends MyImplement implements Interface2{ public static void main(String[] args) { MyImplement2 myImplement2 = new MyImplement2(); myImplement2.helloWorld(); } }
会调用父类方法。
注:1、jdk8.0中允许接口中使用静态方法。
2、尽管默认方法有这么多好处,但在实际开发中应该谨慎使用:在复杂的继承体系中,默认方法可能引起歧义和编译错误。