以前看一段java8的代碼,發現接口均可以實現方法了,固然在老的教程裏面是會告訴咱們接口只是定義了方法的,爲何Java8要這樣設計呢?看到一句話,既在不破壞java現有實現架構的狀況下能往接口裏增長新方法,引入Default方法到Java8,正是爲了這個目的:優化接口的同時,避免跟現有實現架構的兼容問題。java
看java8比較大的改動就是引入Lambdas表達式,不少接口中加入了相應的方法,好比下面的Iterable接口中增長了foreach的實現。若是在java以前的版本,在接口中定義了方法,咱們實現接口的類,必需要實現,不然編譯會報錯,因此要想在某個接口中增長方法,而不修改現該接口現有的實現類,這是不可能作到的。可是按照咱們Lambdas的編寫,Default應時而生。架構
固然在collection接口有咱們一直用的Stream操做。優化
而後用起來就很神奇了,若是我定義了兩個接口都是default方法,那麼寫個類實現這兩個方法,這不就是多繼承嗎?其中若是有相同的方法,那麼這個類是要從新實現如下。其實我以爲咱們在正常使用中,仍是按照java7以前的原則寫吧,由於通常業務咱們沒有很複雜的這種設計和關係。而在可是對於Java集合API的優化升級,並達到無縫地結合Lambda表達式來講,Default 方法是相當重要的特性。設計
若是不是考慮兼容,那麼留着抽象類還有什麼用呢?由於抽象類還能夠有狀態呀,還暫時沒法徹底替代抽象類。能夠發如今Java9中不用default,也能夠定義非公有的方法,下面我隨便寫了一個,還不知道java9中的目的是什麼。將來的Java版本的接口可能會有更強的功能,或許能更大程度地替代本來須要使用抽象類的場景。繼承
接口這是要上天呀!教程