1. 程式人生 > >封裝、繼承、多態--java

封裝、繼承、多態--java

靈活 一點 stat pla 導出類 導致 his post 基類

0.緒論  

  面向對象的三大特性是封裝、繼承和多態。本文以java為例簡述這三個概念在java語言中的具體體現。

  首先說明一下,在java中,一個對象就是一個java類的一個實例。在一個java類中,包括數據成員和方法成員,其中數據成員又被稱為屬性,方法成員簡稱為方法。

1.封裝

  1.1 概念:封裝是指把對象(即java類)的屬性和方法結合成一個獨立的整體,隱藏實現細節,並提供對外訪問的接口(接口是指外部可訪問的數據成員和方法成員)。

  1.2 優點/產生原因

  (1)安全性:類使用者只能通過暴露的接口去使用該類的實例,避免了類使用者對該類對象的不當操作(eg.使用者不小心修改了對象的某個私有數據成員,導致在調用該對象某個方法時結果與預想結果不一致);

  (2)靈活性:在保證暴露的接口不變的情況下,類創建者可以任意修改被隱藏的部分,而不用擔心對類使用者造成影響。

  1.3 在java中如何實現封裝

  封裝的實質是訪問控制,其目的是控制類使用者對類中成員(包括數據成員和方法成員)的訪問權限。在java中,使用publicprivateprotected三個關鍵字來進行訪問控制。其中,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