Java8中引入的默認方法,充分展現了Java平臺概念的一致性與JDK向前兼容之間的矛盾,並且以犧牲概念的一致性而知足JDK向前兼容。java
【曾經】Java接口純粹是契約的集合,是一種程序設計的表達方式。從數據抽象的角度看,可以在不定義class的同時又能夠定義type,將是程序設計中強大而有用的機制。Java接口就是這些純粹的接口組成的數據抽象。Java接口只可以擁有抽象方法,它不涉及任何實現,也不能建立其對象(這一點和抽象類一致)。程序員
多重繼承模型致使額外的複雜性,其中最著名的是鑽石問題或者叫「討嫌的菱形派生」(Dreadful Diamond onDerivation、DDD)。爲何Java接口可以避免多繼承的複雜性,關鍵在於它僅僅包含abstract方法。然而從設計的角度看,Java接口放棄了多繼承的內在/固有目標,而顯得是一個權宜之計。框架
【如今】Java8以前,接口不能升級。由於在接口中添加一個方法,會致使老版本接口的全部實現類的中斷。λ表達式做爲核心出現,爲了配合λ表達式,JDK中Collection庫須要添加新的方法,如forEach(),stream()等,因而引入了默認方法(defender methods,Virtual extension methods)。它是庫/框架設計的程序員的後悔藥。對於之前的遺留代碼,你們都不知道有這個新方法,既不會調用,也不會去實現,如同不存在;編寫新代碼的程序員能夠將它視爲保底的方法體。類型層次中任何符合override規則的方法,優先於默認方法,由於遺留代碼可能正好有一樣的方法存在。ide
默認方法,理論上抹殺了Java接口與抽象類的本質區別——前者是契約的集合,後者是接口與實現的結合體。固然,語法上二者的差異和之前同樣。這就須要程序員來自覺維護二者的本質區別,把默認方法做爲庫、框架向前兼容的手段。spa
默認方法的一個好處:多繼承的著名的是鑽石問題(The Diamond Problem )再次須要關注。於是使之前某些人認爲的「爲了解決多繼承問題而引入接口機制」的說法變成明顯的錯誤——之前也是錯誤的認識。設計
有關java1.8 的詳細說明參考 http://lucida.me/blog/java-8-lambdas-insideout-language-features/對象