JDK 8接口增强介绍
interface 接口名 { 静态常量; 抽象方法; }
JDK 8对接口的增强,接口还可以有默认方法和静态方法
JDK 8的接口:
interface 接口名 { 静态常量; 抽象方法; 默认方法; 静态方法; }
接口引入默认方法的背景
在JDK 8以前接口中只能有抽象方法。存在以下问题:
如果给接口新增抽象方法,所有实现类都必须重写这个抽象方法。不利于接口的扩展。
interface A { public abstract void test1(); // 接口新增抽象方法,所有实现类都需要去重写这个方法,非常不利于接口的扩展 public abstract void test2(); } class B implements A { @Override public void test1() { System.out.println("BB test1"); } // 接口新增抽象方法,所有实现类都需要去重写这个方法 @Override public void test2() { System.out.println("BB test2"); } } class C implements A { @Override public void test1() { System.out.println("CC test1"); } // 接口新增抽象方法,所有实现类都需要去重写这个方法 @Override public void test2() { System.out.println("CC test2"); } }
以前假如一个接口有很多的抽象方法的时候,可以写一个装饰类
例如,JDK 8 时在Map接口中增加了 forEach 方法:
接口默认方法的使用
方式一:实现类直接调用接口默认方法
方式二:实现类重写接口默认方法
public class Demo02UseDefaultFunction { public static void main(String[] args) { BB bb = new BB(); bb.test01(); CC cc = new CC(); cc.test01(); } } interface AA { public default void test01() { System.out.println("我是接口AA默认方法"); } } // 默认方法使用方式一: 实现类可以直接使用 class BB implements AA { } // 默认方法使用方式二: 实现类可以重写接口默认方法 class CC implements AA { @Override public void test01() { System.out.println("我是CC类重写的默认方法"); } }
接口静态方法
为了方便接口扩展,JDK 8为接口新增了静态方法。
public class Demo03UseStaticFunction { public static void main(String[] args) { BBB bbb = new BBB(); // bbb.test01(); // 使用接口名.静态方法名(); AAA.test01(); } } interface AAA { public static void test01() { System.out.println("我是接口静态方法"); } } class BBB implements AAA { // @Override // public static void test01() { // System.out.println("我是接口静态方法"); // } }
接口默认方法和静态方法的区别
1. 默认方法通过实例调用,静态方法通过接口名调用。
2. 默认方法可以被继承,实现类可以直接使用接口默认方法,也可以重写接口默认方法。
3. 静态方法不能被继承,实现类不能重写接口静态方法,只能使用接口名调用。
如果方法要被继承或者重写就用默认方法,如果不需要被继承就使用静态方法