Java 8默认方法
Java 8引入了接口中默认方法实现的新概念。添加此功能是为了向后兼容,以便可以使用旧接口来利用Java 8的lambda表达功能。
例如,“列表”或“集合”接口没有“ 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!