JDK8接口新特性分析

关于Jdk8以后接口新增加的新特性分析:
在jdk1.8之前接口内部定义的方法默认都使用public abstract关键字来修饰方法,而变量则是以public static final关键字来修饰。接口是对抽象类的再一次进行抽象,是更高一个层次。jdk8之前接口设计过于死板,当需要在接口里面新增加一个方法时,必须将其设定为抽象方法,且实现此接口的子类必须实现此方法,当实现此接口类的数目较少时,可以在每一个实现类里实现新增加的方法,但是如果子类数目过多,往往是一个非常大的工作量,并且某些子类不用实现新增加的方法,系统也可以正常运行。此时官方给出了接口的新特性,用来对接口进行升级。新特性如下所示:
一 允许添加默认方法(用default关键字修饰的方法)。
二 允许出现静态方法,且只能使用 接口名.方法名 来调用。
三 允许出现私有方法,用减少代码冗余。
紧接着对每条新特性加以使用并验证
(1)默认方法:

public interface Inter {    //必须使用public default 关键字进行修饰
    public default void show(){
        System.out.println("接口的default   show方法");
    }
}

默认方法注意事项:
①接口实现类不必重写此方法。实现类的对象可以调用default方法
②当子类重写此方法是需要省略default关键字,否则会报错
③当有多个接口拥有同名的默认方法时,若此时某个类同时实现了这两个类,此时必须进行方法重写(可以这么理解,当实现类对象调用这两个默认的同名方法时就不能区分该调用哪个接口的方法体,所以必须进行重写)
(2)静态方法:

public interface Inter {
    public static void method(){
        System.out.println("接口里的静态方法");
    }
}

静态方法注意事项:
必须使用接口名.方法名来调用static方法。否则会编译报错。

public class InterImpl implements Inter{
    public static void main(String[] args) {
        this.method();//此时编译报错
        Inter.method();//正确使用
    }
}

(3)私有方法是为了解决在默认方法或者静态方法内部出现代码冗余现象而提出的解决方案。
现象:

public interface Inter {
    public static void method1(){
        System.out.println("aaaaaaaaa");//这里简单使用输出语句来代替相同的逻辑处理
        System.out.println("aaaaaaaaa");
        System.out.println("aaaaaaaaa");
        System.out.println("aaaaaaaaa");
        System.out.println("接口里的method1静态方法");
    }
    public static void method2(){
        System.out.println("aaaaaaaaa");
        System.out.println("aaaaaaaaa");
        System.out.println("aaaaaaaaa");
        System.out.println("aaaaaaaaa");
        System.out.println("接口里的method2静态方法");
    }
}

此时可以把接口里的两个方法内部的功能相同的代码块提取到外面,实现代码复用的优势,因为接口里有两种方法(加static关键字的和不加static关键字的方法),所以private关键字之后也可以跟static关键字。

public interface Inter {
    public static void method1(){
        Inter.show();
        System.out.println("接口里的method1静态方法");
    }
    public static void method2(){
        Inter.show();
        System.out.println("接口里的method2静态方法");
    }
    private static void show(){
        System.out.println("aaaaaaaaa");
        System.out.println("aaaaaaaaa");
        System.out.println("aaaaaaaaa");
        System.out.println("aaaaaaaaa");
    }
}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务