跟我學java編程—深入理解面向對象的繼承思想

2020-12-08 米粒教育

繼承是面向對象設計的重要思想,其核心是代碼的復用和程序功能高度的擴展性。繼承在詞典中的解釋是把前人的知識、文化、思想、財產、知識等接受過來。在面向對象中,繼承是對類而言的,新類可以繼承已有類的屬性和方法,這樣做的好處是新類可以復用原有類所有的代碼,復用的同時又可以定義新的方法和屬性來擴展原有類的功能。

為了理解繼承思想,下面看一個案例。

某出版機構準備要通過微信小程序實現產品在微信媒體的推廣和銷售,出版機構的產品包括圖書、音頻、視頻,圖書又分為紙書和電子書。現在需要設計產品類,該類能夠存儲出版社所有產品的屬性(如名稱、價格、作者、摘要等產品信息),並能輸出產品的屬性。

由案例內容分析可知,該出版機構有紙質圖書、電子圖書、音頻、視頻產品,每類產品既有共同屬性,如名稱、價格、作者、摘要等屬性,也有個性化屬性,如紙質圖書有字數、頁數等屬性,視頻有解析度、播放時長、文件大小、編碼等屬性,音頻有採樣頻率、文件大小、編碼等屬性,電子圖書有格式、文件大小等屬性。

前面我們學過抽象和封裝,可以把同類事物的共同屬性抽取出來形成類,既然該出版機構的紙質圖書、電子圖書、視頻、音頻產品都具有共同屬性名稱、價格、作者、摘要,可以創建一個Product產品類,代碼如下:

Product類聲明了該出版機構產品的共同屬性名稱、價格、作者、摘要,並定義了輸出產品屬性的方法outProduct()。

但該類並沒有完全實現任務要求,因為該類的屬性並沒有全部反映出該出版機構所有產品的屬性,如紙質圖書、電子圖書、視頻、音頻產品的個性化屬性。

如何解決這個問題呢,有兩種解決方案,一種解決方案是每類產品都創建為一個類,該類包含該產品的所有屬性,即分別創建紙質圖書類、電子圖書類、視頻類和音頻類,鑑於篇幅關係下面僅給出紙質圖書類的代碼:

例子代碼僅給出了紙質圖書類的代碼,電子圖書類、視頻類和音頻類可參照紙質圖書類代碼創建。這樣創建的代碼也可以完成案例任務要求,問題是創建的四個產品類中都有重複的屬性和方法,代碼重複,不符合面向對象的設計原則。

另外一種解決方案就是採用Java的類繼承機制,利用Java的類繼承機制可以讓紙質圖書類,電子圖書類、視頻類和音頻類均繼承於Product類,被繼承的Product稱為父類,繼承的紙質圖書類,電子圖書類、視頻類和音頻類稱為子類,子類繼承父類的所有屬性和方法,同時子類可以聲明自己特有的屬性和方法。下圖給出了出版機構的產品類繼承圖。

圖 12-1 產品類繼承圖

在Java中子類繼承父類是通過extends關鍵字來實現繼承的。下面給出電子圖書類、視頻類的子類代碼,其它子類代碼請自行創建:

電子圖書類代碼

EBook類是Product類的子類,繼承了Product類的全部屬性和方法,也包括構造方法,Product類是EBook類的父類。程序創建Ebook對象時,需用super關鍵字調用父類的構造函數以初始化父類的數據,super關鍵字主要用於指向子類對象中的父類對象。

視頻類代碼

視頻類代碼的結構同電子圖書類代碼結構相同,這裡就不作解釋了。細心的同學可能會發現EBook類和Video類也具有共同的屬性formation和filesize,可以把formation和filesize提取出來抽象為一個新的電子出版物類,電子圖書類、視頻類、音頻類繼承電子出版物類,電子出版物類又繼承於產品類,從而構成產品類的層次結構,產品類層次結構如下圖所示:

圖 12-2 產品類層次結構圖

類的層次結構充分體現了面向對象編程的繼承思想,高度抽象出的事物(Product類)再不斷細化為接近現實的事物(PaperBook類和EProduct類),EProduct類又可以細化為具體事物(EBook、Video、Audio類),層層繼承,高度復用了已有代碼。

■ 知識點撥

面向對象的繼承思想是也是一種系統設計思想,系統從高度抽象入手構建基礎抽象類,基礎抽象類滿足系統所有類的基本屬性和操作要求。所有系統類均繼承於基礎抽象類,繼承的系統類又可以被更具體化的子類繼承,從而構成了系統的類層次結構。Java語言的Objec類就是一個基礎抽象類,Java所有的類都繼承於Objec類,JDK就是一個很好的類層次結構例子。

■ 思考與練習

