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、尽管默认方法有这么多好处,但在实际开发中应该谨慎使用:在复杂的继承体系中,默认方法可能引起歧义和编译错误。

posted @ 2019-06-22 15:57  lcnb  阅读(1261)  评论(0编辑  收藏  举报