JavaRush /Java Blog /Random-TW /喝咖啡休息#95。如何解決Java中的多重繼承問題

喝咖啡休息#95。如何解決Java中的多重繼承問題

在 Random-TW 群組發布
來源:FreeCodeCamp Java 是當今最受歡迎的物件導向程式語言之一。由於它是獨立於平台的,因此您可以在每種類型的裝置和每種作業系統上找到 Java 應用程式。而且由於Java比較容易學習,所以它是許多程式設計師掌握的語言之一。您應該熟悉的 Java 的一個重要特性是類別繼承。繼承允許您優化程式碼,從而更輕鬆地重複使用類別。當您可以重複使用已經測試和偵錯的程式碼時,軟體開發生命週期就會變得更短且成本更低。 喝咖啡休息#95。 如何解決Java中的多重繼承問題 - 1儘管理論上是一個簡單的概念,但編碼繼承關係需要注意細節。特別是對於多重繼承,一個子類別繼承多個父類別的屬性。Java 拒絕多重繼承關係,因為它們會產生歧義,但如果您知道該怎麼做,有多種方法可以實現許多相同的效果。在本文中,我們將研究多重繼承的問題並討論 Java 中的替代編碼選項。

繼承術語

有時,要成為一名成功的程式設計師,您需要成為問題解決者來找到常見錯誤或問題的解決方法。這是安全和智慧編碼的重要組成部分。其中一個問題與 Java 中的多重繼承(或更確切地說,缺乏多重繼承)有關。 喝咖啡休息#95。 如何解決Java中的多重繼承問題-2要完全理解 Java 中的繼承,您需要熟悉物件導向程式設計 (OOP) 的基本繼承術語。
  • 類別是物件導向程式語言中的基本模式結構。類別定義一組物件的公共屬性。
  • 父類別:也稱為基底類別或超類別。父類別是為子類別提供功能的可擴充類別。它允許重複使用。建立子類別時會重複使用父類別的定義和函數。
  • 子類:更一般地稱為子類,子類繼承另一個類的功能。子類別是擴展類別或衍生類別。
  • 繼承:父類別和子類別之間的關係。

OOP繼承類型

現今有許多流行的物件導向程式語言,包括 Java、C++、JavaScript、Python、PHP、Ruby 和 Perl。儘管繼承是這些 OOP 語言中的常見概念,但並非所有類型的繼承都存在於每種語言中。了解常見的繼承類型以及您所使用的特定語言對繼承的限制非常重要。您對繼承了解越多,就會成為更有效率的開發人員。Java 支援的繼承類型包括:
  • 單級繼承:當子類別繼承單一父類別的功能。
  • 多級繼承:這是單級繼承的多級形式。在多層繼承中,子類別也可以充當其他子類別的父類別。每個等級之間的關係是線性的 - 沒有分支比多重繼承更高。在這種情況下,最終的子類別具有上面所有層級的函數。
  • 層次繼承:與多重繼承相反。在層級繼承中,一個父類別有多個子類別。因此,它不是在上面有分支,而是在下面分支。
  • 混合繼承:顧名思義,混合繼承是其他類型繼承的組合。
除了上面列出的繼承類型之外,還有一些 Java 不支援的類型。
  • 多重繼承:在多重繼承中,一個子類別有多個父類別。雖然Java和JavaScript不支援多重繼承,但C++等OOP語言卻支援多重繼承。
  • 多路徑繼承:多重、多層次、分層繼承的混合體,在多路徑繼承中,子類別繼承父類別和父類別的幾個子類別的特性和功能。由於多路徑繼承是基於多重繼承的,因此Java不支援其使用。

為什麼Java不支援多重繼承

多重繼承的主要問題是它會在子類別中產生歧義。在 1995 年的白皮書中,Java 首席設計師 James Gosling 表示,多重繼承的問題是創造 Java 的原因之一。多重繼承固有的複雜性在鑽石問題中最為明顯。在鑽石問題中,父類A有兩個不同的子類B和C;也就是說,子類別 B 和 C 擴展了類別 A。 喝咖啡休息#95。 如何解決Java中的多重繼承問題 - 3現在我們建立一個新的子類別D,它擴展了類別B 和類別C。請注意,我們具有多重繼承(D 擴展B 和C)、層次繼承(B 和C 擴展A)和多層繼承(D 擴展 A、B 和 C)。在鑽石問題中,子類別 B 和 C 繼承了父類別 A 的方法。B 和 C 都重寫了繼承的方法。但B和C中的新方法是互相矛盾的。最終的子類別D從其多個父類別B和C繼承了兩個獨立且衝突的方法。不清楚應該使用類別D的哪個方法,因此產生了歧義。其他OOP程式語言實作了不同的方法來解決多重繼承的歧義。

如何解決Java中的多重繼承問題

僅僅因為多重繼承有問題並不意味著它沒有用。在許多情況下,您可能希望一個類別具有多個其他類別的函數。想想當您成為非常成功的軟體開發人員時您將購買的 Tesla Roadster。其技術特點基於跑車級和電動車級。另一個例子:您正在通過的瀏覽器閱讀本文。它具有互聯網隱私解決方案類別和通用互聯網瀏覽器類別的功能。但你不能在 Java 中擴展多個類別。那麼這種語言是如何處理多重繼承的問題呢?Java 使用稱為介面的結構。介面是定義要由類別實現的行為的抽象類型。由於介面是抽象的,因此不包含有關其行為的詳細說明。相反,類別提供介面行為的具體實作。介面有幾個定義特徵:
  • 與類別不同,您不需要實例化介面。相反,類別實作介面。
  • 介面僅包含公共常數定義和方法頭。
  • 接口只能擴充其他接口,而不能擴充類別。
  • 接口可以擴展多個接口,類別可以實現多個接口。
我們現在可以使用介面有效地解決鑽石問題。請記住,只有接口只能擴展其他接口,並且任何需要多重繼承特性的類別都必須實現多個接口,我們可以重寫鑽石問題類。先前的類別 A、B 和 C 現在變成了介面 A、B 和 C。介面 B 和 C 仍然擴充介面 A,但這些介面都沒有特定的功能,只有特定的行為。類別 D 仍然是負責專門實作介面 B 和 C 中的行為的類別。請注意一個關鍵區別:類別 D 不擴展介面 B 和 C。相反,它實作了它們。這樣你其實就沒有多重繼承。相反,您只是重新定義了問題。

結論

理解繼承對於任何高效的 Java 開發人員來說都是至關重要的。了解繼承的限制以及 Java 針對傳統多重繼承問題的內建解決方法也同樣重要。學習如何建立介面來重現 Java 中多重繼承的效果將提高您的工作效率和招募機會。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION