default是在java8中引入的關(guān)鍵字,被default標(biāo)識的方法也可稱為Virtual extension methods——虛擬擴(kuò)展方法叔营。
Virtual extension methods:在接口內(nèi)部包含了一些默認(rèn)的方法實(shí)現(xiàn)(也就是接口中可以包含方法體近速,這打破了Java之前版本對接口的語法限制)溃肪,從而使得接口在進(jìn)行擴(kuò)展的時候西剥,不會破壞與接口相關(guān)的實(shí)現(xiàn)類代碼。
例如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);
}
注意:
- 在接口中編寫default修飾的方法時蛙奖,必須有方法體
- 接口用static和default修飾的方法都要有方法體潘酗,其中被static修飾的方法表示該接口的靜態(tài)方法(即屬于這個接口(類)的方法,不可被繼承當(dāng)然也就不存在重寫Override雁仲,但是可以被調(diào)用)
- 本類的對象可以直接調(diào)用本類的公有成員方法
- default關(guān)鍵字有利有弊仔夺,弊端在于default關(guān)鍵字將抽象類和接口之間的一個顯著區(qū)別抹平了,即接口只能有抽象方法伯顶,不提供子類方法的具體實(shí)現(xiàn)囚灼,而抽象類可以有非抽象的方法