目录
在jdk8之前接口(interface)中可以定义变量和方法,变量必须是public,static,final的;方法必须是public,abstract的,由于这个修饰符是默认必须的,我们通常省略不写。
public interface MyInterfaceByJava7 {
//public static final int MY_CONSTANT = 10;
int MY_CONSTANT = 10;
//public void add();
void add();
}
jdk8开始支持使用static、default修饰的方法,可以写方法体,并且不需要子类重写。
public interface MyInterfaceByJava8 {
int MY_CONSTANT = 10;
void add();
public default void get() {
// 默认实现
System.out.println("默认get方法");
}
public static void del() {
// 静态方法实现
System.out.println("静态del方法");
}
}
子类只需要重写抽象方法
public class MyInterfaceImpl implements MyInterfaceByJava8 {
@Override
public void add() {
System.out.println("子类实现add方法");
}
}
调用接口的默认方法和静态方法
提供新的 API 版本而不破坏二进制兼容性:当需要在一个接口中添加新的方法时,为了保证已存在的实现类仍然能够正常运行,通常需要对所有实现类进行修改。这会带来很大的工作量和风险。通过在接口中添加默认方法,可以在不破坏现有代码的情况下提供新的 API 版本。
弥补抽象类的不足:在 Java 中,抽象类是一种既可以包含抽象方法又可以包含具体方法的特殊类。但是,一个类只能继承一个抽象类,而可以实现多个接口。通过在接口中添加默认方法,可以弥补抽象类的不足,使得接口在一定程度上可以像抽象类一样提供通用的实现。
为函数式接口提供便利:Java 8 引入了函数式接口,即只包含一个抽象方法的接口。函数式接口可以被 lambda 表达式和方法引用所使用。通过在函数式接口中添加默认方法,可以提供一些通用的、默认的实现,使得函数式接口的使用更加便利。