1.1 目标


了解JDK 8接口新增的两个方法
掌握接口默认方法的使用
掌握接口静态方法的使用


1.2 JDK8接口增强介绍


JDK8以前的接口:

interface 接口名 {
静态常量;
抽象方法;
}

JDK8对接口的增强,接口还可以有默认方法和静态方法

JDK8的接口:

interface 接口名 {
静态常量;
抽象方法;
默认方法;
静态方法;
}

1.3 接口引入默认方法的背景

在JDK 8以前接口中只能有抽象方法。存在以下问题:

如果给接口新增抽象方法,所有实现类都必须重写这个抽象方法。不利于接口的扩展。

image.png
例如,JDK 8 时在Map接口中增加了 forEach 方法:

image.png
通过API可以查询到Map接口的实现类如:

image.png
如果在Map接口中增加一个抽象方法,所有的实现类都需要去实现这个方法,那么工程量时巨大的。

因此,在JDK 8时为接口新增了默认方法,效果如下:


image.png
接口中的默认方法实现类不必重写,可以直接使用,实现类也可以根据需要重写。这样就方便接口的扩展。

1.4 接口默认方法的定义格式


方式一:实现类直接调用接口默认方法
方式二:实现类重写接口默认方法

  1. public class Demo02UserDefaultFunction {
  2. public static void main(String[] args) {
  3. BB b = new BB();
  4. // 方式一:实现类直接调用接口默认方法
  5. b.test02();
  6. CC c = new CC();
  7. // 调用实现类重写接口默认方法
  8. c.test02();
  9. }
  10. }
  11. //定义一个AA的接口
  12. interface AA {
  13. //抽象方法
  14. public abstract void test1();
  15. //默认的方法
  16. public default void test02() {
  17. System.out.println("AA test02");
  18. }
  19. }
  20. //实现AA接口
  21. class BB implements AA {
  22. //重写里面的抽象方法,默认方法可以不重写
  23. @Override
  24. public void test1() {
  25. System.out.println("BB test1");
  26. }
  27. }
  28. //实现AA接口
  29. class CC implements AA {
  30. //重写里面的抽象方法,默认方法可以不重写
  31. @Override
  32. public void test1() {
  33. System.out.println("CC test1");
  34. }
  35. // 方式二:实现类重写接口默认方法
  36. @Override
  37. public void test02() {
  38. System.out.println("CC实现类重写接口默认方法");
  39. }
  40. }

1.5 接口静态方法


为了方便接口扩展,JDK 8为接口新增了静态方法。


1.6 接口静态方法的定义格式


image.png

1.7 接口静态方法的使用


直接使用接口名调用即可:接口名.静态方法名();

代码
image.png

1.8 接口默认方法和静态方法的区别


1. 默认方法通过实例调用,静态方法通过接口名调用。
2. 默认方法可以被继承,实现类可以直接使用接口默认方法,也可以重写接口默认方法。
3. 静态方法不能被继承,实现类不能重写接口静态方法,只能使用接口名调用。


1.9 小结


接口中新增的两种方法:

默认方法和静态方法

如何选择呢?如果这个方法需要被实现类继承或重写,使用默认方法,如果接口中的方法不需要被继承就使用静态方 法