【jdk8新特性】接口扩展
为什么扩展
在jdk8中接口新增了方法的两种实现,由原本的接口只能有一个抽象方法 变成了 接口有==抽象方法 默认方法 静态方法==。
而这样做的原因是 接口如果只有抽象方法 就会导致 接口的实现类必须重写此抽象方法,加入有很多的实现类 现在接口新增一个方法,就会导致所有的 实现类都要重写这个方法很麻烦,所以我们增加了 默认方法,默认方法 可以不用重写就能用 当然也可以重写,静态方法只能通过接口名调用。
接口的使用
抽象方法:
interface A {
public abstract void test01();
// public abstract void test02();
}
class B implements A {
@Override
public void test01() {
System.out.println("B test01");
}
}
class C implements A {
@Override
public void test01() {
System.out.println("C test01");
}
}
我们可以看出,抽象方法必须被实现类重写,如果新增一个抽象方法 所有实现类都要重写
默认方法:
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类重写的默认方法");
}
}
可以看出默认方法可以重写也可以不重写,重写就用重写的方法,没有重写就有默认的方法。
静态方法:
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("我是接口静态方法");
// }
}
我们可以看出 只能通过接口名调用静态方法。