面向對象

面向過程讓計算機有步驟地順序作一件事,是過程化思惟,使用面向過程語言開發大型項目,軟件複用和維護存在很大問題,模塊之間耦合嚴重。面向對象相對面向過程更適合解決規模較大的問題,能夠拆解問題複雜度,對現實事物進行抽象並映射爲開發對象,更接近人的思惟。spa

例如開門這個動做,面向過程是 open(Door door),動賓結構,door 做爲操做對象的參數傳入方法,方法內定義開門的具體步驟。面向對象的方式首先會定義一個類 Door,抽象出門的屬性(如尺寸、顏色)和行爲(如 open 和 close),主謂結構。日誌

面向過程代碼鬆散,強調流程化解決問題。面向對象代碼強調高內聚、低耦合,先抽象模型定義共性行爲,再解決實際問題。對象

對於描述複雜的事物,爲了從宏觀.上把握、從總體上合理分析,咱們須要使用面向對象的思路來分析整個系統。可是,具體到微觀操做,仍然須要面向過程的思路去處理。

三大特性

封裝是對象功能內聚的表現形式,在抽象基礎上決定信息是否公開及公開等級,核心問題是以什麼方式暴漏哪些信息。主要任務是對屬性、數據、敏感行爲實現隱藏,對屬性的訪問和修改必須經過公共接口實現。封裝使對象關係變得簡單,下降了代碼耦合度,方便維護。一般,應禁止直接訪問一個對象中數據的實際表示,而應經過操做接口來訪問,這稱爲信息隱藏繼承

就是對封裝的要求,即 A 模塊使用 B 模塊的某接口行爲,對 B 模塊中除此行爲外的其餘信息知道得應儘量少。不直接對 public 屬性進行讀取和修改而使用 getter/setter 方法是由於假設想在修改屬性時進行權限控制、日誌記錄等操做,在直接訪問屬性的狀況下沒法實現。若是將 public 的屬性和行爲修改成 private 通常依賴模塊都會報錯,所以不知道使用哪一種權限時應優先使用 private。接口

繼承用來擴展一個類,子類可繼承父類的部分屬性和行爲使模塊具備複用性。繼承是"is-a"關係,可以使用判斷是否知足"is-a"關係,即任何父類出現的地方子類均可以出現。若是父類引用直接使用子類引用來代替且能夠正確編譯並執行,輸出結果符合子類場景預期,那麼說明兩個類符合里氏替換原則。ci

多態以封裝和繼承爲基礎,根據運行時對象實際類型使同一行爲具備不一樣表現形式。多態指在編譯層面沒法肯定最終調用的方法體,在運行期由 JVM 動態綁定,調用合適的重寫方法。因爲重載屬於靜態綁定,本質上重載結果是徹底不一樣的方法,所以多態通常專指重寫。開發

多態注意事項:
一、多態是方法的多態,屬性沒有多態
二、父類和子類,有聯繫 類型轉換異常!ClassCastException!
三、存在條件:繼承關係,方法須要重寫,父類引用指向子類對象!Father f1 = new Son();

重載和重寫的區別

重載指方法名稱相同,但參數類型個數不一樣,是行爲水平方向不一樣實現。對編譯器來講,方法名稱和參數列表組成了一個惟一鍵,稱爲方法簽名,JVM 經過方法簽名決定調用哪一種重載方法。無論繼承關係如何複雜,重載在編譯時能夠根據規則知道調用哪一種目標方法,所以屬於靜態綁定get

JVM 在重載方法中選擇合適方法的順序:
① 精確匹配。
② 基本數據類型自動轉換成更大表示範圍。
③ 自動拆箱與裝箱。
④ 子類向上轉型。
⑤ 可變參數。

重寫指子類實現接口或繼承父類時,保持方法簽名徹底相同,實現不一樣方法體,是行爲垂直方向不一樣實現。編譯器

元空間有一個方法表保存方法信息,若是子類重寫了父類的方法,則方法表中的方法引用會指向子類實現。父類引用執行子類方法時沒法調用子類存在而父類不存在的方法。權限控制

 
重寫時須要注意的:
一、方法名必須相同;
二、參數列表必須相同;
三、返回值類型:小於等於父類的方法返回值類型;
四、拋出的異常:範圍,能夠被縮小相同,但不能擴大;
五、修飾符:範圍能夠擴大相同但不能縮小;
這就是所說的重寫方法的兩同兩小一大原則
重寫的緣由:父類的功能,子類不必定須要,或者不必定知足!

類之間的關係

 
類關係 描述  權力強側 舉例
繼承 父子類之間的關係:is-a 父類 小狗繼承於動物
實現 接口和實現類之間的關係:can-do 接口 小狗實現了狗叫接口
組合 比聚合更強的關係:contains-a 總體 頭是身體的一部分
聚合 暫時組裝的關係:has-a 組裝方 小狗和繩子是暫時的聚合關係
依賴 一個類用到另外一個:depends-a 被依賴方 人養小狗,人依賴於小狗
關聯 平等的使用關係:links-a 平等  人使用卡消費,卡能夠提取人的信息
相關文章
相關標籤/搜索