一、基本概念
default methods enable you to add new functionality to the interfaces of your libraries and ensure binary compatibility with code written for older versions of those interfaces.
預設方法使您能夠添加新的功能到你現有庫的接口中,并確定與采用老版本接口編寫的代碼的二進制相容性。
什麼是預設方法(default methods)
即接口可以有實作方法,而且不需要實作類去實作其方法。隻需在方法名前面加個default關鍵字即可,這些方法預設是
為什麼要有預設方法
為什麼要有這個特性?首先,之前的接口是個雙刃劍,好處是面向抽象而不是面向具體程式設計,缺陷是,當需要修改接口時候,需要修改全部實作該接口的類,目前的java 8之前的集合架構沒有foreach方法,通常能想到的解決辦法是在jdk裡給相關的接口添加新的方法及實作。然而,對于已經釋出的版本,是沒法在給接口添加新方法的同時不影響已有的實作。是以引進的預設方法。他們的目的是為了解決接口的修改與現有的實作不相容的問題
二、 java 8抽象類與接口的差別
相同點:
1.都是抽象類型;
2.都可以有實作方法(java8才可以)
3.都可以不需要實作類或者繼承者去實作所有方法
不同點
1.抽象類不可以多重繼承,接口可以(無論是多重類型繼承還是多重行為繼承);
2.抽象類和接口所反映出的設計理念不同。其實抽象類表示的是"is-a"關系,接口表示的是"like-a"關系;
3.接口中定義的變量預設是public static final 型,且必須給其初值,是以實作類中不能重新定義,也不能改變其值;抽象類中的變量預設是 friendly 型,其值可以在子類中重新定義,也可以重新指派。
三、多重繼承的沖突說明
由于同一個方法可以從不同接口引入,自然而然的會有沖突的現象,預設方法判斷沖突的規則如下:
1.一個聲明在類裡面的方法優先于任何預設方法(classes always win)
2.否則,則會優先選取最具體的實作,比如下面的例子 b重寫了a的hello方法。
四、如何擴充或實作帶有預設方法的接口?
目前擴充一個預設方法的接口時,你可以采用以下三種方式:
1:讓擴充類繼承預設方法,根據不管是否存在預設方法
2:重新聲明預設方法,使其變為一個抽象方法(注意,擴充類的實作類必須實作此方法)
3:重新定義預設方法,覆寫(override)父類的預設方法
五、預設方法樣例代碼
六、整合預設方法、靜态方法到已經存在的接口
下面的代碼是有關撲克牌遊戲中的洗牌,針對牌排序,打散,發牌的部分源代碼