java的接口在1.8之前只能定義方法名,而不能包含方法的具體代碼。
但是,考慮到已經(jīng)完成的代碼項(xiàng)目,如果想要拓展/修改接口,好比強(qiáng)化Java 8 Collections API,讓其支持lambda表達(dá)式的時(shí)候,就無從下手了。因而引入了新概念,稱為default、defender或者虛擬擴(kuò)展方法(Virtual extension methods)。
default方法是指:
在接口內(nèi)部包含了一些默認(rèn)的方法實(shí)現(xiàn)(也就是接口中可以包含方法體,這打破了Java之前版本對接口的語法限制),從而使得接口在進(jìn)行擴(kuò)展的時(shí)候,不會(huì)破壞與接口相關(guān)的實(shí)現(xiàn)類代碼。
舉個(gè)例子:
java源碼中的Iterable接口中的forEach方法以及spliterator方法
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
一個(gè)特別的情況:
如果一個(gè)類實(shí)現(xiàn)了兩個(gè)接口,這兩個(gè)接口又同時(shí)都包含了一個(gè)名字相同的default方法,此時(shí)會(huì)沖突,編譯器無法識(shí)別是哪個(gè)方法調(diào)用