標籤:his 組合 結合 聲明 protect 優點 public 多態 複用
0.緒論
物件導向的三大特性是封裝、繼承和多態。本文以java為例簡述這三個概念在java語言中的具體體現。
首先說明一下,在java中,一個對象就是一個java類的一個執行個體。在一個java類中,包括資料成員和方法成員,其中資料成員又被稱為屬性,方法成員簡稱為方法。
1.封裝
1.1 概念:封裝是指把對象(即java類)的屬性和方法結合成一個獨立的整體,隱藏實現細節,並提供對外訪問的介面(介面是指外部可訪問的資料成員和方法成員)。
1.2 優點/產生原因:
(1)安全性:類使用者只能通過暴露的介面去使用該類的執行個體,避免了類使用者對該類對象的不當操作(eg.使用者不小心修改了對象的某個私人資料成員,導致在調用該對象某個方法時結果與預想結果不一致);
(2)靈活性:在保證暴露的介面不變的情況下,類建立者可以任意修改被隱藏的部分,而不用擔心對類使用者造成影響。
1.3 在java中如何?封裝
封裝的實質是存取控制,其目的是控制類使用者對類中成員(包括資料成員和方法成員)的存取權限。在java中,使用public、private、protected三個關鍵字來進行存取控制。其中,public關鍵字表示緊隨其後的元素對任何人都可用;private關鍵字表示除類型建立者和類型的內部方法之外的任何人都不能訪問;protected關鍵字表示除類型建立者、類型的內部方法和繼承類(即子類)外的任何人都不能訪問。
在沒有使用這三個關鍵字的情形下,java預設的存取權限是包存取權限,即某個類的成員可以被與該類處在同一個包中的其他類訪問。(包,就是檔案目錄或者檔案夾的意思。)
注意點:public、private和protected是java中的訪問限制詞,不僅可以用於修飾資料成員、方法成員,可以用於修飾class、interface等。
2.繼承
2.1 概念:繼承是指在已有類的基礎通過修改或者添加其資料成員、方法成員形成一個新的類。
繼承的層次2.1所示,箭頭表示匯出類繼承了基類。已有類被稱為基類或者父類,形成的新類稱為匯出類,也稱子類。
圖2.1 繼承層次UML圖
2.2 子類和基類可能的組合形式:
(1)子類和基類完全一致;(這種形式比較少見,與基類完全一致的子類毫無意義。)
(2)子類和基類對外提供的介面完全相同,但子類重載或重寫(overriding,又稱覆蓋)了基類的某些方法;(關於重載和重寫請閱讀方法重載和重寫--java)
(3)子類在基類對外提供的介面之上新添加了介面;
(4)子類既新添加了介面,又重寫了基類的某些方法((2)和(3)的綜合);
總結:子類可以通過方法重寫或新添加資料成員、方法成員兩種方式來使得自身與基類不同。
2.3 優點/產生原因:代碼複用(可以通過複用基類代碼建立一個與基類類似的類)
2.4 注意點:通過繼承,子類對象既可以看作是子類類型,也可以看作是基類類型。但是,基類對象則只能是基類類型(除非子類與基類完全一樣)。
3.多態
3.1 產生原因:多態與繼承密不可分,本文2.2中提到在繼承中子類與基類產生差異的方法包括重寫基類方法和新添加資料成員、方法成員兩種方式,新添加資料成員和方法成員的方式很自然地擴充了基類。但是,當子類重寫基類方法時,該方法至少有兩個不同的實現,這就帶來了一個問題:程式運行該方法時如何選擇該方法的具體實現?多態,正是為瞭解決這一問題產生的。
3.2 概念:多態,又稱為後期綁定,是指當向對象發送訊息時,被調用的代碼直到運行時才確定。通俗一點說,多態就是指在子類重寫了基類的方法(假定方法名為A)的情形下,在程式中建立一個子類對象並聲明該物件類型是基類類型,調用該對象的A方法會執行子類的A方法,而不是基類中的A方法。
多態執行個體:在下面的代碼中,在同一目錄下建立了三個java檔案:Base.java,Sub.java和Test.java。其中,Base.java中建立了Base類,Base類中只有一個方法A;Sub.java通過繼承Base類建立了Sub類,並在Sub類中重寫了Base類的A方法;最後,在Test.java中的main方法中建立了一個Sub對象eg,並且eg被聲明為Base類型。調用對象eg的A方法,通過輸出結果,可以看出java編譯器在運行時執行的是Sub類中的A方法,而不是Base類中的A方法。這正是多態的體現。
1 //Base.java:基類 2 public class Base{ 3 public void A(){System.out.println("This is Base Class.");)} 4 } 5 6 //Sub.java:子類 7 public class Sub extends Base{ 8 public void A(){System.out.println("This is Sub Class.");} 9 }10 11 //Test.java:多態測試12 public class Test{13 public static void main(String[] args){14 Base eg = new Sub();15 eg.A();16 } 17 }
//輸出結果
This is Sub Class.
4.總結
繼承和多態是由java編譯器保證的,程式開發人員只需要理解其思想並按指定規則(通過extends實現繼承,通過方法重寫和重載實現多態)去做即可,而封裝則需要程式開發人員去完整實現。
封裝、繼承、多態--java