1. 程式人生 > >java 繼承與組合學習筆記

java 繼承與組合學習筆記

繼承

繼承實現了高度複用的同時,也帶來了一個嚴重的問題,破壞了父類的封裝性。封裝就是每個類應該把內容部資訊(屬性)和實現細節(方法)隱藏,值暴露必要的方法給其他類使用。但在繼承中,子類可以更改父類的屬性和方法,從而造成了子類和父類的高度耦合。

為了包裝父類的良好的封裝性,不會被子類隨意更改。設計父類時應該遵循一下幾個原則:
1,儘量把父類內部的資料隱藏,把屬性設定成private,不讓子類之間訪問父類屬性。
2,不要讓子類隨意覆蓋父類的方法,像父類中哪些輔助其它方法的工具方法應該用private訪問修飾符修飾。如果類中的方法需要被外部類呼叫,而不想被子類覆蓋,可以使用final修飾。如果類中的方法只想被子類覆蓋,而不像被其它類呼叫,可以使用protected來修飾該方法。
3,不要在父類的構造器中呼叫被子類重寫的方法。

那麼到底合適需要從父類派生子類呢?不僅需要子類是一種特殊的父類,而且還需要具備兩個條件:
1,子類需要增加額外屬性,而不僅僅是屬性值的改變。
2,子類需要增加自己獨有的行為方法。包括覆蓋父類的方法和增加新方法。

組合

如果需要複用一個類,不僅可以使用繼承,還可以使用組合。組合就是把需要複用的類最為新類的屬性嵌入新類中。不管是繼承還是組合,都允許在新類(對於繼承來說就是子類)中呼叫複用類的public方法。組合時,通常在新類中用private修飾複用類。

到底該用繼承?還是組合呢?繼承表達的一種“是(is-a)”的關係。而組合表達的是一種“有(has-a)”的關係。繼承是對已有類做的一番改造,讓一個類是另一個類的特殊型別(子類是一種特殊的父類)。比如,狗 繼承 了動物類,狗是一種動物(is-a),如果我用動物類去組合成夠類並不合適。反之,如果兩個類之間有整體和部分之間的關係,比如: 有一個arm(手臂)類,去組合成一個person(人類),arm是部分,person是一個整體,體現了has-a的關係。

相關推薦

java 繼承組合學習筆記

繼承 繼承實現了高度複用的同時,也帶來了一個嚴重的問題,破壞了父類的封裝性。封裝就是每個類應該把內容部資訊(屬性)和實現細節(方法)隱藏,值暴露必要的方法給其他類使用。但在繼承中,子類可以更改父類的屬性和方法,從而造成了子類和父類的高度耦合。 為了包裝父類的

Java物件--學習筆記

在之前的的學習中從來沒有系統的做過筆記,這一次跟著李興華老師一起學習Java,我被他上課的風格所吸引,所以我決定將我所學到的內容系統的記錄下來,實際上也是在李老師的課上所記錄的學習筆記。這是我第一次寫部落格,有什麼不足之處還望各位讀者指正。 JAVA-類與物件

《深入理解Java虛擬機》學習筆記(第三章 垃圾收集器內存分配策略)

關鍵字 rem 永久 規模 是把 同時 技術 source () 第三章 垃圾收集器與內存分配策略 要解決的問題 哪些內存需要回收? 什麽時候回收? 如何回收? 概述 當需要排查各種內存溢出、內存泄漏問題時,當垃圾收集成為系統達到更高並發量的瓶頸時, 需要對內存動態分

Java多執行緒學習筆記21之單例模式多執行緒

詳細程式碼見:github程式碼地址   第六章 單例模式與多執行緒 前言: 我之前已經開設了23個設計模式這個專欄,介紹了很多的Java設計模式,其中一些模式對於絕 大多數程式語言設計思想都是類似的,需要了解單例模式的可以去看看。 我們在實際開發中經常用到單例模式,但

