0.緒論 html
面向對象的三大特性是封裝、繼承和多態。本文將以java爲例簡單闡述一下這三個概念。java
首先說明一下,在java中,對象是指一個java類的一個實例。java類中的成員包括數據成員和方法成員,其中數據成員又被稱爲屬性,方法成員簡稱爲方法。安全
1.封裝htm
1.1 概念:封裝是指把對象(即java類)的屬性和方法結合成一個獨立的總體,隱藏實現細節,並提供對外訪問的接口(接口是指外部可訪問的數據成員和方法成員)。對象
1.2 優勢/產生緣由:blog
(1)安全性:類使用者只能經過暴露的接口去使用該類的實例,避免了類使用者對該類對象的不當操做(eg.使用者不當心修改了對象的某個私有數據成員,致使在調用該對象某個方法時結果與預想結果不一致);繼承
(2)靈活性:在保證暴露的接口不變的狀況下,類建立者能夠任意修改被隱藏的部分,而不用擔憂對類使用者形成影響。接口
1.3 在java中如何實現封裝開發
封裝的實質是訪問控制,其目的是控制類使用者對類中成員(包括數據成員和方法成員)的訪問權限。在java中,java開發者使用public、private、protected三個關鍵字來聲明訪問控制。其中,public關鍵字表示緊隨其後的元素對任何人均可用;private關鍵字表示除類型建立者和類型的內部方法以外的任何人都不能訪問;protected關鍵字表示除類型建立者、類型的內部方法和繼承類(即子類)外的任何人都不能訪問。get
在沒有使用這三個關鍵字的情形下,java默認的訪問權限是包訪問權限,即某個類的成員能夠被與該類處在同一個包中的其餘類訪問。(包,就是文件目錄或者文件夾的意思。)
總結:java開發者經過public、private、protected三個關鍵字來聲明訪問控制,若是沒有就採用java提供的默認訪問權限(即包訪問權限),而後java編譯器或者虛擬機負責解析public、private、protected關鍵字並實現訪問控制功能,從而實現封裝。
注意點:public、private和protected是java中的訪問限制詞,不只能夠用於修飾數據成員、方法成員,能夠用於修飾class、interface等。
2.繼承
2.1 概念:繼承是指在已有類的基礎經過修改或者添加其數據成員、方法成員造成一個新的類。
繼承的層次如圖2.1所示,箭頭表示導出類繼承了基類。已有類被稱爲基類或者父類,造成的新類稱爲導出類,也稱子類。
圖2.1 繼承層次UML圖
2.2 子類和基類可能的組合形式:
(1)子類和基類徹底一致;(這種形式比較少見,與基類徹底一致的子類毫無心義。)
(2)子類和基類對外提供的接口徹底相同,但子類重寫(overriding,又稱覆蓋)了基類的某些方法;(關於重寫請閱讀方法重載和重寫--java)
(3)子類在基類對外提供的接口之上新添加了接口(多是重載了基類方法,也多是新添加了方法和數據成員);(關於重載請閱讀方法重載和重寫--java)
(4)子類既新添加了接口,又重寫了基類的某些方法((2)和(3)的綜合);
總結:子類能夠經過方法重寫或新添加接口兩種方式來使得自身與基類不一樣。
2.3 優勢/產生緣由:代碼複用(能夠經過複用基類代碼建立一個與基類相似的類)
2.4 在java中如何實現繼承:java開發者經過extends關鍵字聲明繼承關係,而後java編譯器或者虛擬機負責解析extends關鍵字並實現繼承功能。
2.5 注意點:
(1)經過繼承,子類對象既能夠看做是子類類型,也能夠看做是基類類型。可是,基類對象則只能是基類類型(除非子類與基類徹底同樣);
(2)java語言採用單根繼承機構,即java中全部的類最終都繼承自單一的基類(Object類);
(3)一個類只能經過extends關鍵字聲明一個基類。當沒有顯示聲明時,該類的直接基類是Object類,即一個類只有一個直接基類;
(4)java中繼承關係是能夠傳遞的,即:若是A是B的子類且B是C的子類,那麼A也是C的子類。
3.多態
3.1 產生緣由:多態與繼承密不可分,本文2.2中提到在繼承中子類與基類產生差別的方法包括重寫基類方法和新添加接口兩種方式,新添加接口的方式很天然地擴展了基類。可是,當子類重寫了基類方法後,帶來了這樣一個問題:因爲繼承以後子類對象也能夠看做是基類類型,對於一個聲明爲基類類型的子類對象,在調用該對象的重寫方法時咱們每每指望運行重寫後的方法,而不是基類中的方法。可是在java編譯器看來,該對象是基類類型,所以執行基類中的方法是毋庸置疑的。那麼,如何使得在調用該對象的重寫方法時達到咱們指望的效果呢?多態能夠幫助咱們達到這個效果,這也就是多態產生的緣由和意義。
3.2 概念:多態,又稱爲後期綁定,是指當向對象發送消息時,被調用的代碼直到運行時才肯定。通俗一點說,多態就是指當一個方法的返回值類型、方法名和參數(參數個數、參數類型和參數順序)相同時,針對不一樣的對象調用該方法時執行對應類中的實現版本。
3.3 在java中如何實現多態:由java虛擬機提供支持,不須要開發者考慮
4.總結
封裝須要java開發者經過public、protected、private關鍵字實現(若是沒有這些關鍵字,就由java默認的包訪問權限實現),繼承須要java開發者經過extends實現,而多態無需開發者作任何操做,是java虛擬機提供的機制,用於支持繼承中的方法重寫能正確運行。
特別注意:多態是依賴於繼承存在的,若是不須要繼承,就不須要多態。更具體地講,若是不須要繼承中的方法重寫,就不須要多態。