1. 前言
Java8
允许接口(Interface
)出现方法体,前提是该方法必须由default
关键字修饰。
好处是,在接口的实现类中不用实现接口的所有方法,可以按需实现方法,减少代码冗余。
2. 示例
2.1 接口中不用实现的方法
代码如下:
package com.practice;
public class DefaultTest {
public static void main(String[] args) {
DefaultFirst firstClass = new DefaultFirst();
firstClass.sayHi();
}
}
class DefaultFirst implements InterfaceFirst {
}
interface InterfaceFirst {
default void sayHi() {
System.out.println("I am InterfaceFirst.");
}
}
InterfaceFirst
接口定义一个包含方法体的方法sayHi()
。
DefaultFirst
类实现InterfaceFirst
接口,却不用实现sayHi()
方法,直接便能调用。
在Java8
之前,接口中的所有方法,在接口实现类中是必须全部实现的。而Java8
中的deafult
关键字,则彻底颠覆该概念。
2.2 接口default
方法冲突
如果两个接口包含一个方法名一致的default
方法,被一个类同时实现时,会出现Duplicate default methods
编译错误。
解决办法则是在实现类中重写该方法。
代码如下:
package com.practice;
public class DefaultTest {
public static void main(String[] args) {
DefaultFirst firstClass = new DefaultFirst();
firstClass.sayHi();
}
}
class DefaultFirst implements InterfaceFirst, InterfaceSecond {
@Override
public void sayHi() {
System.out.println("I am DefaultFirst.");
}
}
interface InterfaceFirst {
default void sayHi() {
System.out.println("I am InterfaceFirst.");
}
}
interface InterfaceSecond {
default void sayHi() {
System.out.println("I am InterfaceSecond.");
}
}
3. 类优先接口
如果继承的父类和接口方法名一致,则优先执行父类的方法。
参考代码:
package com.practice;
public class DefaultTest {
public static void main(String[] args) {
DefaultSecond secondClass = new DefaultSecond();
secondClass.sayHi();
}
}
interface InterfaceFirst {
default void sayHi() {
System.out.println("I am InterfaceFirst.");
}
}
class DefaultSupper {
public void sayHi() {
System.out.println("I am DefaultSuper.");
}
}
class DefaultSecond extends DefaultSupper implements InterfaceFirst {
}
执行结果:I am DefaultSuper.