JavaSE基礎學習-OOP(面向對象程序設計)

初識Java

Java是一門高級的面向對象的編程語言。
Java的設計者已經編寫了Java的白皮書用來解釋設計初衷,並且發佈了一個簡短摘要,主要包括以下11個方面。

  • 簡單性
  • 面向對象
  • 分佈式
  • 健壯性
  • 安全性
  • 體系結構中立
  • 可移植性
  • 解釋性
  • 高性能
  • 多線程
  • 動態性

以上11個方面這裏就不一一解釋了,有興趣的可以去參考《JAVA核心技術》一書,這本書對學習JAVA還是很有幫助的。

(小腦洞:爲什麼Java這麼流行?)

  • Java通過JVM實現的"一處編寫,到處執行"的特性。
  • JVM提供垃圾回收器,大多數情況下程序員不需要考慮內存的分配和回收。
  • Java龐大的生態,有許多已經成熟的開源軟件。
  • Java客戶端開發領域的應用場景 - Android開發。
  • Java一直在發展和進化。

什麼是面向對象?什麼是對象?

因爲這篇文章是我Java學習的第一篇文章,所以就在文章開頭介紹了一下Java語言,現在讓我們回到這篇文章的主要內容,什麼是面向對象。
從我們接觸到Java語言開始,就有人告訴我們,這是一門面向對象的編程語言,想要了解什麼是面向對象,要先了解一下兩個基本概念,類和對象。

什麼是對象?什麼是類?

先來一段百度百科,對象,常有兩層意思,指行動或思考時作爲目標的事物或特指戀愛的對方等含義。
後半段我們不考慮,我們只看前半段,對象指行動或思考時作爲目標的事物。
這是什麼意思,我們來舉個例子,我們找一個木匠做把椅子,在這個例子中,木匠就可以看成一個對象;做了把椅子,這是木匠的行動,這稱爲對象的行爲。但這之中隱藏了一個東西,那就是做椅子的工具,這是木匠自帶的,我們稱爲對象的屬性。
從上面的例子可以看出,一個客觀存在的事物可以稱爲對象,一架飛機,一臺電腦,甚至一陣風等等,都可以稱爲對象,而且對象往往具有一些自己特定的屬性和行爲。
我們知道了什麼是對象之後,我們再來引出類的定義,類是具有相同屬性和方法的一組對象的集合,知道這個概念之後再看上面這個例子,這時,木匠嚴格上已經不算是一個對象了,
因爲他是一個職業,我們並沒有精確到特定的人,所以這個例子要改成我們找王木匠做把椅子,我們姑且認爲這個王木匠是唯一的,這時,他就成爲了一個對象,而木匠就是他的類。
類是具有相同屬性和方法的一組對象的集合。類是不存在的,類僅僅用來描述對象的信息,比如我們把帶着工具能做椅子的人稱爲木匠,木匠就成爲了這一系列人的總稱和描述。

類和對象的關係

根據上面的例子我們可以總結出類和對象的關係好像模具和鑄件的關係,類實例化的結果就是對象,而對象的抽象就是類。
這個回答比較教科書,我們還是看例子,上面的王木匠,他是屬於木匠類的一個具體的對象,我們稱他爲木匠類的一個實例,一個類轉變成具體的對象(實例)的過程,我們稱爲實例化。
那什麼是類的抽象呢,我們上面對木匠這個類的定義是,帶着工具能做椅子的人就是木匠,其中,所有的木匠(對象)都有工具(屬性),他們都會做椅子(行爲),這種把一系列對象相同的屬性和行爲抽取出來的過程,我們稱爲對象的抽象。
看到這裏有人說了,例子裏不止一個類,木匠,工具,椅子,甚至椅子的形狀都可以看成一個類,這也是Java裏常說的一句話了,叫"萬物皆對象",任何存在的事物,我們都可以把他看成對象,從而向上抽象出它的類。

什麼是面向對象?

