1.default关键字的作用
可以在接口内部提供一些默认的实现方法,子类实现时不需要提供实现方法,自己重写也可以。例如java8的Iterable接口的forEach。
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
2.为什么要这么做?
想象一下,你java7的代码写了一个MyIterable实现了Iterable接口(此时还没forEach方法),但是当你将MyIterable移植到java8后,如果forEach不是default的,是不是你的代码会报错。
public static class MyIterable implements Iterable {
//可自己实现也可以直接用父接口的
@Override
public void forEach(Consumer action) {
System.err.println("调用我们自己的 forEach");
}
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return null;
}
}
3.如果你实现了两个接口怎么办?
public static interface A {
public default void say() {
}
}
public static interface B {
public default void say() {
}
}
public static class Foo implements A,B {
@Override
public void say() {
// TODO Auto-generated method stub
B.super.say();
}
}
这个时候如果子类不提供实现方法的话编译器会报错,因为它也不知道要调哪个接口的say方法。
4.结论
当我们修改代码添加新功能时必须要想尽办法保证要兼容之前的代码,何况这还是伟大的java。
《 祸莫大于不知足;咎莫大于欲得。故知足之足,常足矣 》
释义:罪恶没有比欲望更大罪恶。灾祸没有比不知足更大的灾祸;灾祸最大的原因就是想得到(欲望)