默認方法是否給Java引入了多重繼承?
當然不是,因爲Java中已經有了多重繼承。在語言最開始就有接口類型的多繼承特性。默認方式確實引入了一種新的多繼承方式,稱之爲行爲多繼承。Java仍然沒有類似C++中的狀態多繼承。
下面是一個行爲多繼承的例子。java.util.Sized這個新接口生命了size和isEmpty兩個方法,並且爲後者提供了默認實現:
public interface Sized{
public default boolean isEmtpy(){
return size() == 0;
}
public int size();
}
java.util.Traversable<T>這個新接口生命了方法forEach並且提供了默認實現:
public interface Traversable<T>{
public default void forEach(Block<? super T> block){
for(T t : this){
block.apply(t);
}
}
}
假設我們現在聲明類SimpleCollection<T>並且實現了方法iterator和size:
class SimpleCollection<T> implements Sized, Traversable<T> {
public Iterator<T> iterator() { ... }
public int size() { ... }
}
SimpleCollection<String> sc = new SimpleCollection<>();
下面的語句都可以通過編譯:
Sized s = sc;
Traversable<String> t = sc;
System.out.println(sc.isEmpty());
sc.forEach(System.out::println);