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