JDK新特性(二)——接口组成

前言

说起接口,我们可能想到的是多态和接口中没有具体实现的方法,但在JDK1.8之后,对于接口的组成推出了一些新的特性,主要有接口默认方法接口静态方法接口私有方法。本篇文章将对这些接口相关的新特性进行介绍,希望能够给各位读者一个参考。

接口默认方法(JDK1.8推出)

我们先来看这样一个例子,假如已有一个接口和两个实现子类

public interface Student {
    void test1();
}

public class StudentImpl1 implements Student {
    @Override
    public void test1() {
        System.out.println("StudentImpl1 调用了 test1 方法");
    }
}

public class StudentImpl2 implements Student {
    @Override
    public void test1() {
        System.out.println("StudentImpl2 调用了 test1 方法");
    }
}

假如说,现在由于新的业务需要,我们需要在原有接口上新增一个方法,那么就会面临一个问题,就是我们不得不需要在其所有子类中再重新实现接口中新增的方法。

那么有没有可以解决这个问题的方法呢?

当然有,我们可以再新建一个继承Student的接口,在新的接口中定义新的方法,然后重新实现这个新接口。
但这个方法并不能根本上解决这个问题,假如过了一段时间后,我们有需要改动到这个接口,那么我们就又不得不再新创建一个接口了。
针对这种情况,在JDK1.8之后,推出了接口默认方法,默认方法中允许我们在该方法中写默认实现代码,我们只需要在接口新定义的方法前面加上default关键字即可,这样原先实现接口的子类也不会报错,有需要的话我们也可以选择重写这个方法来定义新的实现逻辑。这样就可以比较优雅地解决上面的问题。

public interface Student {
    void test1();
    default void test2(){
        System.out.println("Sutdent interface 调用了 test2 方法");
    }
}

public class StudentImpl1 implements Student {
    @Override
    public void test1() {
        System.out.println("StudentImpl1 调用了 test1 方法");
    }
}

public class StudentImpl2 implements Student {
    @Override
    public void test1() {
        System.out.println("StudentImpl2 调用了 test1 方法");
    }

    @Override
    public void test2() {
        System.out.println("StudentImpl2 调用了 test2 方法");
    }
}
注意:
    1. 默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字
    1. public可以省略,default不能省略

接口静态方法(JDK1.8推出)

在JDK1.8之后,接口还可以定义自己的静态方法:

public interface Student {
    void test1();
    default void test2(){
        System.out.println("Sutdent interface 调用了 test2 方法");
    }
    static void test3(){
        System.out.println("Sutdent interface 调用了 test3 方法");
    }
}

但是需要注意的是,实现子类无法调用接口的静态方法,我们可以通过 接口名.静态方法 来调用。
原因也很好理解,当出现一个子类实现了多个接口时,如果多个接口中存在有同名的静态方法,那么编译器并不能确定此时的实现子类调用的是哪个接口中的静态方法。

接口私有方法(JDK1.9推出)

Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java 8允许在接口中定义带方法体的默认方法和静态方法。
这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性。
我们这里讲一个例子大家就很容易可以理解了:

public interface Student {
    void test1();
    default void test2(){
        System.out.println("test2方法开始...");
        System.out.println("我是一个演示用例...");
        System.out.println("我是一个演示用例...");
        System.out.println("我是一个演示用例...");
        System.out.println("test2方法结束...");
    }   
    default void test3(){
        System.out.println("test3方法开始...");
        System.out.println("我是一个演示用例...");
        System.out.println("我是一个演示用例...");
        System.out.println("我是一个演示用例...");
        System.out.println("test3方法结束...");
    }
    static void test4(){
        System.out.println("test4方法开始...");
        System.out.println("我是一个演示用例...");
        System.out.println("我是一个演示用例...");
        System.out.println("我是一个演示用例...");
        System.out.println("test4方法结束...");
    }
    static void test5(){
        System.out.println("test5方法开始...");
        System.out.println("我是一个演示用例...");
        System.out.println("我是一个演示用例...");
        System.out.println("我是一个演示用例...");
        System.out.println("test5方法结束...");
    }
}

我们可以看到,test2test3test4test5方法中,都有着重复的代码,如果能够将这些代码抽取出来,接口的结构将会更加整洁。

public interface Student {
    void test1();
    default void test2(){
        System.out.println("test2方法开始...");
        commonMethod();
        System.out.println("test2方法结束...");
    }
    default void test3(){
        System.out.println("test3方法开始...");
        commonMethod();
        System.out.println("test3方法结束...");
    }
    static void test4(){
        System.out.println("test4方法开始...");
        commonMethod();
        System.out.println("test4方法结束...");
    }
    static void test5(){
        System.out.println("test5方法开始...");
        commonMethod();
        System.out.println("test5方法结束...");
    }

    private static void commonMethod(){
        System.out.println("我是一个演示用例...");
        System.out.println("我是一个演示用例...");
        System.out.println("我是一个演示用例...");
    }
}

最后提醒一下,要想在idea中进行上述新特性的试验,需要看一下idea中当前配置的jdk版本是否至少为jdk9哦。


posted @ 2021-03-27 14:55  moutory  阅读(8)  评论(0编辑  收藏  举报  来源