1. 默认方法
1.1 语法
默认方法就是一个在接口里面有了可以实现的方法。在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的,这些修饰符都是默认的。public 抽象方法需要子类实现。在JDK 1.8开始 支持使用static和default 修饰 可以写方法体,不需要子类重写。
1.2 实例
public class Java8Tester {
public static void main(String args[]) {
Vehicle vehicle = new Car();
vehicle.print();
}
}
interface Vehicle {
/**
* 默认方法 可以写方法体
*/
default void print() {
System.out.println("我是一辆车!");
}
/**
* 静态方法 可以写方法体
*/
static void blowHorn() {
System.out.println("按喇叭!!!");
}
}
interface FourWheeler {
/**
* 默认方法 可以写方法体
*/
default void print() {
System.out.println("我是一辆四轮车!");
}
}
class Car implements Vehicle, FourWheeler {
/**
* 默认和静态方法不是我们的抽象方法 ,所以不需要重写
*/
public void print() {
Vehicle.super.print();
FourWheeler.super.print();
Vehicle.blowHorn();
System.out.println("我是一辆汽车!");
}
}
执行以上脚本,输出结果为:
我是一辆车!
我是一辆四轮车!
按喇叭!!!
我是一辆汽车!
1.3 多个默认方法
一个接口有默认方法,考虑这样的情况,一个类实现了多个接口,且这些接口有相同的默认方法,以下实例说明了这种情况的解决方法
第一个解决方案是创建自己的默认方法,来覆盖重写接口的默认方法:
public class Car implements vehicle, fourWheeler {
@Override
public void print() {
System.out.println("我是一辆四轮汽车!");
}
}
第二种解决方案可以使用 super 来调用指定接口的默认方法:
public class Car implements vehicle, fourWheeler {
@Override
public void print() {
vehicle.super.print();
}
}