大話設計模式系列之面向對象基礎(一)

前言:
讀到《大話設計模式》此書的附錄 A 部分時,始覺匆匆而過,實際閱讀時,發現了太多忽視的點兒,同樣的文字,不同的時期進行閱讀確實有新的感悟。溫故而知新,可以爲師矣。本文會增加我的讀書筆記與思路與大家共勉。

基礎定義

對象:對象(Object Oriented Programming)是一個自包含的實體,用一組可識別的特性和行爲來標識。

:類就是具有相同的屬性和功能的對象的抽象的集合。

實例:實例化就是創建對象的過程,從類中剝離出的個體。

構造方法:構造方法又叫作構造函數,其實是對類進行初始化。構造方法與類同名,無返回值,也不需要 void,在 new 時候調用。

方法重載

  • 定義:兩個方法的方法名相同,但參數類型或個數不同,則稱作對原有方法的重載
  • 作用:提供了創建同名的多個方法的能力,在不改變原方法的基礎上,新增功能。

字段:字段是存儲類要滿足其設計所需要的的數據,字段是與類相關的變量。

私有的:private
表示只允許同一個類中的成員訪問,其他類包括它的子類無法訪問,俗稱私有的。

共有的:public
表示它所修飾的類成員可以允許其他任何類來訪問,俗稱公有的。

面向對象的三大特性

封裝

由來

比如拿 人類 來舉例子,我們現實當中只存在一個一個的人(對象),人類只是一個概念性的東西,是我們人自己歸納總結出來的,我們知道人都長什麼樣,所以我們知道符合這個樣子的就叫人,人的大腦總是習慣將事物分類,因此人類的概念就出現了,那麼我們發現一個一個的人,都有眼睛鼻子嘴(屬性),都能吃飯(方法),等等,這就是人這個事物的本質特性,然後我們得編程啊,人類的概念光在腦海中出現了還不行,還得體現到代碼上?如何體現?
就要使用“封裝”這個手段,也就是定義一個類,通過封裝定義出來的這個類,和現實當中的人這個實體(對象)進行映照,從而應用到程序中。

定義

以類的封裝來解釋:
每個對象都包含它能進行操作所需要的所有信息,這個特性稱爲封裝,因此對象不必依賴其他對象來完成自己的操作,這就是對對象的封裝。

作用

1、良好的封裝能減少耦合
2、使類內部的實現可以自由地修改,而對外部沒有影響
3、封裝的類具有清晰的對外接口,方便與外界進行互通

繼承

由來

技術來源於生活,生活中的父子關係,兒子具有父親的相應外貌特徵以及內在的遺傳特徵。

定義

對象的繼承代表了一種 “ is - a ”的關係,如果兩個對象 A 和 B,可以描述爲 “ B 是 A”,則表明 B 可以繼承 A。
比如:“貓是不如動物”,就說明了貓與哺乳動物之間繼承與被繼承的關係。

代碼層面的作用

1、子類擁有父類非 private 的屬性和功能;
2、子類具有自己的屬性和功能,即子類可以擴展父類沒有的屬性和功能;
3、子類還可以以自己的方式實現父類的功能(方法重寫)

優劣點

優點:
1、繼承使得所有子類公共的部分都放在了父類,使得代碼得到了共享,這就避免了重複。
2、繼承可使得修改或擴展繼承而來的實現都較爲容易。

缺點:
1、父類改變,則子類也不得不改變。繼承時一種類與類之間強耦合的關係。
2、繼承會破壞包裝,父類實現細節暴露給了子類。

補充:當兩個類之間具備“ is - a”的關係時,就可以考慮用繼承了。

多態

由來

技術來源於生活,我們的國粹“京劇”以前都是子承父業,代代相傳的藝術。假設有這樣一對父子,父親是比較有名的京劇藝術家,兒子長大成人,模仿父親的戲也惟妙惟肖。有一天,父親突然發高燒,上不了臺表演,而票都早就賣出,退票顯然會大大影響聲譽。怎麼辦呢?優於京戲都需要化妝纔可以上臺,就決定讓兒子代替父親上臺表演。
兒子代表父親表演,化妝後就是以父親的身份出現了。
兒子模仿得再好,那也是模仿,兒子只能用自己的理解表現方式去模仿父親的作品。
兒子經過多年學習,有了自己的絕活與創作,但是代表父親表演時,是不能夠表現的。

特徵

1、子類以父類的身份出現
2、子類在工作時以自己的方式來實現
3、子類以父類的身份出現時,子類特有的屬性和方法不可以使用
4、不同的對象可以執行相同的動作,但要通過它們自己的實現代碼來執行
5、當方法被調用時,無論對象是否被轉換爲其父類,都只有位於對象繼承鏈最末端的方法實現會被調用

方法的重寫

來源於多態中,子類將父類實現替換爲它自己的實現,這就是方法重寫 Override。

抽象類

由來

技術來源於生活,貓,狗,猴子,魚等的特徵都可以從“動物”這個名詞來進行概括,那麼動物本身它是否存在呢?我們如何把它應用於程序呢?這時就產生了抽象類。

定義

抽象類通常代表一個抽象概念,它提供一個繼承的出發點,當設計一個新的抽象類時,一定是用來繼承的。

特點

1、抽象類不能實例化
2、抽象方法是必須被子類重寫的方法
3、如果類中包含抽象方法,那麼類就必須定義爲抽象類,不論是否還包含其他一般方法

接口

由來

技術來源於生活,如何描述機器貓叮噹,石猴孫悟空,豬八戒,蜘蛛人,蝙蝠俠等的共性呢?於是接口就產生了

特點

1、接口是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合,一旦實現了接口,類就可以支持接口所指定的所有屬性和成員。
2、一個類可以支持多個接口,多個類也可以支持相同的接口。

接口 VS 抽象

表象來說

1、抽象類可以給出一些成員的實現,接口卻不包含成員的實現
2、抽象類的抽象成員可以被子類部分實現,接口的成員需要實現類的完全實現
3、一個類只能繼承一個抽象類,但可以實現多個接口

從形態上

1、類是對對象的抽象,抽象類是對類的抽象,接口是對行爲的抽象
2、如果行爲跨越不同類的對象,可使用接口;對於一些相似的類對象,用繼承抽象類

從設計角度上

1、抽象類是從子類中發現了公共的東西,泛化出父類(一般存在於重構)
2、接口根本不知道子類的存在,方法如何實現還不確認,預先定義
3、抽象類是自底而上抽象出來的,而接口則是自頂向下設計出來的

泛型

泛型的由來

我們在使用ArrayList集合裝值類型數據時:
相對於簡單的賦值而言,裝箱和拆箱過程需要進行大量的計算。對值類型進行裝箱時,必須分配並構造一個全新的對象。
其次,拆箱所需的強制轉換也需要進行大量的計算。裝箱與拆箱時耗費資源和時間的。
更優的解決方案:泛型出現了

定義

泛型是具有佔位符(類型參數)的類、結構、接口和方法,這些佔位符是類、結構、接口和方法所存儲或使用的一個或多個類型的佔位符。

泛型集合 VS 非泛型集合

通常情況下,都建議使用泛型集合,因爲這樣可以獲得類型安全的直接優點而不需要從 “基集合類型”派生並實現類型特定的成員。此外,如果集合元素爲值類型,泛型集合類型的性能通常優於對應的非泛型集合類型,因爲使用泛型時不必對元素進行裝箱。

結語:
編程之路不易,且行且珍惜。

發佈了240 篇原創文章 · 獲贊 91 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章