從概念上講,我知道抽象類和接口之間的區別。但想知道這兩者之間的技術差異。爲什麼Sun製作了這個界面術語,即使我可以完全抽象出類並完成我的工作。抽象類和接口之間的技術區別
回答
你可以自由選擇在上述情形
interface
或abstract class
但要低於事情記住
,如果你犯了一個fully abstract class
然後
您subclass
將extend
一個類來實現該行爲和 它不符合擴展任何其他類的資格,因爲在java中不支持multiple inheritance
。
看不到interface
我們無法達到multiple inheritance
。
現在,如果我們接觸的interface
代替fully abstract
類
那麼類可以實現,而且仍然eligable多一個類的擴展。
所以如果您的sub classes
永遠不需要擴展任何其他類,請在您的設計中選擇fully abstract
類。
如果sub classes
需要稍後擴展一些類(通常是我們在應用中需要的),然後選擇interface
。
抽象類和接口的區別在Java中
抽象類V5接口在Java中,何時在使用它們otherWhile決定何時使用接口和抽象類,重要的是要知道區別在Java中的抽象類和接口之間。在我看來,它們之間的兩個區別決定了何時使用Java中的抽象類或接口。
1)Java中的接口只能包含聲明。你不能在界面中聲明任何具體的方法。另一方面,抽象類可能包含抽象方法和具體方法,這使抽象類成爲提供通用或默認功能的理想場所。我建議閱讀我的10篇關於Java接口的知識,以更多地瞭解接口,特別是Java編程語言。 2)Java接口可以擴展多個接口,Java類也可以實現多個接口,這意味着接口可以提供比抽象類更多的多態性支持。通過擴展抽象類,一個類只能參與一個Type層次結構,但通過使用接口,它可以成爲多個類型層次結構的一部分。例如。一個類可以同時運行和顯示。我記得的一個例子是在J2ME中編寫GUI應用程序,其中類擴展了Canvas並實現了CommandListener以提供圖形和事件處理功能。
3)爲了在Java中實現接口,抽象的,你需要提供所有方法的實現,這是非常痛苦的。另一方面,抽象類可以在這種情況下通過提供默認實現來幫助你。因爲這個原因,我更喜歡在接口中使用最少的方法,從一開始,我不喜歡標記接口的想法,一旦在Java 5中引入了註釋。如果您看起來像JDK或任何像Spring一樣的框架,爲了更好地理解OOPS和設計模式,你會發現大部分界面只包含一兩種方法,例如Runnable,Callable,ActionListener等。
我沒有在Java中包含抽象類和接口之間的所有語法差異,因爲這裏着重學習何時使用抽象類和接口並選擇其中之一。儘管如此,你可以看到接口和抽象類之間的區別,以找到所有這些語法差異。
因爲你可以有一個類實現2個接口,但你不能有一個類實現(或擴展)2抽象類。
一個很好的簡潔的答案。 –
您編寫了一個帶有接口,抽象類和具體類的java程序,但沒有提及任何構造函數,編譯它並查看.class文件中的字節代碼。您會看到預期的抽象類和具體類具有由編譯器添加的默認構造函數,其中接口不會將構造函數通過編譯器添加到其中。這應該有助於您理解技術差異,因爲我相信您知道其他差異。
這對我來說真的很有幫助。 – syadav
我可能會收到downvotes爲這個答案:)。考慮這種情況。
public class TestClass{
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Fish f = new Fish();
f.walk();
}
}
abstract class Animal {
protected void walk() {
System.out.println("walking");
}
}
class Fish extends Animal {
}
O/P:走
技術上魚不能走路。自從它擴展了動物類以來,它可以「走」,從設計的角度來看這是錯誤的(即使魚沒有實現walk(),它仍然可以稱之爲)。如果Animal是一個接口,那麼Fish必須實現它不會/不應該的方法walk()。所以,你將被迫重新審視設計。
抽象類可以有一些實現代碼和實例變量。一個接口只有方法簽名和靜態變量定義,沒有實現代碼。此外,如果您實現了一個接口,則必須包含接口中定義的所有方法的實現代碼。
如果你打算投票,至少要提供一個解釋,說明這個答案有什麼問題 – Chad
- 1. 抽象類和接口之間的區別?
- 2. miracast和mirrorlink技術之間的區別?
- 3. 抽象類和接口之間有什麼區別?
- 4. MustInherit和抽象類之間的區別
- 5. WCAG 2.0:技術H44和技術F68之間的區別
- 6. python抽象基類,mixin和抽象方法之間的區別
- 7. 鏈接列表和流之間的技術區別是什麼?
- 8. 接口和抽象方法的區別
- 9. 圖像搜索中滑動窗口技術和掃描窗口技術之間的區別
- 10. 抽象數據類型和對象之間的區別
- 11. CharSequence接口和對象類的toString()方法之間的區別
- 12. 抽象類擴展和普通類之間的區別延伸
- 13. java - 抽象類和具體類之間的獨特區別
- 14. 接口類和抽象類有什麼區別和相似之處?
- 15. 抽象類和靜態類之間有什麼區別?
- 16. java中的接口和抽象接口的區別
- 17. 標籤和文本框之間的(技術)區別是什麼?
- 18. 「const char *」和「const string」之間的EXACT技術區別是什麼?
- 19. CreateJS,JQuery和GreenSock之間的技術區別是什麼?
- 20. 軟件測試過程和技術之間的區別?
- 21. 在子類和繼承類之間是否有任何技術區別?
- 22. 抽象類和繼承之間有什麼區別?
- 23. JavaScript中的對象和接口之間的區別
- 24. 與接口和抽象類
- 25. PHP抽象類和接口
- 26. C#接口和抽象類
- 27. 抽象類和接口
- 28. 純抽象類和接口
- 29. 抽象類中的方法的外部抽象和局部抽象之間有什麼區別?
- 30. rpc和servlet技術的區別
這就是Sun如何避免多重繼承的所有問題。一個類可以是多個接口的直接子類型,但只能是一個抽象類;所以你不會得到鑽石問題(至少在Java 8中,這是第一次向Java引入鑽石問題)。 –
你可能想看看http://stackoverflow.com/questions/18777989/difference-between-an-interface-and-an-abstract-class/18778307#18778307 –