我們已經瞭解了什麼是對象,什麼是類,現在我們開始聊面向對象。
首先,面向對象(Object Oriented),與之對應的是之前的面向過程。
繼續舉例子,我想要一把椅子,這是我的目的,也就是我的需求。面向過程,顧名思義,我要考慮完成需求的所有過程,從選木材,找工具,鋸木頭等等一系列操作都要自己考慮,自己去做。
而面向對象呢,我有了需求之後,先去找有沒有可以完成需求的對象,我找到了木匠,我告訴木匠我想要一把椅子,之後我就等着椅子做好就行了,我不用去考慮椅子是怎麼做出來的等一系列面向過程需要考慮的事情。
當然了,如果我們沒有找到可以完成自己需求的對象,那我們就要重新面向過程了,這就是傳說中的自己造輪子。當然了,大家也不要重複造輪子,如果有現成的工具的話,
自然是要拿來用的,別人的輪子我們可以拿來學習他的編程思想,或者這個輪子我們有別的需求需要改一下,我們可以對它進行二次加工,但是如果造一個功能完全一樣的輪子,那是完全沒有必要的。(這就是開源的好處,如果輪子全都閉源的話,我們不僅沒的學,還沒的改,人人都要自己造)
面向對象就是可以使程序員可以將重點放在需求上,而不是實現需求的過程,邏輯上的操作止步於對象,而不是對象背後的實現過程。

面向對象和麪向過程的區別(或者面向對象的好處)?

  • 當需求發生改變時,面向對象可以直接操作對象做對應的修改即可,面向過程則需要重新規劃。
  • 面向過程是流程化的,需要一步一步分析實現;面向對象是模型化的,把對象模型成盒子,盒子具有什麼功能,需要什麼直接調用即可。
  • 其實面向對象底層仍然使用的面向過程,通過面向過程抽象成類,然後封裝起來,就變成了面向對象。

面向對象的三大基本特徵

封裝

將對象的屬性和行爲隱藏起來,僅提供公共的訪問方式,提高可複用性和安全性。
(將對象形成黑盒,對外暴露功能,而不暴露功能實現)

繼承

將多個類相同的屬性和方法抽取出來形成一個父類,提高代碼複用性。
(例子:喜鵲是一種鳥,鳥類和喜鵲類便是一個繼承關係,鳥類是父類,喜鵲類是子類)
(前面講到了不要重複造輪子,多個類有相同內容時會出現大量重複代碼,爲了避免所以出現繼承。提示:繼承破壞了封裝)

多態

父類或接口的引用變量可以指向子類或實現類的實例對象。
(例子:樹上有一隻喜鵲,我可以說成樹上有隻鳥,但不能反過來說)
(顧名思議,一個對象的多種狀態。)

面向對象的五大原則

  • 單一職責原則SRP(Single Responsibility Principle)
    類的功能要單一。不能廚師的工作寫到木匠類裏。
  • 開放封閉原則OCP(Open-Close Principle)
    一個模塊對於拓展是開放的,對於修改是封閉的。
  • 裏式替換原則LSP(the Liskov Substitution Principle LSP)
    子類可以替換父類出現在父類能夠出現的任何地方。比如你代替你父親在家裏做家務。
  • 依賴倒置原則DIP(the Dependency Inversion Principle DIP)
    高層次的模塊不應該依賴於低層次的模塊,他們都應該依賴於抽象。抽象不應該依賴於具體實現,具體實現應該依賴於抽象。比如你出國,你應該說你是中國人,而不是XX市,XX縣人,國與國之間應該依賴於國模塊,而不是子模塊市縣。
  • 接口分離原則ISP(the Interface Segregation Principle ISP)
    設計時採用多個與特定客戶類有關的接口比採用一個通用的接口要好。就比如一個對象有多個功能,多個功能分開多個接口比一個接口好。

還是第一次寫這麼長的博客,文筆上還略顯生澀,寫出來的也都是我目前的理解,我會根據大家的評論或者自己以後的深入進行修改,希望大家有自己的理解或者文章哪裏有瑕疵可以評論告訴我,我會第一時間修改的,謝謝,希望和大家一起成長。

重巒疊嶂,慶幸相逢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章