首先,我们有一个接口,接口内有一抽象方法methodAbstract1
public interface MyInterface { // 注意用interface而不是class
public abstract void methodAbstract1();
// public和abstract可有可无但不能写别的,比如private
}
该接口有以下MyInterfaceA、B两个实现类,实现类必须对接口中所有抽象方法进行覆盖重写如下,覆盖后AB两个实现类已投入使用
public class MyInterfaceA implements MyInterface {
// 原本的extends变成了implements
@Override
public void methodAbstract1() {
System.out.println("实现了抽象方法A");
}
}
// 以下是在另一个.java文件中的另一个类
public class MyInterfaceB implements MyInterface {
@Override
public void methodAbstract1() {
System.out.println("实现了抽象方法B");
}
}
倘若需要升级这个接口,如需要新增方法,直接在下面添加新抽象方法methodAbstract2()会报错,因为接口的实现类AB必须覆盖重写接口的所有抽象方法,新增的方法并未被已投入使用的实现类AB重写。那么该如何升级接口的同时,保护以投入使用的实现类AB呢?
public interface MyInterface {
public abstract void methodAbstract1();
public abstract void methodAbstract2(); // 本句会使AB报错
}
答:接口中的默认方法,可以解决接口升级问题。从Java 8开始,接口中允许定义默认方法
public interface MyInterface {
public abstract void methodAbstract1();
// public abstract void methodAbstract2();
public default void methodAbstract2() {
System.out.println("这是新增的默认方法");
// public可有可无但不能写别的,比如private。而default不能省略
}
}
再写个main文件,调用默认方法时,如果实现类中没有,会向上找接口
public class Demo {
public static void main(String[] args) {
MyInterfaceA A = new MyInterfaceA();
A.methodAbstract1(); // A中重写的方法
A.methodAbstract2(); // 这是后来新增的,A类中并没有重写
// 上句不会报错,调用默认方法时,如果实现类中没有,会向上找接口
MyInterfaceB B = new MyInterfaceB();
B.methodAbstract1();
B.methodAbstract2(); // B也一样,虽没重写但也可调用默认方法
}
}
/*
实现了抽象方法A
这是新增的默认方法
实现了抽象方法B
这是新增的默认方法
*/