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

原文地址


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

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

01 private interface Defaulable {    
02 // jdk8中允许接口实现默认方法,你可以重写默认方法,也可以不重写
03 default String notRequired() {        
04     return "Default implementation";    
05     }       
06 }
07 private static class DefaultableImpl implements Defaulable {}
08 private static class OverridableImpl implements Defaulable {    
09     @Override    
10     public String notRequired() {        
11         return "Overridden implementation";    
12     }
13 }

    接口Defaulable在定义中使用关键字default声明了一个默认方法notRequired()。有一个类DefaultableImpl实现了这个接口,它没有对默认方法做任何更改。另一个类OverridableImpl,则重写了接口中的默认实现,实现了自己的逻辑。

Java 8提供的另一个很有意思的特性是接口可以声明静态方法(同时提供实现)。举个例子:

1 private interface DefaulableFactory {    
2 // Interfaces now allow static methods    
3 static Defaulable create( Supplier< Defaulable > supplier ) {        
4     return supplier.get();   
5  }
6 }


下面这段代码将之前例子中提到的默认方法和静态方法放在了一起:

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


这个程序的控制台输出如下:

1 Default implementationOverridden implementation

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值