java8新特性接口的默认方法和静态方法

已有 15348人阅读此文 - - JAVA

    Java 8从两个概念扩展了接口的定义:默认方法和静态方法。默认方法使得接口有点类似于Traits语法但是面向的目标不同。它允许添加新方法到已有接口中,但是不会破坏那些基于老版接口实现的代码的二进制兼容性。

默认方法和抽象方法的区别在于:抽象方法是必须要实现的,而默认方法不是。相反,每个接口必须提供一个所谓的默认方法实现,所有的实现类都会默认继承得到这个方法(如果需要也可以重写这个默认实现)。我们来看看下面这个例子:

private interface Defaulable {    
// jdk8中允许接口实现默认方法,你可以重写默认方法,也可以不重写
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 implementationOverridden implementation

    JVM中默认方法的实现非常高效,而且方法调用的字节码指令支持默认方法。默认方法使得已有的Java接口能够改进而不会导致编译过程失败。接口java.util.Collection中新增了大量的方法,都是很好的示例,如: stream(), parallelStream(),forEach(), removeIf(),等等。

    虽然默认方法很强大,我们还是要谨慎使用它:在将一个方法定义为default方法之前,最好三思是不是必须要这么做,因为它可能在层级复杂的情况下引起歧义和编译错误。

 


来源:自成e家 出处:java8新特性接口的默认方法和静态方法
本文由 自成e家 翻译 ,转载请注明出处,你的支持是我继续写作、分享的最大动力!
期待你一针见血的评论,Come on!