default 给接口添加默认方法
1.default关键字
接口在定义好后无法添加新的方法,否则实现类都需要重新实现一遍,但是jdk8以后,可以通过default关键字来给接口增加新的方法而不变动实现类.
public interface AnInterface {
void firstMethod();
void secondMethod();
default void newMethod() {
System.out.println("newMethod");
}
}
public class AnImplementation implements AnInterface {
@Override
public void firstMethod() {
System.out.println("firstMethod");
}
@Override
public void secondMethod() {
System.out.println("secondMethod");
}
public static void main(String[] args) {
AnInterface i = new AnImplementation();
i.firstMethod();
i.secondMethod();
i.newMethod();
}
}
可以看到 newMethod可以正常工作.
2.多重实现下同名解决办法
问题: java是单继承,但是可以实现多个接口,如果default标记的方法冲突怎么办?
public interface AnInterface {
void firstMethod();
void secondMethod();
default void newMethod() {
System.out.println(" ");
}
}
public interface AnInterface2 {
void firstMethod();
void secondMethod();
default void newMethod() {
System.out.println(" ");
}
}
我们可以看到报错了,因为实现类无法判断newMethod属于哪一个接口.
解决:
我们可以重写newMethod()方法解决即可.
3. private关键字
JDK9以后,接口可以定义private方法,如果定义了private方法,会自己把方法加上default关键字,不需要显示定义.
public interface JDK9 {
private void fd() {
System.out.println("fd()");
}
private static void fs() {
System.out.println("fs()");
}
default void f() {
fd();
}
static void g() {
fs();
}
}
我们可以看到,加上private关键字以后,fd和fs方法可以像加上default关键字一样加上方法体.