1.默认方法
jdk8之前的接口
在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的接口
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方法"); } }
调用接口的默认方法和静态方法
2.默认方法的用途
提供新的 API 版本而不破坏二进制兼容性
当需要在一个接口中添加新的方法时,为了保证已存在的实现类仍然能够正常运行,通常需要对所有实现类进行修改。这会带来很大的工作量和风险。通过在接口中添加默认方法,可以在不破坏现有代码的情况下提供新的 API 版本。
弥补抽象类的不足
在 Java 中,抽象类是一种既可以包含抽象方法又可以包含具体方法的特殊类。但是,一个类只能继承一个抽象类,而可以实现多个接口。通过在接口中添加默认方法,可以弥补抽象类的不足,使得接口在一定程度上可以像抽象类一样提供通用的实现。
为函数式接口提供便利
Java 8 引入了函数式接口,即只包含一个抽象方法的接口。函数式接口可以被 lambda 表达式和方法引用所使用。通过在函数式接口中添加默认方法,可以提供一些通用的、默认的实现,使得函数式接口的使用更加便利。