Java 8 新特性:

  • lambda expressions
  • functional interfaces
  • method references
  • streams
  • Optional

还有 interface 中的 staticdefault 方法。

基本使用

Java 8 允许在接口中定义默认方法。

interface Collection {

	void add();

	default void debug(){
		System.out.println("put the key in");
	}
}

为什么要引入 default 方法

和接口中定义的其他方法一样,default 方法默认是 public

接口是用来定义类的行为的,如果要在接口中新添加方法,那么所有实现此接口的类都需要强制的实现新添加的方法。而 default 方法就可以规避该问题。

当多个接口定义了相同 default 方法

当一个类实现的多个接口定义了相同的 default 方法,那么编译时会失败。需要子类 Override 该方法实现。在子类中可以通过 Interface.super.xxx() 方法来调用接口的 default 方法。

@Override
public void turnOnAlarm() {
	Vehicle.super.turnOnAlarm();
	Alarm.super.turnOnAlarm();
}

接口中的 static 方法

除了 default 方法,Java 8 也允许在接口中定义 static 方法。

接口中的静态方法属于类,在接口中定义 static 方法和在类中定义一样。

因为 Java 不支持多继承,所以在遇到一些代码共享的时候,就不能通过多继承来实现,通常的做法是定义一个静态类,包含可能被多个类使用到的共同的方法,比如 Java 中的 Collections 类。

而通过接口中的 static 方法可以提高代码的 cohesion,将相关的逻辑集中到一起,而不用另外定义一个 Object。

同样 Abstract 类也能做到,但是和抽象类的区别在于,抽象类是有 Constructors, state, behavior 的。

总结

理想状态下,接口不应该封装具体的行为,只应该用来定义某类型的公开接口。

但是为了弥补 Java 不能多继承而带来的一些缺点,Java 8 中引入接口的 default 和 static 方法,也肯定是 JDK 工程师仔细考量后的一个权衡。

reference