Java第八天學習筆記~面向物件(陣列工具、單列設計模式、繼承

    陣列工具 1,陣列工具物件建立 class ArrayToolDemo { /*保證程式的獨立執行*/ public static void main(String[] args) { int[] arr={4,8,2,9,72,6}; //

派生類繼承(C++學習筆記 31)

  ① 繼承,就是從先輩處得到屬性和行為特徵,類的繼承就是新的類從已有類那裡得到已有的特性。   ② 類的派生,即可看作從已有類產生新類的過程。由已有類產生新類時,新類便包含了已有類的特徵,同時也可以加入自己的新特性。   ③ 已有類稱為 基類 或 父類 ,產生的新類稱為 派生類 或 子類。

#資料結構演算法學習筆記#劍指Offer29:整數中1出現的次數 + 分段思想/按位考慮 + 測試用例(Java、C/C++)

2018.10.5 感受到開學之後工作和課業的雙重壓力,加上近段時間自己出了點小事故,因此斷更了許久。沒事,繼續。 這道題有兩種複雜度為的演算法。 方法1:遞迴(分段思想)。 所有數字出現1的個數 = 每一段數字中出現1的個數之和 1. 對於輸出的數字n,其最高位為

#資料結構演算法學習筆記#劍指Offer30:把陣列排成最小的數 + 自定義比較器 + 測試用例(Java、C/C++)

2018.10.6 1.求全排列最小。事實上用全排列硬剛這道題確實是最直接的辦法,因為乍一眼看上去實在不好歸納數字之間的順序關係,全排列具體實現原理可以參考上述文章。 2.自定義比較器。為什麼說

#資料結構演算法學習筆記#劍指Offer34:兩個連結串列的第一個公共結點 + 等長遍歷/輔助棧 + 測試用例(Java、C/C++)

2018.10.21 這道題也是屬於效率題,實現難度不大,但是要降低複雜度還是需要思考一下。有兩個o(n)的做法: 方法一:等長連結串列法。先計算兩條連結串列的長度,然後先遍歷長連結串列直到兩條連結串列等長,最後依次按奇偶順序挨個遍歷兩條連結串列各個結點。 方法二:輔助

#資料結構演算法學習筆記#劍指Offer35:數字在排序陣列中出現的次數 + 測試用例(Java、C/C++)

2018.10.24 今天是程式設計師節,但是程式設計師有啥節好過的,還是好好幹活吧~ 這道題也是一道效率題,根據實際情況的不同有兩個比較好用的方法: 方法一:平均複雜度o(n)。二分找到某一個K

java小心機(4)| 繼承組合的愛恨情仇

在java中,有兩種主要複用程式碼的方法:繼承和組合。 繼承,是OOP的一大特性,想必大家都非常熟悉了;組合,其實也很常見,只是不知道它的名字罷了。 繼承 子類擁有父類的基本特性,需使用extend關鍵字實現,宣告某子類繼承於某父類 如下例子,麻雀繼承鳥類 //

#資料結構演算法學習筆記#劍指Offer35:是否平衡二叉樹/AVL樹 + 測試用例(Java、C/C++)

2018.11.3 前幾天有用遞迴實現了二叉樹的深度#資料結構與演算法學習筆記#劍指Offer36:二叉樹的深度(Java),因此可以對每個結點先序遍歷進行一次平衡驗證,只要確定每個結點都是平衡的

Java版資料結構演算法學習筆記

概述 1. 什麼是資料結構 即資料在記憶體或磁碟上的組織形式,包括陣列、連結串列、棧、佇列、樹、hash表、圖、堆等。 2. 什麼是演算法 即對資料結構中的資料的處理方法,也可以說利用資料來解決業務問題的方法。 3. 資料結構與演算法的關係 資料結構是為演算法服務的。

《資料結構演算法分析java語言描述》學習筆記

一、抽象資料型別  抽象資料型別(abstract data type,ADT)是帶有一組操作的一些物件的集合。 二、ArrayList 的實現 自定義ArrayList 實現程式碼如下: package com.caitang.mjq; import java.uti

《深入理解Java虛擬機器》學習筆記之垃圾收集器記憶體分配策略

一、概述 GC(Garbage Collection)需要完成的三件事 (1)哪些記憶體需要回收 (2)什麼時候回收 (3)如何回收 GC主要面向Java堆和方法區中的記憶體 原因:這部份

java/android 設計模式學習筆記(12)---組合模式

  這篇我們來介紹一下組合模式(Composite Pattern),它也稱為部分整體模式(Part-Whole Pattern),結構型模式之一。組合模式比較簡單,它將一組相似的物件看作一個物件處理,並根據一個樹狀結構來組合物件,然後提供一個統一的方法去訪問相

《深入理解Java虛擬機器》學習筆記之執行緒安全鎖優化

二、執行緒安全 定義: “當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的行為都可以獲得

系統分析設計學習筆記(一)

學習 掌握 應該 溝通 基本 最終 表示 對象 毫無 為什麽要學習這門課程?   “擁有一把錘子未必能成為建築師”。 這門課程學習的是面向對象分析和設計的核心技能的重要工具。對於使用面向對象技術和語言來,創建設計良好、健壯且可維護的軟件來說,這門課程所

C#委托事件學習筆記

調用函數 msdn http msd proc for reac .net 委托方 今天跟隨視頻學習了一下C#中最重要的一些概念之委托與事件。老楊的視頻講的還是挺深入淺出,不過剛接觸C#.NET的人還是朦朦朧朧,就像張子陽先生說的“每次見到委托和事件就覺得心裏別

Java 繼承重寫、重載

重載 進行 cnblogs 向上造型 用法 編譯 根據 ide 調用 1.類的繼承 1)繼承   父類:所有子類所共有的屬性和行為   子類:子類所特有的屬性和行為 通過extends關鍵字來實現類的繼承 子類(Sub class)可以繼承父類(Super class)的