java8新特性接口的默认方法和静态方法
2016-12-28 11:24
786 查看
原文地址
Java 8从两个概念扩展了接口的定义:默认方法和静态方法。默认方法使得接口有点类似于Traits语法但是面向的目标不同。它允许添加新方法到已有接口中,但是不会破坏那些基于老版接口实现的代码的二进制兼容性。
默认方法和抽象方法的区别在于:抽象方法是必须要实现的,而默认方法不是。相反,每个接口必须提供一个所谓的默认方法实现,所有的实现类都会默认继承得到这个方法(如果需要也可以重写这个默认实现)。我们来看看下面这个例子:
接口Defaulable在定义中使用关键字default声明了一个默认方法notRequired()。有一个类DefaultableImpl实现了这个接口,它没有对默认方法做任何更改。另一个类OverridableImpl,则重写了接口中的默认实现,实现了自己的逻辑。
Java 8提供的另一个很有意思的特性是接口可以声明静态方法(同时提供实现)。举个例子:
下面这段代码将之前例子中提到的默认方法和静态方法放在了一起:
这个程序的控制台输出如下:
JVM中默认方法的实现非常高效,而且方法调用的字节码指令支持默认方法。默认方法使得已有的Java接口能够改进而不会导致编译过程失败。接口java.util.Collection中新增了大量的方法,都是很好的示例,如: stream(), parallelStream(),forEach(), removeIf(),等等。
虽然默认方法很强大,我们还是要谨慎使用它:在将一个方法定义为default方法之前,最好三思是不是必须要这么做,因为它可能在层级复杂的情况下引起歧义和编译错误。
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 | } |
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 |
虽然默认方法很强大,我们还是要谨慎使用它:在将一个方法定义为default方法之前,最好三思是不是必须要这么做,因为它可能在层级复杂的情况下引起歧义和编译错误。
相关文章推荐
- Java 8 新特性:接口的静态方法和默认方法
- Java8新特性Optional、接口中的默认方法与静态方法
- Java8新特性之接口的默认方法和静态方法
- Java8学习笔记 — 其它新特性【接口默认方法(静态方法)、重复注解、类型注解】
- Java8特性之接口的默认方法与静态方法
- java8新特性之接口默认方法&静态方法
- Java8新特性总结 - 1.接口新增默认方法和静态方法
- Java8 新特性之二---------接口的默认方法和静态方法
- Java8新特性 接口默认方法,接口静态方法
- Java 8 新特性:接口的静态方法和默认方法
- java8-新特性--(接口的默认方法与静态方法)
- Java8新特性之接口的默认方法和静态方法
- Java8新特性Optional、接口中的默认方法与静态方法
- Java8中新特性Optional、接口中默认方法和静态方法详解
- Java8新特性之接口中的默认方法与静态方法
- Java8之默认方法和静态接口方法
- java8新特性 (λ、stream 与 默认接口方法)
- Java8新特性--Interface中的default方法(接口默认方法)
- JDK8新特性:接口的静态方法和默认方法
- 30分钟入门Java8之默认方法和静态接口方法学习