java8新特性–接口中default方法詳細解讀
如:Collection接口裏的一個方法:
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
爲什麼要引入default來修飾接口?
- 如果往接口中新增一個抽象方法,那麼所有實現這個接口與實現這個接口的子接口的類都要實現這個方法,造成大量的修改,
default的作用:
-
只用在接口中的方法前,不能在類裏使用這個修飾符。
-
實現這個接口的類,可以不實現這個方法。
原因:
- 這個方法已經有方法體了;
- 實現這個接口的類再實現這個方法相當於重寫;
-
繼承這個接口的接口,同時也會繼承這個方法,當然也能重寫這個方法。
比如:Collection接口繼承自Iterable,那麼繼承了Iterable的default方法,並對spliterator()方法重寫了
Iterable接口中的spliterator()
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
Collection接口裏的spliterator()
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
同時Collection接口也具有Iterable接口的其他default方法,如:forEach
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
-
一個類同時繼承兩個接口,且兩個接口中有完全相同的兩個default方法,那麼這個類必須重寫這個方法。
-
如果一個類繼承了一個類同時實現一個接口,繼承的類與接口中包含相同的方法。
如父類: public void aaa(){ 輸出A; } 接口: interface bbb{ default void aaa(){ 輸出B; } }
那麼這個類默認繼承的是父類裏的這個方法。