你真的理解面向對象嗎?

面向對象

我們常見的編程范式有命令式編程函數式編程邏輯式編程,而面向對象編程是一種命令式編程。

命令式編程是面向計算機硬件的一種抽象,有變量(存儲單元),賦值語句(獲取存儲指令),表達式(內存引用和算術運算)和控制語句(跳轉指令),命令式程序就是對一個馮諾依曼機的指令序列的抽象,面向對象是對我們現實世界模型的一個抽象,之后在映射到馮諾依曼機的指令序列。

面向對象的基本特性

如果只是用變量,賦值語句,表達式,控制語句去構建現實世界模型的話會非常困難,所以面向對象的出現的根本原因就是為了解決這個問題。

面向對象讓我們從指令代碼操作變量轉變為通過指令操作對象。 當我們理解了這個以后再去看面向對象的兩個特征:

抽象
封裝

首先抽象就是建立一個對現實模型。

封裝就是將變量,賦值語句,表達式,控制語句進行組合來描述上面的現實模型,并且將他們“打包”,看成一個原子結構,之后的程序邏輯都是圍繞著這個原子結構進行的。

其實面向對象的編程就是將原來的 ”模式一“ 改變為 ”模式二”

模式一:程序 = (賦值語句+表達式+控制語句)+ 變量

模式二:程序 = 對象 + 對象(對象之間的調用)

面向對象的高級特性

對象之間的關聯關系

抽象,封裝只是對現實模型和馮諾依曼機之間基本的映射關系,而現實世界中模型與模型之間還存在很多關系,如繼承、組合、依賴等。

而維護這些關系也成為面向對象語言的一個特性,并且有相應的語法支持。

1.繼承is-a組合:一個類繼承具有相似功能的另一個類,根據需要在所繼承的類基礎上進行擴展。
優點: 具有共同屬性和方法的類可以將共享信息抽象到父類中,增強代碼復用性,同時也是多態的基礎。
缺點: 子類中擴展的部分對父類不可見,另外如果共性比較少的時候使用繼承會增加冗余代碼。

2.組合has-a組合:has-a組合是在一個類中引用另一個類作為其成員變量。
優點: 可擴展性和靈活性高。在對象組合關系中應優先考慮has-a組合關系。
缺點: 具有共性的類之間看不到派生關系。

多態

多態在代碼復用中起著尤為重要的作用,假如對象A依賴對象B,如果有對象C繼承對象B,則說明對象C包含對象B(對象C的信息要多于對象B),所以當對象C向上轉型為對象B時不會出現信息的丟失,也就是說這種轉型是安全的。所以大部分靜態編程語言都支持向上轉型。當程序依賴對象B和程序依賴對象C(對象B的子類)時會有不同的表現,這就是多態。

public class A {
    public void fun(B b){
        b.fun();
    }
}

public class B {
    public void fun(){
        System.out.println("我是b");
    }
}

public class C extends B{
    //重載
    public void fun(){
        System.out.println("我是c");
    }
}

public class Test {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        C c = new C();
        a.fun ( b );
        a.fun ( c );
    }
}
-------------------------------------------------
Output:
我是b
我是c

以上是最簡單的多態的例子,通過上面例子很難發現多態的好處,這樣做的意義是什么?

觀察上面的代碼會發現,A的fun()方法參數為B,但是如果傳遞別的類型可不可以?答案是可以的,因為上面的代碼中我們傳遞了B的子類C,如果有D、E、F....都繼承B的話,也都可以傳遞到A的fun()中,所以起到了復用的作用。

但是還是體現不出來多態的好處,傳遞必須要繼承這個類,不符合現實模型,比如A是播放叫聲的裝置,B是斑點狗,所以將B傳遞進去時會播放斑點狗的叫聲,而C要是繼承B,在現實生活世界模型中,C也是斑點狗才行。

那如果我想播放牧羊犬的叫聲怎么辦?用抽象類就可以。如果B是抽象類的話,抽象的是狗,所以C可以任何狗,因為B中的所有東西都是抽象的,沒有任何描述狗細節的東西,所以可以是任何狗。

最后還是發現不完善,那如果我要播放貓叫聲怎么辦?這時候會有個比抽象類還抽象的東西,那就是接口,一個超級有用的家伙,有了他就可以完全和現實世界模型對應起來了,因為接口抽象的是行為,所以當B為接口時,規定B有叫聲方法,所以當A的fun方法中傳遞的B接口時,就可以理解為,只要傳遞實現叫聲方法的就可以,無論什么。所以當貓實現這個接口后,就可以被放到聲音播放器當中,同樣馬、豬、牛都可以,只要他們實現叫聲接口就行,但是樹可以吧?不可以,因為現實世界中的樹不可以叫。所以接口只抽象行為,完全可以實現現實模型的和面向對象的映射。

所以抽象程度從小到大分別為類>抽象類>接口。

  1. 當B為類時,A只能接收B子類。
  2. 當B為抽象類時,A能接收符合這個抽象的具體。
  3. 當B為接口時,A能接收實現B接口的任何東西,在當前上下文中就是有叫聲的任何東西。

所以當B為普通類時,A就是一個 斑點狗叫聲播放器。當B為抽象類時,A就為一個 狗的叫聲播放器。而當B為接口時,A就是一個 叫聲播放器,可以播放任何聲音,這就是多態的意義。

一個斑點狗播放器和一個可以播放任何聲音的播放器不存在那個更好,要根據實際的場景進行判斷,一個作用域小一個作用域大。

其實在框架中或者“造輪子的人”用接口的比較多,而“用輪子的人”用普通類比較多,所以當閱讀源碼發現各種接口時不要疑惑,那是多數是為了讓代碼通用、作用域大。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容