1. 程式人生 > >面向對象的三大特征——全網最詳解析

面向對象的三大特征——全網最詳解析

格式 父類 turn rac 類比 set 子類 多種實現 類的方法

面向對象的三大特征——封裝性、繼承性、多態性

類的封裝性

  封裝是將數據以及對數據的操作組合起來構成類,類是一個不可分割的獨立單位。類中提供與外部聯系的方法,又盡可能隱藏類的實現細

節。

  封裝性提供一種軟件模塊化的設計思想,像組裝硬件一樣。類的設計者提供標準化的軟件模塊,使用者根據實際需求選擇所需要的類模塊,

集成為軟件系統,各模塊之間通過傳遞參數等方式進行工作。設計者需要考慮類的定義、類中數據和方法的訪問權限以及方法如何實現等問題;

使用者需知道有哪些類,每個類的特點,每個類提供了哪些常量、成員變量和成員方法等,而不需知道方法實現的細節。


  而要實現類的封裝性,我們要先為類及類中成員變量和成員方法分別設置必要的訪問權限,使所有類,子類,同一包中的類,本類等不同

關系的類之間具有不同的訪問權限。Java語言中為類成員設置了4種訪問權限,為類(內部類有3種)設置了兩種訪問權限。

1. 類成員的訪問權限

    Java語言中定義4種權限修飾符來修飾類成員的訪問權限:public(公有)、protected(保護)、默認和private(私有)。

    這4種權限修飾符說明如下:

    ①public:說明該成員可被所有類的對象訪問,public指定的訪問權限最大。

   protected:說明該類成員能被同類中的其他成員、該類的子類成員或同一包中的其他類成員訪問,不能被其他包的非子類成員訪問。protected指定有限的訪問權限範圍,使保護成員在子類和非子類中具有不同的訪問權限,即保護成員可被子類訪問,不能被非子類訪問。

  ③default(默認):當沒有使用訪問權限修飾符聲明成員時,說明該類成員能被同一類中的其他成員訪問或被同一包中的其他類訪問,不能被包之外的其他類訪問。默認權限以包為界劃定訪問權限範圍,使同一包中的類具有訪問權限,其他包中的類則沒有訪問權限。

  ④private:說明該成員只能被同一類中的其他成員訪問,不能被其他類的成員訪問,也不能被子類成員訪問。private指定的訪問權限範圍最小,對其他類隱藏類的成員,防止其他類修改該類的私有成員。

    我們用一個表格來清楚的展示:

    

類成員的訪問權限
權限修飾符 同一類 同一包 不同包的子類 所有類
public
protected
默認
private

      

2. 類的訪問權限(只討論外部類)

類的訪問權限有兩種:public和默認,不能使用其他兩種權限聲明類。

在一個Java源程序文件中可以聲明多個類,但是public修飾的類智能有一個,並且類名需要與文件名相同。

    

 


