在 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(); dog.eat(); }
|
关于多重继承:
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(); person.eat(); }
|