【转】Java之默认方法(Default Methods)
转载于:http://ebnbin.com/2015/12/20/java-8-default-methods/
Java 8 引入了新的语言特性——默认方法(Default Methods)。
Default methods enable new functionality to be added to the interfaces of libraries and ensure binary compatibility with code written for older versions of those interfaces.
默认方法是在接口中的方法签名前加上了 default
关键字的实现方法。
一个简单的例子
-
interface InterfaceA {
-
default void foo() {
-
System.out.println("InterfaceA foo");
-
}
-
}
-
-
class ClassA implements InterfaceA {
-
}
-
-
public class Test {
-
public static main(String[] args) {
-
new ClassA().foo(); // 打印:“InterfaceA foo”
-
}
-
}
ClassA
类并没有实现 InterfaceA
接口中的 foo
方法,InterfaceA
接口中提供了 foo
方法的默认实现,因此可以直接调用 ClassA
类的 foo
方法。
为什么要有默认方法
在 java 8 之前,接口与其实现类之间的 耦合度 太高了(tightly coupled),当需要为一个接口添加方法时,所有的实现类都必须随之修改。默认方法解决了这个问题,它可以为接口添加新的方法,而不会破坏已有的接口的实现。这在 lambda 表达式作为 java 8 语言的重要特性而出现之际,为升级旧接口且保持向后兼容(backward compatibility)提供了途径。
-
String[] array = new String[] {
-
"hello",
-
",",
-
"world",
-
};
-
List<String> list = Arrays.asList(array);
-
这个 forEach
方法是 jdk 1.8 新增的接口默认方法,正是因为有了默认方法的引入,才不会因为 Iterable
接口中添加了 forEach
方法就需要修改所有 Iterable
接口的实现类。
下面的代码展示了 jdk 1.8 的 Iterable
接口中的 forEach
默认方法: