封裝、繼承與多態是面向對象程序設計的三個核心特性。
封裝是面向對象技術中的一個重要概念,是一種信息隱藏技術,它體現了面向對象程序設計的思想。繼承是面向對象程序設計方法的一個重要手段,通過繼承可以更有效地組織程序結構,明確類間的關係,充分利用已有的類來完成更復雜、更深入的程序開發。而多態允許以一種統一的風格處理已存在的變量和相關的類,多態性使得向系統增加功能變得容易。
1、封裝
封裝的含義是:類的設計者把類設計成一個黑匣子,使用者只能看見類中定義的公共變量和公共方法,而看不見方法的具體實現細節,也不能對類中非公共的數據進行操作。這樣可以防止外部的干擾和誤用。
封裝的目的在於將對象的使用者和對象的設計者分開,使用者不必知道行爲實現的細節,只須用設計者提供的接口來訪問對象。同時減少了程序各部分之間的依賴性,降低了程序的複雜性,由於隱藏了其內部信息的細節,使內部信息不易受到破壞,安全性有了保證,同時也爲外界訪問提供了簡單方便的界面。
Ø 封裝的實現
Java定義了4種訪問權限:公有的(public)、保護的(protected)、私有的(private)和默認的。
類成員訪問權限
|
同一個類 |
同一個包 |
不同包中子類 |
其他包 |
public |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
|
默認 |
√ |
√ |
|
|
private |
√ |
|
|
|
2、繼承
繼承是一種由已有類創建新類的機制。利用繼承,我們可以先創建一個共有屬性的一般類,根據該一般類再創建具有特殊屬性的新類。新類繼承一般類的狀態和行爲,並根據需要增加它 自己的狀態和行爲。
從現有類出發定義一個新類,稱爲新類繼承了現有的類,其中被繼承的現有類叫做超類(superclass)或父類,由繼承而得到的類稱爲子類(subclass)。
Ø 成員變量的繼承
子類繼承父類中所有可被子類訪問的成員變量。繼承原則如下:
1. 能夠繼承那些聲明爲public和protected的成員變量。
2. 能夠繼承同一包中的那些默認修飾符的成員變量。
3. 不能繼承那些聲明爲private的成員變量。
4. 如果子類聲明一個與父類成員變量同名的成員變量,則不能繼承父類的成員變量。此
時子類的成員變量稱做隱藏了父類的成員變量。
總之,子類可繼承父類的public、protected和默認修飾變量,不能繼承private變量。反之,如果父類不允許其子類訪問它的某些成員,那麼它必須以private方式聲明該成員。這一點充分體現了類封裝的信息隱蔽原則。
Ø 成員方法的繼承
子類繼承成員方法的規則類似於繼承成員變量的規則:子類繼承父類中所有可被子類訪問的成員方法。繼承規則如下:
1. 能夠繼承那些聲明爲public和protected的成員方法。
2. 能夠繼承同一包中的默認修飾符的成員方法。
3. 不能繼承那些聲明爲private的成員方法。
4. 不能繼承父類的構造方法。
如果子類方法與父類方法同名,則不能繼承。子類方法稱爲覆蓋了父類中的那個方法。
總之,子類可繼承其父類的public、protected和默認修飾方法,不能繼承private方法。子類除了可以繼承父類中的變量及方法,還可以增加自己的成員。當一個父類成員不適合該子類時,子類會重新定義它,如果是重新定義的是成員變量就是隱藏父類的變量,如果是成員方法就是覆蓋父類的方法。
3、多態
多態是指一個名字可具有多種語義。在面嚮對象語言中,多態是在一棵繼承樹中的類中可以有多個同名但不同方法體及不同形參的方法。通常有兩種途徑實現多態:方法的重載和覆蓋。
多態性允許以統一的風格處理已存在的變量及相關的類。多態性使得向系統增加新功能變得容易。繼承性和多態性是降低軟件複雜性的有效技術。
Ø 方法重載時:
v 參數必須不同即參數個數不同,類型也可以不同。 l
v 返回值可以相同,也可以不同。
重載的價值在於它允許通過使用一個普通的方法名來訪問一系列相關的方法。當調用一個方法時具體執行哪一個方法根據調用方法的參數決定,Java運行系統僅執行與調用的參數相匹配的重載方法。儘管Java並沒有規定重載方法之間必須有聯繫,但習慣上,爲了程序的可讀性,最好重載相同含義的方法。
Ø 方法的覆蓋
在前述繼承規則中有一條:子類繼承超類中所有可被子類訪問的成員方法,如果子類方法與超類方法同名,則不能繼承,此時子類的方法稱爲覆蓋(override)了超類中的那個方法。
在進行覆蓋時,應注意以下三點:
v 子類不能覆蓋超類中聲明爲final或static的方法。
v 子類必須覆蓋超類中聲明爲abstract的方法,或者子類也聲明爲abstract。 l
v 子類覆蓋超類中同名方法時,子類方法聲明必須與超類被覆蓋方法的聲明一樣。
方法的覆蓋與類的繼承有密切的關係。覆蓋體現了子類補充或改變超類方法的能力。通過覆蓋使一個方法在不同的子類間表現出不同的行爲。
n 重載與覆蓋的區別
1、方法的覆蓋是子類和父類之間的關係,是垂直關係;方法的重載是同一個類中方法之間的關係,是水平關係。
2、覆蓋只能由一個方法,或只能由一對方法產生關係;方法的重載是多個方法之間的關係。
3、覆蓋要求參數列表相同;重載要求參數列表不同。
4、覆蓋關係中,調用那個方法體,是根據對象的類型(對象對應存儲空間類型)來決定;重載關係,是根據調用時的實參表與形參表來選擇方法體的。