如何給女朋友解釋什麼是面向對象編程?

2021-01-09 中科院物理所

周末午後,我正在愉快的打著遊戲。女朋友拿著一本《面向對象編程》過來找我。

什麼是面向對象?是要面向我寫代碼嗎?

不是啦,這個面向對象的對象不是你這個對象啦。

此時,我突然感受到了一股莫名的殺氣。

什麼?你還有其他對象嗎?有我好看嗎?有我瘦嗎?不對。你不能有其他對象。

什麼是面向對象?

面向對象,英文名字叫Object Oriented,是一種軟體開發方法。是和面向過程相對應的。

別給我拽英文。給我詳細說說,說不明白今天就沒完。

我有點餓了,要不然你給我做點飯,我慢慢的詳細給你講吧。

我現在就想聽你給我講,咱們直接點外賣吧,別自己動手做飯了。

其實,對於吃飯這件事兒,就可以分為面向過程吃飯和面向對象吃飯。自己親自下廚就是面向過程,點外賣就是面向對象。

在面向過程的吃飯中,我們想要填飽肚子,需要自己親自下廚把這頓飯做出來,那麼,我們就需要先想好吃什麼、然後去買菜、洗菜、洗米、蒸飯、炒菜等等一系列的事情。

pubic void 做飯{制定菜單;買菜;洗菜;洗米;蒸飯;炒菜;}那麼,你說和點外賣相比,自己做飯有哪些缺點啊?

那還用說,麻煩唄。

的確,面向過程編程也一樣,由於想要完成做飯這件事,需要自己定義很多個方法。除此之外,還有很多遇到很多其他問題,比如:

我不想吃米飯,我想吃饅頭。

上次買的菜家裡面還有,不需要去買菜。

中午吃剩下的菜家裡面還有,直接熱一熱就可以吃了。

這次去的一家超市提供洗菜服務,不需要我們自己洗菜了。

以上這些突發事件,在編程中就叫做需求變更或者新的需求,這種事情發生是必然會發生的。

那麼,有新的需求了怎麼辦,上面這種自己動手做飯的場景,就只能重新拼湊咯。

對於程式設計師來說,就需要通讀代碼,找出可以復用的方法,然後重新調用,不能復用的就重新寫一個。時間久了,方法就會越來越多,系統維護越來越複雜。

面向對象,其實就是我們通過點外賣的方式來「做飯」。我們知道我們需要一頓飯,我們只需要打開外賣軟體,在裡面選擇我們需要的菜品然後下單就可以了。我們不關心飯店做飯的過程。想吃什麼點什麼,家裡來人了就再下一個訂單,不想吃米飯了,想吃饅頭了,也可以給飯店打電話,讓他們把米飯換成饅頭。

外賣軟體.點餐(紅燒肉,糖醋魚,可樂一瓶).送達時間(一小時後).備註(可樂加冰)所以,通過面向對象的方式「做飯」,就像上面的代碼一樣。

哦,我明白了,面向對象就是把本來可能需要自己做的事情交給別人來做?對於我來說,外賣軟體就是個對象,我再面向他「做飯」,其實是他幫我做的。

額、你說的也對,也不對。在這個場景中,確實可以把外賣軟體當做是「對象」。其實,在面向對象編程中,拋棄了函數,想要實現一個功能不再是通過函數的疊加調用實現的了。而是通過對象。

對象就是對事物的一種抽象描述。現實世界中的事物,都可以用「數據」和「能力」來描述。

比如我要描述一個人,「數據」就是他的年齡、性別、身高體重,「能力」就是他能做什麼工作,承擔什麼樣的責任。

描述一個外賣軟體,「數據」就是他包含的菜品,而「能力」就是他可以點菜。

什麼是封裝?

我們把「數據」和「能力」組合成一個對象的過程就叫做「封裝」。

封裝的結果就是可以有一個類,通過這個類我們可以獲得一個對象。然後我們就可以通過給這個對象下命令,讓他執行自己的「能力」。

除了把「數據」和「能力」封裝成一個「對象」更加方便使用以外,還有啥其他的特點麼?

