简介
在 JDK 1.8 中,增加了 default 与 static 定义接口方法。在 JDK 1.8 之前,接口中的成员由全局常量以及抽象方法组成。但在 JDK 1.8 中就发生改变。
- default: 可以定义普通的方法(JDK 1.8 之前只能定义抽象方法)。
- static :一旦使用了 static 定义方法,就以为这个方法可以直接由类名称去调用。
代码示例
default 修饰
举个实际的场景
如果有一个接口,随着时间的推移,已经有2W个子类了,但是在莫一天,这个接口需要增加一个方法,而针对与所有不同的子类,这个方法的功能实现是完全一样的。如果按照之前的逻辑,就需要在每个方法上面覆写这个新增加的方法(这个工作量太大,特别不人性化)。为了处理这个问题就可以使用 default 来定义普通方法。
interface Message{
// 定义我们的抽象类
public void print(String info);
// 由于定义的是 普通方法,需要有方法体
default void func(String msg) {
System.out.println(msg);
}
}
class MessageImpl implements Message{
// 覆写接口中的方法
@Override
public void print(String info) {
System.out.println(" 覆写方法: "+ info);
}
}
public class TestDemo {
public static void main(String[] args) {
Message msg = new MessageImpl();
msg.print("调用接口的抽象方法"); // 覆写方法: 调用接口的抽象方法
msg.func("接口的自定义方法"); // 接口的自定义方法
}
}
static 修饰
使用 static 定义方法的时候,可以不用有子类实现。
interface Message{
// 由于定义的是 static 方法,需要有方法体
static void func(String msg) {
System.out.println(msg);
}
}
public class TestDemo {
public static void main(String[] args) {
Message.func("静态方法");
}
}
总结
- 接口里面使用 default 或 static 定义方法的意义是避免子类重复实现。
- 接口的使用还是应该以抽象方法为主。