Java8 默认方法
Java 8 在接口中引入了一种新的概念,即默认方法实现。这种能力是为了向后兼容性而添加的,以便旧的接口可以利用 Java 8 的 lambda 表达式能力。
例如,’List’ 或 ‘Collection’ 接口没有 ‘forEach’ 方法声明。因此,添加这样的方法将简单地破坏集合框架的实现。Java 8 引入了默认方法,这样 List/Collection 接口就可以有 ‘forEach’ 方法的默认实现,而实现这些接口的类无需实现相同的方法。
语法
public interface vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
}
多个默认值
当接口中有默认函数时,有可能一个类正在实现两个具有相同默认方法的接口。下面的代码解释了如何解决这种歧义。
public interface vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
}
public interface fourWheeler {
default void print() {
System.out.println("I am a four wheeler!");
}
}
第一种解决方案是创建一个自定义方法来重写默认实现。
public class car implements vehicle, fourWheeler {
public void print() {
System.out.println("I am a four wheeler car vehicle!");
}
}
第二个解决方法是使用super调用指定接口的默认方法。
public class car implements vehicle, fourWheeler {
public void print() {
vehicle.super.print();
}
}
静态默认方法
从Java 8开始,接口也可以有静态的辅助方法。
public interface vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
static void blowHorn() {
System.out.println("Blowing horn!!!");
}
}
默认方法示例
使用您选择的任何编辑器,在C:\ > JAVA中创建以下Java程序。
Java8Tester.java
public class Java8Tester {
public static void main(String args[]) {
Vehicle vehicle = new Car();
vehicle.print();
}
}
interface Vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
static void blowHorn() {
System.out.println("Blowing horn!!!");
}
}
interface FourWheeler {
default void print() {
System.out.println("I am a four wheeler!");
}
}
class Car implements Vehicle, FourWheeler {
public void print() {
Vehicle.super.print();
FourWheeler.super.print();
Vehicle.blowHorn();
System.out.println("I am a car!");
}
}
验证结果
使用 javac 编译器编译该类,方法如下:
C:\JAVA>javac Java8Tester.java
现在按照以下步骤运行Java8Tester –
C:\JAVA>java Java8Tester
它应该产生以下输出 –
I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!