zoukankan      html  css  js  c++  java
  • Java 8-接口的默认方法和静态方法

    Java 8-接口的默认方法和静态方法

    Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。默认方法使得接口有点类似traits,不过要实现的目标不一样。默认方法使得开发者可以在 不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法。

    默认方法

    默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。接口提供的默认方法会被接口的实现类继承或者覆写,例子代码如下:

    private interface Defaulable {
        // Interfaces now allow default methods, the implementer may or 
        // may not implement (override) them.
        default String notRequired() { 
            return "Default implementation"; 
        }        
    }
            
    private static class DefaultableImpl implements Defaulable {
    }
        
    private static class OverridableImpl implements Defaulable {
        @Override
        public String notRequired() {
            return "Overridden implementation";
        }
    }

    Defaulable接口使用关键字default定义了一个默认方法notRequired()

    DefaultableImpl类实现了这个接口,同时默认继承了这个接口中的默认方法;

    OverridableImpl类也实现了这个接口,但覆写了该接口的默认方法,并提供了一个不同的实现。

    静态方法

    Java 8带来的另一个有趣的特性是在接口中可以定义静态方法,例子代码如下:

    private interface DefaulableFactory {
        // Interfaces now allow static methods
        static Defaulable create( Supplier< Defaulable > supplier ) {
            return supplier.get();
        }
    }

     下面的代码片段整合了默认方法和静态方法的使用场景:

    public static void main( String[] args ) {
        Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
        System.out.println( defaulable.notRequired() );
            
        defaulable = DefaulableFactory.create( OverridableImpl::new );
        System.out.println( defaulable.notRequired() );
    }

     这段代码的输出结果如下:

    Default implementation
    Overridden implementation

    由于JVM上的默认方法的实现在字节码层面提供了支持,因此效率非常高。

    默认方法允许在不打破现有继承体系的基础上改进接口。该特性在官方库中的应用是:给java.util.Collection接口添加新方法,如stream()parallelStream()forEach()removeIf()等等。

    尽管默认方法有这么多好处,但在实际开发中应该谨慎使用:在复杂的继承体系中,默认方法可能引起歧义和编译错误。如果你想了解更多细节,可以参考官方文档



    作者:杜琪
    链接:https://www.jianshu.com/p/5b800057f2d8
    來源:简书

  • 相关阅读:
    202006leetcode刷题记录
    二分查找详解
    并查集
    202005leetcode刷题记录
    基于地震数据的Spark数据处理与分析
    Java日志框架:logback详解
    java 多线程
    Oracle表恢复(truncate)
    关于软件开发,你老板不知道的7件事
    调用oracle 分页存储过程 返回游标数据集
  • 原文地址:https://www.cnblogs.com/oliverBolg/p/10084241.html
Copyright © 2011-2022 走看看