類的繼承性

  繼承是軟件重用的一種形式,在聲明新類時復用現有類的成員,然後賦予其新的功能,或修改原有的功能,通過繼承,程序員在程序開發已驗證和調試過的高質量軟件,可節省開發時間,也使系統更有可能得到有效的實現。

  1. 繼承的概念

  當程序員創建類時,可以指定新類從現有類中繼承某些成員,而不需要完全從頭開始聲明新的成員。這個現有類稱為超類或父類,新創建類稱為子類。子類也可以成為其他類的超類或父類

  通常子類會添加自己的變量和方法,因此子類比其超類或父類更詳細,表示更為特定的對象,典型的情況是,子類既有父類的功能,又有專門的性能。

  繼承性在父類和子類之間建立起聯系,子類自動擁有父類的全部成員,包括成員變量和成員方法,使父類成員得以傳承和延續;子類可以改父類的成員,使父類成員適應新的需求;子類也可以增加自己的成員,使類的功能得以擴充。但是,子類不能刪除父類的成員!!

  Java語言只支持單重繼承,可以通過接口實現多重繼承。在單重繼承中父類與子類是一對多的關系。一個子類只有一個父類;一個父類可以有多個子類,每個父類又可以作為父類再定義自己的子類。

  2. 繼承原則

    類的繼承包括以下基本原則。

    ①子類繼承父類的所有成員變量,包括實例成員變量和類成員變量。

  ②子類繼承父類除構造方法外的成員方法,包括實例成員方法和類成員方法。因為父類構造方法創建的是父類對象,子類必須創建自己的構造

  方法,創建子類自己的對象

    ③子類不能刪除父類的成員。

    ④子類雖然繼承了父類的私有成員,但子類不能使用父類的私有成員

    ⑤子類可以增加自己的成員變量和成員方法。

    ⑥子類可以重新定義父類成員(方法重寫)。

    3. 子類的聲明

    在Java語言中,子類對父類的繼承是通過extends關鍵字來實現的。語法格式如下:

    [修飾符] class類 [extends 父類] [implements 接口列表]

    其中,extends說明當前聲明的類將要繼承父類的屬性和方法。父類中哪些屬性和方法將被繼承取決於父類對成員的訪問控制:

    ①子類對父類的私有成員沒有訪問權限。

    ②子類對父類的公有成員和保護成員有訪問權限。

  ③子類對默認權限成員分兩種情況,對同一包中的父類的默認權限成員具有訪問權限,而對不同包中父類的默認權限成員則沒有訪問權限。

    4. 子類方法的覆蓋

  在面向對象語言的程序設計中,子類可以改寫從父類中繼承來的某個方法,形成與父類方法同名,解決的問題也相似,但具體實現和功能卻不盡一致的新方法。

    定義與父類完全相同的方法以實現對父類方法的覆蓋是,必須註意以下幾點:

    ①完全相同的方法名。

    ②完全相同的參數列表。

    ③完全相同的返回值類型。

    註意:在滿足上述三個條件的同時,還必須保證訪問權限不能縮小。

    5.super關鍵字

    在子類的方法中,可以使用關鍵字super調用父類成員。super的使用有兩種方法。

    ①調用父類的構造方法

    父類的構造方法不能夠被繼承,但在子類的構造方法體中,可以使用super調用父類的構造方法。語法格式如下:

    super([參數列表]);

    其中,參數列表是父類構造方法的參數列表。

    ②調用父類的同名成員

  子類繼承父類的成員,當子類沒有重定義父類成員時,則不存在同名成員問題。子類的對象訪問的都是父類聲明的成員變量,調用的也都是父類定義的成員方法,所以不需要使用super。

    當子類重定義了父類成員時,則存在同名成員問題。此時,在子類方法體中,成員變量和成員方法均默認為子類的成員變量或成員

  方法。如果需要引用父類的同名成員,則需要使用super引用。在以下兩種同名成員情況下,需要使用super引用。

    1)子類隱藏父類的成員變量

     當子類成員變量隱藏父類的同名成員時,如果需要訪問被子類隱藏的父類的同名成員變量,則需要使用super只帶父類的同名成員變

  量,則需要使用super指代父類的同名成員變量。語法格式如下:

    super.成員變量;

    2)子類覆蓋父類成員方法

    當子類成員方法覆蓋父類同名成員方法時,如果需要調用被子類覆蓋的父類成員方法,則可以使用super調用父類的同名成員方法。

  語法格式如下:

     super.成員方法([參數列表]);


類的多態性

    類的多態性提供了類中的方法設計的靈活性和執行的多樣性。通過多態,就能對“對通用情況進行編程”,而不是“對特定情況編程”。

  多態的特別之處是使程序能夠處理類層次中共享同一父類的對象,就好像他們都是父類的對象一樣。

  多態性的概念

    在面向對象語言中,多態性是指一個方法可以有多種實現版本,即“一種定義,多種實現”。對於一個方法的多種實現,在程序運行

  時,系統會根據方法的參數或調用方法的對象自動選擇一個方法執行,不會產生混淆和混亂。例如,算數運算中不同類型的數據的混合

  運算就是一個典型的多態運用。

    類的多態性表現為方法的多態性,下面主要討論在不同層次的類中以及在同一個類中多個同名方法之間的關系問題。方法的多態性

  主要有方法的重寫和重載。下面進行一個多態小程序舉例:

    

 1 /**
 2  * 聲明打印機類
 3  */
 4 public abstract class Test03_Print {
 5     private String name;
 6 
 7     public String getName() {
 8         return name;
 9     }
10 
11     public void setName(String name) {
12         this.name = name;
13     }
14     
15     public abstract void Print();
16 }

 1 /**
 2  *  聲明黑白打印機類
 3  */
 4 public class Test03_Black extends Test03_Print {
 5 
 6     @Override
 7     public void Print() {
 8         // TODO Auto-generated method stub
 9         super.setName("黑白");
10         System.out.println(super.getName()+"打印機");
11     }
12 
13 }
 1 /**
 2  *  聲明彩色打印機類
 3  */
 4 public class Test03_Color extends Test03_Print {
 5 
 6     @Override
 7     public void Print() {
 8         // TODO Auto-generated method stub
 9         super.setName("彩色");
10         System.out.println(super.getName()+"打印機");
11     }
12 
13 }
 1 /**
 2  * 多態小程序舉例:
 3  * 利用多態性分別進行黑白打印機和彩色打印機的打印
 4  */
 5 public class Test03_Test {
 6 
 7     public static void main(String[] args) {
 8         // TODO Auto-generated method stub
 9         Test03_Print p1 = new Test03_Black();
10         p1.Print();//黑白打印機
11         p1 = new Test03_Color();
12         p1.Print();//彩色打印機
13     }
14 
15 }

  

  

面向對象的三大特征——全網最詳解析