9.1算法
能夠建立一個沒有任何抽象方法的抽象類。適用於這種狀況:若是有一個類,讓其包含任何抽象方法都沒有意義,並且又想要阻止產生這個類的任何對象。設計模式
編碼驗證了一下,抽象類是能夠本身寫構造函數的。數組
9.2函數
接口中以前忽略的一些細節:工具
(1)接口中能夠定義變量,它們是隱式static和final的,仍是public的;測試
(2)接口中的方法是隱式public的;編碼
(3)接口能夠多繼承。spa
另外,從1.8開始接口特性有了重大的變化,例如能夠有方法的默認實現,這些內容將在本文的最後進行補充。設計
9.3code
示例中用到了Arrays.toString()函數,它返回數組的字符串形式,工做中有次用到卻忘記這個函數了,本身笨笨的寫了StringBuffer。
策略設計模式:建立一個可以根據所傳參數對象的不一樣而具備不一樣行爲的方法。這類方法包含所要執行的算法中固定不變的部分,而策略包含變化的部分。策略就是傳遞進去的參數對象,它包含要執行的代碼。
9.6
在作練習16的時候發現,不論設定的count是多少,scanner都會將它們一次讀出,通過試驗之後發現,它是經過「空格」,結束一次讀取的。
9.7
由於接口中的字段都是static和final的,因此接口成爲了一種便捷建立常量組的工具。在1.5以前沒有enum,因此可能會看到舊代碼中有用接口定義相似enum的功能。
接口中的字段不是接口的一部分,它們的值被存儲在該接口的靜態存儲區域內。
9.8
能夠在接口和類中嵌套接口(就像內部類同樣),當實現某個接口時,並不須要實現嵌套在其內部的任何接口。
最後做者建議,在設計時應優先選擇類而不是接口。從類開始,若是接口的必需性變得十分明確,那麼就進行重構。
1.8以後接口的改動
一、接口能夠提供默認方法,這個方法能夠有實現,須要在方法前加default關鍵字:
default String getString() { ... }
加入默認方法的目的主要有兩個:
第一,能夠擴展接口。個人理解是,若是一個類ClassImp實現了接口interface,若是internface新增方法,那麼ClassImp不得不修改它的代碼,經過將新增的方法寫爲default能夠解決這個問題;
第二,但願在接口中指定本質上可選的方法。
默認方法帶來了多級繼承的問題,提供以下機制解決:
首先,在全部狀況下,類實現的方法優先級高於接口的默認實現;
其次,當類實現的兩個接口都提供了相同的默認方法,而類沒有重寫這個方法,則編譯器會報錯;
最後,若是是一個接口繼承了另外一個接口,繼承接口的默認函數優先級高於被繼承的接口。可使用super顯示調用被繼承接口的默認方法。
二、在接口中可使用靜態方法,調用靜態方法時不須要實現接口。而且實現接口的類或者子接口不會繼承接口中的靜態方法(只用定義靜態方法的接口才能調用方法)。
經代碼測試,子類能夠調用父類的靜態方法。