Default Methods是Java 8新引入的特性,之所以这样做是因为Java 8引入了lambda表达式,为了都达到向后兼容而引入了Default Methods。
例如,List、Collection接口没有声明forEach方法,如果直接添加这个方法声明,就会破坏collection framework的实现。因此,引入default method,使List、Collection接口可以有一个forEach方法的默认实现,这样实现了接口的类就不必须实现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!");
}
}
解决方法1、实现该方法覆盖两个接口的default method
public class car implements vehicle, fourWheeler {
public void print() {
System.out.println("I am a four wheeler car vehicle!");
}
}
解决方法2、调用时指定接口
public class car implements vehicle, fourWheeler {
default void print() {
vehicle.super.print();
}
}
Static Default Methods
Java 8开始,接口可以拥有静态方法
public interface vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
static void blowHorn() {
System.out.println("Blowing horn!!!");
}
}
Default Method示例
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!");
}
}
结果:
I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!
原文来自:https://www.tutorialspoint.com/java8/java8_default_methods.htm