爲什麼在實際實現中必須重新輸入每個方法時,Java中使用的接口?什麼是寫出界面使事情變得更簡單的情況的例子?爲什麼在實際實現中必須重新輸入每個方法的Java中使用的接口?
回答
接口定義了一個契約,而不是一個實現。這可以讓你脫離接口的實際實現 - 只要實現滿足合同,你就很高興。
說你調用返回一個List(這是一個接口)的方法。您可以使用該列表,因爲您知道它具有列表功能,如get()和add()。你不必擔心列表是什麼種類。如果List碰巧是一個ArrayList,然後該方法改爲返回一個LinkedList,您根本不必更改代碼,因爲兩者都保證具有List函數。
接口最大的好處之一是你可以在方法參數和返回類型中使用接口。例如,您可以編寫:
public List join (List list1, List list2)
{
// some complicated stuff using list1.size() and list2.get() etc
}
更好的是,使用Collection的更通用。 – SergeyB
接口有許多優點。
假設下面的代碼:
public class MyClass {
public List<String> getNames() {
List<String> names = new ArrayList<String>();
// Populate list of names
return names;
}
}
正如凱文工人在他出色的答覆中提到,一個接口用於定義implenting類必須履行合同。在上述情況下,getNames
方法指出它將返回接口List
的一個實例。但是,合同並不強制您使用特定的List
實施;可以使用任何實現List
的具體類。在這種情況下,選擇了ArrayList
。
後來在你的項目,如果你最終認識到一個LinkedList
將是您的應用程序更好地執行,您可以輕鬆地改變List<String> names = new ArrayList<String>();
到List<String> names = new LinkedList<String>();
,而無需更改方法簽名,或對現有代碼的其餘部分在方法裏面。這是一個很好的做法,它可以防止項目中的許多問題和/或時間浪費。
此外,使用接口允許您(或您的代碼的客戶端)定義最適合其需求的具體實現。在Map
實現的情況下,有些更快,有些則更節省空間。
構建單元測試集時,可以理解接口的另一個優點。大多數模擬框架(如果不是全部的話)都可以使用接口。它使您可以構建不需要每個具體測試實現手動編碼的測試,並且可以使測試代碼庫變得更小/更簡單。
當構建一個將被其他開發人員使用的API時,接口的使用可以使您的API更簡單,並且方便您的客戶使用API。一個例子是Java提供的DOM XML implementation。如果你看看API,幾乎只有接口,沒有具體的類被暴露。在維護這個API期間,開發人員可以添加/更改/刪除任何具體的實現,而不用擔心會破壞與現有客戶端代碼的向後兼容性。
如果他們已經公開具體實現,他們會在API的整個生命週期中把他們的手綁在一起。例如,假設他們提供了一個名爲BuggedElement
的公共實現錯誤Element,客戶端直接在其代碼中使用它。從這一點開始,他們將被迫維持這個實現,而不是僅僅刪除它並編寫一個新的實現,否則使用這個具體實現的現有項目將被迫重新編寫參考BuggedElement
的代碼段。但是,由於他們選擇僅在其公共API中提供接口,因此他們可以修改現有的實現,或者擺脫它們並編寫新的實現,而且它們永遠不會破壞客戶端的代碼。
- 1. 爲什麼必須公開實現內部接口的方法
- 2. 爲什麼Typescript中的抽象類實現和接口必須實現接口中的所有方法
- 3. 爲什麼一個類中實現的C#接口方法必須公開?
- 4. 在C#中,爲什麼接口實現必須顯式地實現另一個方法的版本?
- 5. 在方法/函數重載中,每個版本都必須重新實現嗎?
- 6. 爲什麼javabean必須實現可序列化的接口?
- 7. 何時以及爲什麼我們必須實現Comparable接口?
- 8. 在Scala中實現Java接口方法
- 9. 爲什麼實現Serializable接口的類實現none接口的方法?
- 10. 在java中實際使用接口是什麼?
- 11. 屬性實現必須在接口
- 12. 爲什麼在比較方法的實現中必須包含接口的名稱?
- 13. 必須實現默認的接口方法嗎?
- 14. 如何獲得必須實現接口的所有方法?
- 15. 在方法中使用實例變量Linkedlist() - 爲什麼我必須在方法體中創建新的
- 16. 什麼是實例URL必須在應用程序中輸入?
- 17. 重新實現繼承接口方法
- 18. 爲什麼不能公開一個實現的接口方法?
- 19. 爲什麼Java接口有方法實現?
- 20. 方法參數必須是實現某個接口的某個類的obj
- 21. __construct()必須實現接口錯誤
- 22. Java在派生類中實現接口方法的方法
- 23. 接口端口必須通過一個實際的接口:系統verilog
- 24. 我必須做什麼來實現SQLite的rawQuery()方法?
- 25. 口口聲聲說我必須添加未實現的方法
- 26. 爲什麼你必須在目標C中編寫接口和實現,而不是實現
- 27. 接口不必要求實現方法
- 28. 在至少一個對象必須實現的接口IComparable的
- 29. C++ 11已實現的接口方法不可用。爲什麼?
- 30. 必須實現繼承的方法ApplicationListener.render()
閱讀關於[interfaces](http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html)以及它們爲什麼用作合同並幫助您的代碼更加靈活 – gtgaxiola
根據C++的一種替代方案是允許多繼承,這將允許您繼承兩個抽象類,但其他問題是Java設計者決定不這樣做的原因之一 – Mark