正如其名,在Java 8中,默认方法就是使用default关键字标记的定义在接口中的方法。如果子类不重写这些方法,那么在子类调用这些方法的时候会直接调用接口中的默认方法。其形式如下:
public interfce Moveable{
default void move(){
System.out.println("move");
}
}
子类继承接口,无需重写这个方法即可调用
public class Animal implements Moveable{
public static void main(String[] args){
Animal tiger = new Animal();
tiger.move();
}
}
输出:
Move
如果子类想要重写这个默认方法,只需要和普通的重写接口一样
public class Animal implements Moveable{
public void move(){
System.out.println("I am running");
}
public static void main(String[] args){
Animal tiger = new Animal();
tiger.move();
}
}
使用默认方法的好处:
最简单的回单就是,为了支持Lambda表达式。因为Java 8中引入了Lambda表达式,所以很多Java的核心类都需要修改以便使用新的Lambda表达式,但是一些类例如,java.util.List,不仅仅是不JDK的类实现,同样被很多第三方的库继承,如果修改了java.util.List 接口,那么其他所有的第三方库都必须重新实现这些方法,最终导致无法兼容。所以就引入了默认方法。例如:java.lang.Iterable,添加的新方法。
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
使用
import java.util.ArrayList;
import java.util.List;
public class Animal implements Moveable{
public static void main(String[] args){
List<Animal> list = new ArrayList();
list.add(new Animal());
list.add(new Animal());
list.add(new Animal());
//Iterator code reduced to one line
list.forEach((Moveable p) -> p.move());
}
}
添加的默认方法,其所有的子类都默认继承,而无需重写。
在Java中接口是可以多继承的,当一个类继承多个接口,但是默认方法相同是处理的原则是:
Walkable.super.move();
//or
Moveable.super.move();