System.out.println(“正在监听执行过程”);
});
**示例三:**迭代输出
// Java8之前:
List features = Arrays.asList(“Lambdas”, “Default Method”, “Stream API”, “Date and Time API”);
for (String feature : features) {
System.out.println(feature);
}
// Java8之后:
List features = Arrays.asList(“Lambdas”, “Default Method”, “Stream API”, “Date and Time API”);
features.forEach(n -> System.out.println(n));
// 使用Java8的“方法引用”更方便,方法引用由::双冒号操作符标示,如下:
features.forEach(System.out::println);
二、接口的默认方法和静态方法
默认方法使得开发者可以在 不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的实现类也同时实现这个新添加的方法。
简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
1问:为什么java8要有默认方法这个特性?
java8之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口的时候,需要修改全部实现该接口的类, java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法的目的是为了解决接口的修改与现有的实现不兼容的问题。
2问:默认方法和抽象方法之间的区别是什么?
- 抽象方法需要实现,而默认方法不需要;
- 接口提供的默认方法会被接口的实现类继承或者覆写;
我们只需在方法名前面加个 default 关键字即可实现默认方法,默认方法语法格式如下:
public interface Vehicle {
// 定义一个默认方法
default void print(){
System.out.println(“我是一辆车”);
}
// 定义一静态方法
static void blowHorn(){
System.out.println(“按喇叭”);
}
}
默认方法和静态方法的完整实例:
public class Java8Test {
public static void main(String args[]){
MobilePhone mobilePhone = new Phone();
mobilePhone.print();
}
}
//接口1
interface MobilePhone {
//默认方法
default void print(){
System.out.println(“我是手机”);
}
}
//接口2
interface HuaWei {
//默认方法
default void print(){
System.out.println(“我是华为手机”);
}
//静态方法
static void foldingScreen(){
System.out.println(“我是华为折叠屏手机”);
}
}
//实现类
class Phone implements MobilePhone, HuaWei {
public void print(){
MobilePhone.super.print();
HuaWei.super.print();
HuaWei.foldingScreen();
}
}
三、方法引用
方法引用使得开发者可以直接引用现存的方法、Java类的构造方法或者实例对象。方法引用和Lambda表达式配合使用,使得java类的构造方法看起来更加紧凑简洁,减少冗余代码。