封裝只是面向對象的第一步,目的是把現實世界的東西抽象成對象。面向對象真正有威力的地方是「繼承」和「多態」。

舉一個不是很恰當,但是女朋友比較容易理解的例子。

我們使用外賣軟體點餐,當我們第二次去某一家店時,外賣軟體會提示你上一次你在這家點了什麼,你可以點擊<再來一單>把上次的菜品直接加到購物車中,這就是「繼承」。而在購物車中的物品你可以直接付款下單,也可以把增刪和修改菜品。這就是「多態」。

什麼是繼承?

在面向對象編程中,當兩個類具有相同的特徵(屬性)和行為(方法)時,可以將相同的部分抽取出來放到一個類中作為父類,其它兩個類「繼承」這個父類。繼承後子類自動擁有了父類的部分屬性和方法。

通過繼承創建的新類稱為「子類」或「派生類」。

被繼承的類稱為「基類」、「父類」或「超類」。

比如:

狗{吠;}牧羊犬 繼承 狗{放羊;}上面的例子中,狗類是父類,牧羊犬類是子類。牧羊犬類通過繼承獲得狗類的吠的能力,同時增加了自己獨有的放羊的能力。

什麼是多態?

同一操作,作用於不同的對象,可以產生不同的結果,這就是「多態」。通常說的多態都是指運行期的多態,也叫動態綁定。

要實現多態,需要滿足三個條件:

有類繼承或接口實現、子類重寫父類的方法、父類引用指向子類的對象。比如:

犬科動物{吠;}狗 繼承 犬科動物{吠{旺旺旺}}狼 繼承 犬科動物{吠{嗷嗷嗷}}狗和狼都是犬科動物,拉來一直犬科動物,如果它你叫的話,你可能沒辦法直接分辨出他到底是狼還是狗。只要他真正的叫出來的時候,你才知道。這就是運行時多態。

有人說,你自己定義的對象,定義的時候不就知道到底是什麼類的對象了麼,這個其實並不決定的,很多時候我們可能不知道,原因是,對象可能並不是我們自己創建出來的。

奧,那我終於知道什麼是面向對象編程了。

嗯,對了,外賣點好了麼?

呃....

(全文完)

來源:漫話編程

漫話編程

讓編程變得有樂趣

5. WiFi穿牆完全指南

6. 為什麼你吃的食物跟廣告上的永遠不一樣?

7. 你知道愛因斯坦人生中發表的第一篇論文是什麼嗎?

8. 出生在顯赫世家是怎樣的體驗?

9. 理論物理學家費紙,實驗物理學家費電,理論實驗物理學家費?

10. 這些東西,看過的人都轉瘋了!