請參照教材內容樣例代碼,給出圖 12-2類層次結構圖的實現代碼。

相關焦點

  • 跟我學java編程—面向對象編程多態概念的理解
    前面介紹了面向對象的繼承思想,繼承思想其核心是代碼的復用和程序功能高度的擴展性。繼承可以直接實現代碼的復用,功能的擴展性是指繼承後的類在父類的基礎上增加新的行為,或者對父類的行為進行擴展,實現同一個行為具有不同的實現代碼。
  • 跟我學java編程—理解Java語言的抽象與對象
    面向對象編程思想的一個基本方法就是抽象。抽象是從眾多的同類事物中抽取出具有共同特徵的過程及方法。如果以面向對象的編程思想來看前面例子的話,水果可以稱之為類,而蘋果、香蕉、葡萄可以稱之為類的實例或對象。類是抽象出來的事物,現實生活中並不存在,例如水果,水果是人們賦予具有蘋果、香蕉、葡萄等共同特點的名稱,不單指某一事物;對象是指具體的實物或概念,例如蘋果、香蕉、葡萄等對象是實物,而一項政策可能就是一個概念性的對象了,在現實生活中,萬事萬物皆對象,面向對象編程就是模擬現實生活中的一個個對象來編程的。
  • 用最傻瓜式的方法理解Java中的封裝、繼承和多態
    說到java中面向對象的封裝、繼承和多態,很多人會說這麼簡單這麼入門的東西一直講幹嘛,雖然是基礎,但是我們要明白,所有東西都是要在基礎上發展的,沒有基礎就去學其他的,那麼你肯定是很容易失敗的,那麼應該怎樣能夠用傻瓜式方法去理解Java面向對象的封裝、繼承和多態呢?
  • Java面向對象之接口——interface
    對於同一種型號的主板上的多個USB插槽,他們有相同的數據交換方式,相同的實現細節;在面向對象的思想中,可認為他們都是同一個類的不同實例,也就是說插槽是USB規範的實例。可以這樣理解:接口是實現類的父類:實現類就是接口的子類。
  • 圖說Java中的OOPs(面向對象編程系統)基本概念
    面向對象編程是一種編程概念,其核心思想是允許用戶創建所需要的對象,然後提供處理這些對象的方法,使用者通過操作對象而獲得運算數據。本文將以簡潔的方式對面向對象編程中的概念進行梳理。1.Class(類)你可以將類理解為對一組相似實體的統稱。類只是一個邏輯組件,並不是具體的物理實體。例如,你可以創建一個名為「Bird」的鳥類,則它可能包含烏鴉,喜鵲,麻雀,鸚鵡等對象。其屬性(數據)可以是這些鳥的顏色,體重或者身高。除此之外,你還可以為鳥類提供飛行,捕食,鳴叫等方法。2.
  • 在.NET中,C#舉例深度理解面向對象編程中的封裝、繼承和多態
    -面向對象編程1.什麼是面向對象編程?我們在沒有接觸類之前,所有的代碼都是堆在一起的,沒有面向對象的概念,但接觸了類/對象/繼承/接口之後,我們要建立自己的面向對象編程的概念,在編碼過程中,要讓自己編寫的程序是面向對象的,而不是堆代碼。微軟在.NET框架中推出的C#語言是面向對象的強類型程式語言。
  • Java面向對象之:封裝、繼承、多態
    Java面向對象之:封裝、繼承、多態高內聚和低耦合,父類只希望被子類訪問的欄位和方法時;繼承從面向對象的角度上說,繼承是一種從一般到特殊的關係,是一種「is a」的關係,即子類是對父類的拓展,是一種特殊的父類,比如:狗是動物的一種特殊情況,狗屬於動物;在這個例子中,動物是父類,狗是子類,狗繼承了動物的特徵和行為,並在動物的特徵和行為的基礎之上拓展自己的特徵和行為
  • 深入分析java中的多態(從jvm角度分析)
    對於java中多態概念的理解一直是面試常問的問題,所以今天花了一些時間好好地整理了一下,力求從java虛擬機的角度來分析和理解多態。一、認識多態1、方法調用在Java中,方法調用有兩類,動態方法調用與靜態方法調用。
  • 開發崗位這麼多,為什麼選Java?你學Java了嗎-開課吧
    其他程式語言與Java相比,Java語法相對簡單,並且是很多計算機語言的基礎。提到C++語言,很多人發現在使用過程中最容易出現的錯誤就是內存管理,而java有自動垃圾回收器,不用擔心內存。零基礎學Java作為一門面向對象的高級語言,Java不僅吸收了C++語言的各種優點,還對C++裡諸如多繼承、指針等一些讓用戶難以理解和掌握的概念重新組織和及摒棄
  • 如何給女朋友解釋什麼是面向對象編程?
    周末午後,我正在愉快的打著遊戲。女朋友拿著一本《面向對象編程》過來找我。什麼是面向對象?是要面向我寫代碼嗎?不是啦,這個面向對象的對象不是你這個對象啦。此時,我突然感受到了一股莫名的殺氣。什麼?你還有其他對象嗎?有我好看嗎?有我瘦嗎?不對。你不能有其他對象。什麼是面向對象?面向對象,英文名字叫Object Oriented,是一種軟體開發方法。是和面向過程相對應的。別給我拽英文。給我詳細說說,說不明白今天就沒完。
  • 跟我學java編程—深入理解for語句的嵌套循環
    示例1:用「*」輸出一個菱形圖案,圖案如下: 在D盤Java目錄下,新建「ForSample1.java」文件。用記事本打開「ForSample1.java」文件,輸入以下代碼:代碼結構分析程序功能主要是演示for嵌套循環的使用方法。
  • Java 中的繼承和多態(深入版)
    面向對象的三大特性:封裝、繼承、多態。在這三個特性中,如果沒有封裝和繼承,也不會有多態。那麼多態實現的途徑和必要條件是什麼呢?以及多態中的重寫和重載在JVM中的表現是怎麼樣?在Java中是如何展現繼承的特性呢?對於子類繼承於父類時,又有什麼限制呢?
  • 面向對象編程的災難:是時候考慮更新換代了!
    面向對象編程從來沒有打算擁有諸如繼承、多態性、「new」關鍵字和無數設計模式之類的東西。最純粹的面向對象編程設計Erlang是面向對象編程最純粹的形式。與更主流的語言不同,它關注面向對象的核心思想——消息傳遞。在Erlang中,對象通過在對象之間傳遞不可變的消息進行通信。
  • JAVA面向對象的多態是個什麼東西?
    面向對象的三大特徵:封裝、繼承、多態。在前面已經說了過了封裝和繼承。今天就來聊聊剩下的多態。多態,從字面內容來看,就是多種形態,多種狀態。在java的面向對象中可以從以下兩個方面來講。01不同子類之間的多態在前面我們說繼承的時候說到,子類可以繼承到父類的方法,繼承後可以對方法進行重寫。
  • Unity遊戲開發:C Sharp進階之面向對象編程
    C進階之面向對象編程深入淺出的C#進階課程在了解C#基礎語法之上,進一步學習面向對象(OOP)編程技術和.NET框架,並深入講解在實踐中總結出的OOP設計理念。學完本課程,即可設計出優質的面向對象程序,並可在Unity中用C#來開發所有腳本。
  • 嘿,你對象在這兒——Java 面向對象編程:類和對象
    相信很多小夥伴學Java的時候都是戰術開頭:HelloWorld! 首先,創建一個類,然後寫一個主方法,最後列印輸出,ojbk完事兒。等到我們學面向對象的時候不得不去了解一下什麼是類,什麼是對象,他倆是啥關係。
  • 如何以面向對象的思想設計有限狀態機
    這個時候就需要以面向對象的思想來設計有限狀態機。面向對象法設計狀態機面向對象基本概念以面向對象的思想實現的狀態機,大量涉及了對於函數指針的用法,必須對這個概念比較熟悉上述所提到了兩個設計方法都是基於面向過程的一種設計思想,面向過程編程(POP)是一種以過程為中心的編程思想,以正在發生的事件為主要目標,指導開發者利用算法作為基本構建塊構建複雜系統。
  • 跟我學java編程—Java邏輯運算符
    示例1:邏輯運算符在D盤Java目錄下,新建「LogicSample.java」文件。用記事本打開「LogicSample.java」文件,輸入以下代碼:代碼結構分析程序功能主要是演示邏輯運算符的用法。類似語句「bJudge = !
  • 面向對象編程
    面向對象編程(OOP)對於初學者來說可能是一個很難理解的概念。很多書籍都是從解釋OOP開始,討論三大術語:封裝、繼承和多態性,但是解釋的效果往往讓人失望。本文希望讓程式設計師、數據科學家和python愛好者們更容易理解這個概念。我們去掉所有的行話,通過一些例子來做解說。這篇文章是關於解釋OOP的外行方式。
  • 跟我學java編程—Java類的類型轉換和動態綁定
    也許同學們會有疑問,如果在程序中聲明了一個父類變量,該父類變量能不能指向其子類對象呢?或者聲明了一個子類變量,該子類變量能不能指向其父類對象呢?答案是肯定的。例如下面的代碼:代碼中Product類是父類,EBook是Product類的子類,在main方法中,聲明了Product類變量,該變量指向實例化的子類對象,也就是父類變量指向其子類對象。