面向過程讓計算機有步驟地順序作一件事,是過程化思惟,使用面向過程語言開發大型項目,軟件複用和維護存在很大問題,模塊之間耦合嚴重。面向對象相對面向過程更適合解決規模較大的問題,能夠拆解問題複雜度,對現實事物進行抽象並映射爲開發對象,更接近人的思惟。spa
例如開門這個動做,面向過程是 open(Door door),動賓結構,door 做爲操做對象的參數傳入方法,方法內定義開門的具體步驟。面向對象的方式首先會定義一個類 Door,抽象出門的屬性(如尺寸、顏色)和行爲(如 open 和 close),主謂結構。日誌
面向過程代碼鬆散,強調流程化解決問題。面向對象代碼強調高內聚、低耦合,先抽象模型定義共性行爲,再解決實際問題。對象
封裝是對象功能內聚的表現形式,在抽象基礎上決定信息是否公開及公開等級,核心問題是以什麼方式暴漏哪些信息。主要任務是對屬性、數據、敏感行爲實現隱藏,對屬性的訪問和修改必須經過公共接口實現。封裝使對象關係變得簡單,下降了代碼耦合度,方便維護。一般,應禁止直接訪問一個對象中數據的實際表示,而應經過操做接口來訪問,這稱爲信息隱藏。繼承
迪米特原則就是對封裝的要求,即 A 模塊使用 B 模塊的某接口行爲,對 B 模塊中除此行爲外的其餘信息知道得應儘量少。不直接對 public 屬性進行讀取和修改而使用 getter/setter 方法是由於假設想在修改屬性時進行權限控制、日誌記錄等操做,在直接訪問屬性的狀況下沒法實現。若是將 public 的屬性和行爲修改成 private 通常依賴模塊都會報錯,所以不知道使用哪一種權限時應優先使用 private。接口
繼承用來擴展一個類,子類可繼承父類的部分屬性和行爲使模塊具備複用性。繼承是"is-a"關係,可以使用裏氏替換原則判斷是否知足"is-a"關係,即任何父類出現的地方子類均可以出現。若是父類引用直接使用子類引用來代替且能夠正確編譯並執行,輸出結果符合子類場景預期,那麼說明兩個類符合里氏替換原則。ci
多態以封裝和繼承爲基礎,根據運行時對象實際類型使同一行爲具備不一樣表現形式。多態指在編譯層面沒法肯定最終調用的方法體,在運行期由 JVM 動態綁定,調用合適的重寫方法。因爲重載屬於靜態綁定,本質上重載結果是徹底不一樣的方法,所以多態通常專指重寫。開發
重載指方法名稱相同,但參數類型個數不一樣,是行爲水平方向不一樣實現。對編譯器來講,方法名稱和參數列表組成了一個惟一鍵,稱爲方法簽名,JVM 經過方法簽名決定調用哪一種重載方法。無論繼承關係如何複雜,重載在編譯時能夠根據規則知道調用哪一種目標方法,所以屬於靜態綁定。get
重寫指子類實現接口或繼承父類時,保持方法簽名徹底相同,實現不一樣方法體,是行爲垂直方向不一樣實現。編譯器
元空間有一個方法表保存方法信息,若是子類重寫了父類的方法,則方法表中的方法引用會指向子類實現。父類引用執行子類方法時沒法調用子類存在而父類不存在的方法。權限控制
類關係 | 描述 | 權力強側 | 舉例 |
繼承 | 父子類之間的關係:is-a | 父類 | 小狗繼承於動物 |
實現 | 接口和實現類之間的關係:can-do | 接口 | 小狗實現了狗叫接口 |
組合 | 比聚合更強的關係:contains-a | 總體 | 頭是身體的一部分 |
聚合 | 暫時組裝的關係:has-a | 組裝方 | 小狗和繩子是暫時的聚合關係 |
依賴 | 一個類用到另外一個:depends-a | 被依賴方 | 人養小狗,人依賴於小狗 |
關聯 | 平等的使用關係:links-a | 平等 | 人使用卡消費,卡能夠提取人的信息 |