相關焦點

  • 什麼是面向過程和面向對象編程
    一張圖帶你看懂什麼是面向過程和面向對象編程兩種思想的對比:面向過程是具體的東西,而且面向過程是面向對象的基礎。比如開汽車去某個地方,你就需要先有個汽車而且你需要會開車,而汽車有開車,加減速和剎車等功能,關於汽車的操作每一個都需要一個具體的過程來實現總結來說就是,面向過程是一種基礎的方法,它考慮的是實際的實現。一般情況下,面向過程是自頂向下逐步求精,其最重要的是模塊化的思想方法。因此在模塊化編程的時候才會有「低耦合,高內聚」的思想來提高效率。
  • Python面向對象編程的基本概念
    九道門商業數據分析學院提供介紹在學習面向對象的編程時。我決定深入了解它的歷史,結果令人著迷。術語「面向對象程序設計」(OOP)是艾倫·凱(Alan Kay)在1966年讀研究生時提出的。名為Simula的語言是第一種具有面向對象編程功能的程式語言。它是在1967年開發的,用於製作仿真程序,其中最重要的信息稱為對象。
  • 面向對象編程的興衰
    面向對象編程(OOP)並沒有消亡。但與過去相比,它確實沒有那麼普及了。在 90 年代時,有很多面向對象編程相關的教科書和計算機科學課程。它就是「流行趨勢」。然而,隨著時間的流逝,人們開始意識到,嚴格的面向對象方法會帶來很多問題。這些問題往往會使代碼更複雜、更難以理解且更難以測試。
  • 一句話概述面向對象思想,徹底理解面向對象編程
    面向對象是把一組數據結構和處理他們的方法組成對象,把具有相同行為的對象歸納成類,通過封裝隱藏類的內部細節,通過繼承使類得到泛化,通過多態實現基於對象類型的動態分派。之前在面試Java的時候遇到關於面向對象的問題,好久沒複習,概念都忘了,當時沒能回答完整。今天整理了一下,徹底搞懂了什麼叫面向對象,下面用通俗的話詳細講解面向對象的相關概念。
  • 面向對象編程從小白到王者系列-認識對象
    在學習面向對象程式語言時很多人都是被什麼是對象這個神一樣的概念給打敗的。被打敗後從此就開始過得渾渾噩噩了,聽課學習時都是迷迷糊糊地,開始變得像聽天書一樣,從而興趣一落千丈,慢慢被「程序猿」給淘汰。在所有的教材中或是教程中都是把一個很簡單對對象解釋搞得特別高大上。
  • 什麼是面向對象,如何理解它?
    面向對象簡稱是OOP,是目前主流的編程思想,可能許多讀者並不了解,希望能通過下面的講解能讓大家了解什麼是面向對象。JavaScript本身也是面向對象的程式語言,對於動態網頁行為的編程,只要稍微對它有了解就可以的。
  • 經典:面向對象編程,我的思想(上部)
    學編程學的是什麼?思想!精通一門程式語言(最好是面向對象的語言)後再去搞其他的程式語言,你會發現過程是如此的行雲流水!為什麼?你已經把編程的思想掌握了,再去學其他的,無非是學習一種新的語法格式了。我在這裡並不是和你討論怎麼去用C++或JAVA,也不是和你討論怎麼去學他們,我要和你討論的是怎麼去理解面向對象。
  • 面向對象編程會被拋棄嗎?這五大問題不容忽視
    儘管這個想法很巧妙,但直到 1981 年,面向對象編程才成為主流。在那之後,它就沒有停止過吸引新的和經驗豐富的軟體開發者。面向對象的程式設計師市場一如既往地忙碌。但是在最近幾年中,這種已有幾十年歷史的編程範式受到越來越多的批評。難道是在面向對象編程大行其道 40 年之後,技術已經超越了這種範式?
  • 什麼是面向對象,有什麼特點
    在程式語言中,面向對象的使用是非常重要的,在PHP語言中也是用了很多年才獲得這項技術。面向對象的出現是系統開發中一個偉大的改革,程式語言開始從應用程式回到數據上。面向對象將編程過程中焦點轉向建模的真是實體上,讓應用程式更加接近現實世界。下面小編為大家主要介紹面向對象。
  • 聊聊面向對象編程的幾個基本原則
    進行面向對象編程,有下面幾個原則:一. 面向抽象原則二. 開閉原則三. 多用組合少用繼承原則四. 高內聚-低耦合原則下面首先先介紹抽象類和接口,然後介紹面向抽象編程。watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFucGk0NjQ4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)面向抽象所謂面向抽象編程,是指當設計一個類時,不讓該類面向具體的類,而是面向抽象類或者接口,即所設計類中的重要數據是抽象類或接口聲明的變量
  • 圖說Java中的OOPs(面向對象編程系統)基本概念
    面向對象編程是一種編程概念,其核心思想是允許用戶創建所需要的對象,然後提供處理這些對象的方法,使用者通過操作對象而獲得運算數據。本文將以簡潔的方式對面向對象編程中的概念進行梳理。1. Class(類)你可以將類理解為對一組相似實體的統稱。
  • 如何以面向對象的思想設計有限狀態機
    面向對象法設計狀態機面向對象基本概念以面向對象的思想實現的狀態機,大量涉及了對於函數指針的用法,必須對這個概念比較熟悉上述所提到了兩個設計方法都是基於面向過程的一種設計思想,面向過程編程(POP)是一種以過程為中心的編程思想,以正在發生的事件為主要目標,指導開發者利用算法作為基本構建塊構建複雜系統。
  • 面向對象編程從小白到王者系列-04編程裡神奇的變量
    我們在前面已經通過自己的動手來搞定了一個個關卡,現在我們遇到的是編程當中一個讓人難以理解的知識點變量。變量這個名詞一下子聽到以後可能不太容易理解,那接下來我們就一起理解一下。變量中的意思就是其存儲的內容是隨著程序運行的時候在發生變化的,就像所料帶裡裝什麼東西是根據你的需要來定是一個道理,在需要存儲用戶輸入的時候變量的值就是用戶輸入的內容了。變量也想剛才我們說到的就像所料帶一樣也有很多類型,裝垃圾的被稱為垃圾袋、裝水果的被稱為食品袋、裝水的被稱為密封袋等等。那麼程序中的變量是如何分類的呢?
  • 新書速遞:周立功教授心血新力作《面向AMetal框架與接口的編程(上)》
    經過近二十年持之以恆的研究與分析,周立功教授對如何實現軟體代碼的復用和跨平臺、實現開發者夢寐以求的奮鬥目標,進行了大膽的推測,提出了核心域與非核心域的概念,而對於人與人之間思維差異為企業與個人發展帶來的影響,給出了終極解決之道!
  • 雲計算開發學習筆記:Python3 面向對象技術簡介
    來源:TechWeb.com.cnPython從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對象是很容易的。本章節我們將詳細介紹Python的面向對象編程。如果你以前沒有接觸過面向對象的程式語言,那你可能需要先了解一些面向對象語言的一些基本特徵,在頭腦裡頭形成一個基本的面向對象的概念,這樣有助於你更容易的學習Python的面向對象編程。接下來我們先來簡單的了解下面向對象的一些基本特徵。面向對象技術簡介① 類(Class): 用來描述具有相同的屬性和方法的對象的集合。
  • 嘿,你對象在這兒——Java 面向對象編程:類和對象
    等到我們學面向對象的時候不得不去了解一下什麼是類,什麼是對象,他倆是啥關係。關於面向對象,網上那個寫得很好的例子已經被我抄到C語言與Java的區別那篇了,感興趣的小夥伴可以點左上角的菜單去查看。那麼類和對象到底是什麼呢?類就是有某些共同特徵的實體的集合;對象就是類的實例,一個對象當然就是一個類的實例。
  • 「c 技術」第7章 面向對象的程序設計
    本章要點: 面向對象的基本概念 類的定義與對象的聲明 構造函數和析構函數 類的靜態成員和實例成員 方法重載及運算符重載的編程實現 類的繼承與多態性的編程實現 類的屬性的實現7.1 循序漸進學理論7.1.1 面向對象程序設計概述1.面向對象程序設計的由來
  • Objeck v5.6.1 發布,面向對象程序設計語言
    Objeck 是一種受 Java 啟發,同時受 Scheme 和 UML 影響的面向對象程序設計語言。Objeck 特性為快速,易於使用,輕巧且跨平臺。Objeck 把所有的數據類型都當成是對象,包含一個編譯器和虛擬機,具有內存管理和 JIT 編譯器。
  • 少兒編程課程為什麼學習Python 有什麼優勢?-七考網
    Python是強制用一種面向對象的解釋型電腦程式設計語言,它是純粹的自由軟體, 原始碼和解釋器CPython遵循 GPL(GNU General Public License)協議。由荷蘭人Guido van Rossum於1989年發明,第一個公開發行版發行於1991年。
  • 假如女人是一種程式語言 - OSCHINA - 中文開源技術交流社區
    假如女人是一種程式語言,也許每個男人心中都有自己最喜歡的那一個吧?我認為女人可分兩類,「面向過程」和「面向對象」。「面向對象」的女人以尋找終身伴侶為目標,而「面向過程」的,則以經歷難以忘懷的愛情時光為己任。各位程序猿當然也要按需選擇最適合自己的「程式語言」,不要因為時髦而盲目追求「面向對象「,有時候過程可能比結果更重要。