在 Java8 中接口也可以为方法提供默认的实现接口也可以有自己的实现方法具体的做法是使用关键字 default 即可为接口声明一个默认的方法

1
2
3
4
5
6
7
8
9
interface Predators {
void doSomething();
default void eat() {
System.out.println("eat meat");
}
}

任何具体类在实现接口时接口的默认方法不是必须实现的非默认方法则必须实现

1
2
3
4
5
6
7
8
class Dog implements Predators {
@Override
public void doSomething() {
System.out.println("wang....");
}
}

使用方面与平常无异很自然

1
2
3
4
5
public static void main(String[] args) {
Dog dog = new Dog();
dog.doSomething(); // wang....
dog.eat(); // eat meat
}

关于多重继承:

1
2
3
4
5
6
7
8
9
interface Herbivore {
void doSomething();
default void eat() {
System.out.println("eat fruit");
}
}

以下这段代码将无法通过编译因 Predators 和 Herbivore 两个接口使用了同样签名的默认方法(eat)那么在 Person 类中就无法确定最终使用哪个接口的默认实现

1
2
3
4
5
6
7
8
class Person implements Predators, Herbivore {
@Override
public void doSomething() {
System.out.println("duang....");
}
}

为了解决冲突你必须要通过手动重写的方式来修复若想引用 Herbivore 接口中的 eat 方法如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Person implements Predators, Herbivore {
@Override
public void eat() {
Herbivore.super.eat();
}
@Override
public void doSomething() {
System.out.println("duang....");
}
}

使用方面与平常无异很自然

1
2
3
4
5
public static void main(String[] args) {
Person person = new Person();
person.doSomething(); // duang....
person.eat(); // eat fruit
}