说明

  • Java8 中 interface 除了定义抽象方法,还可以定义 default 方法,有具体实现
  • 类 implements 具有 default 方法的接口后,类具有该方法,类也可以重写该方法
  • 类 implements 多个具有相同 default 方法的接口,如果不重写该方法则会报错,重写方法中也可以调用指定接口的 default 方法

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
interface InterfaceA{
void doFirstWork();
default void doSecondWork(){
System.out.println("doSecondWork");
}
}

class InterfaceImpl implements InterfaceA {
@Override
public void doFirstWork() {
System.out.println("doFirstWork");
}
}

public class Test {
public static void main(String[] args) {
InterfaceImpl obj = new InterfaceImpl();
obj.doFirstWork();
obj.doSecondWork();
}
}

输出:
doFirstWork
doSecondWork

注意

  • 如果一个类实现了两个接口,这两个接口又同时都包含了一个名字相同的default方法,在这样的情况下,编译器会报错。因为编译器不知道应该在两个同名的default方法中选择哪一个,因此产生了二义性。我们通过在InterfaceImpl重写doFirstWork方法可以解决编译问题,而且还可以指定调用哪一个接口的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    interface InterfaceA{
    default void doFirstWork(){
    System.out.println("InterfaceA doFirstWork");
    }
    }

    interface InterfaceB{
    default void doFirstWork(){
    System.out.println("InterfaceB doFirstWork");
    }
    }

    class InterfaceImpl implements InterfaceA,InterfaceB{
    @Override
    public void doFirstWork() {
    InterfaceB.super.doFirstWork();
    }
    }

    public class Test {
    public static void main(String[] args) {
    InterfaceImpl obj = new InterfaceImpl();
    obj.doFirstWork();
    }
    }
    输出如下:
    InterfaceB doFirstWork