第5章繼承和多態(tài)_第1頁(yè)
第5章繼承和多態(tài)_第2頁(yè)
第5章繼承和多態(tài)_第3頁(yè)
第5章繼承和多態(tài)_第4頁(yè)
第5章繼承和多態(tài)_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第5章章 繼承與多態(tài)繼承與多態(tài)學(xué)習(xí)導(dǎo)讀學(xué)習(xí)導(dǎo)讀n本章討論面向?qū)ο蟮木幊蹋∣OP)及其關(guān)鍵技術(shù):繼承和多態(tài)。n繼承性是軟件復(fù)用的一種形式,對(duì)降低軟件復(fù)雜性行之有效。繼承性同時(shí)是面向?qū)ο蟪绦蛟O(shè)計(jì)語言的特點(diǎn),采用對(duì)象但沒有繼承性的語言是基于對(duì)象的語言,但不是面向?qū)ο蟮恼Z言,這是兩者的區(qū)別。n多態(tài)性允許以統(tǒng)一的風(fēng)格處理已存在的變量及相關(guān)的類,使增加系統(tǒng)中新功能變得容易。課程結(jié)構(gòu)課程結(jié)構(gòu)n5.1 繼承繼承n5.2 抽象類抽象類n5.3 接口接口n5.4 多態(tài)性多態(tài)性5.1 繼承繼承n繼承繼承繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)語言的最主要的特繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)語言的最主要的特點(diǎn),是其他語言(如面向過程語言)

2、所沒有的。點(diǎn),是其他語言(如面向過程語言)所沒有的。 類之間的繼承關(guān)系是現(xiàn)實(shí)世界中遺傳關(guān)系的直類之間的繼承關(guān)系是現(xiàn)實(shí)世界中遺傳關(guān)系的直接模擬,它表示類之間的內(nèi)在聯(lián)系以及對(duì)屬性接模擬,它表示類之間的內(nèi)在聯(lián)系以及對(duì)屬性和操作的共享,即子類可以沿用父類(被繼承和操作的共享,即子類可以沿用父類(被繼承類)的某些特征。當(dāng)然,子類也可以具有自己類)的某些特征。當(dāng)然,子類也可以具有自己獨(dú)立的屬性和操作。獨(dú)立的屬性和操作。5.1 繼承繼承n1.1.繼承定義繼承定義 繼承性是軟件復(fù)用的一種形式。新類由已存在的類生成,通過保留它們的屬性和行為,并且根據(jù)新類的要求對(duì)性能加以修改,添加新的屬性和行為。5.1 繼承繼承

3、如果子類只從一個(gè)父類繼承,則稱為單繼承;如果子類從一個(gè)以上父類繼承,則稱為多繼承。注意 Java不支持多重繼承,但它支持“接口”概念。接口使Java獲得了多重繼承的許多優(yōu)點(diǎn),摒棄了相應(yīng)的缺點(diǎn)。圖圖5-1 單繼承和多繼承示意單繼承和多繼承示意5.1 繼承繼承n2.繼承的實(shí)現(xiàn)繼承的實(shí)現(xiàn)Java語言中是通過關(guān)鍵字語言中是通過關(guān)鍵字extends來實(shí)現(xiàn)單繼承的。簡(jiǎn)單來實(shí)現(xiàn)單繼承的。簡(jiǎn)單的實(shí)現(xiàn)格式如下:的實(shí)現(xiàn)格式如下:class 子類名子類名 extends 父類名父類名類體類體注意注意: 如果在格式中沒有通過如果在格式中沒有通過extends關(guān)鍵字來標(biāo)明父類名,關(guān)鍵字來標(biāo)明父類名,這并不是意味著該類無

4、父類,這并不是意味著該類無父類,相反,它表示該類是相反,它表示該類是java.lang.Object的子類。的子類。子類從父類繼承有兩個(gè)主要的方面:(1)屬性的繼承。例如,公司是一個(gè)父類,一個(gè)公司有名稱、地址、經(jīng)理、雇員等,這些都屬于結(jié)構(gòu)方面。(2)方法的繼承。一個(gè)父類定義了若干操作,如一個(gè)公司要有項(xiàng)目、利潤(rùn)、任命經(jīng)理、錄用職工等操作,子公司也將繼承這些行為。5.1 繼承繼承n例例5.1 類繼承的示例。類繼承的示例。定義一個(gè)定義一個(gè)BaseClass類和類和DerivedClass類,其中類,其中BaseClass是是DerivedClass的父類的父類.程序清單見程序清單見BaseClass

5、.java和和DerivedClass.java.運(yùn)行結(jié)果如運(yùn)行結(jié)果如圖圖5-1圖圖5-15.2 抽象類抽象類n在現(xiàn)實(shí)生活中,可以發(fā)現(xiàn)這樣的現(xiàn)象:許多實(shí)在現(xiàn)實(shí)生活中,可以發(fā)現(xiàn)這樣的現(xiàn)象:許多實(shí)物抽象出成為一個(gè)共同的類別,如物抽象出成為一個(gè)共同的類別,如“交通工交通工具具”,但是,但是“交通工具交通工具”并直接對(duì)應(yīng)著實(shí)際存并直接對(duì)應(yīng)著實(shí)際存在的類別如卡車、自行車、三輪車等。在的類別如卡車、自行車、三輪車等。 “交通交通工具工具”等只是作為一個(gè)抽象概念存在,對(duì)一組等只是作為一個(gè)抽象概念存在,對(duì)一組固定實(shí)現(xiàn)的抽象描述,并不對(duì)應(yīng)具體的概念。固定實(shí)現(xiàn)的抽象描述,并不對(duì)應(yīng)具體的概念。因此,在面向?qū)ο蟪绦蛟O(shè)

6、計(jì)中,可以將這些抽因此,在面向?qū)ο蟪绦蛟O(shè)計(jì)中,可以將這些抽象描述定義為抽象類,而這一組任意個(gè)可能的象描述定義為抽象類,而這一組任意個(gè)可能的具體實(shí)現(xiàn)則表現(xiàn)為所有可能的派生類。具體實(shí)現(xiàn)則表現(xiàn)為所有可能的派生類。n由于抽象類對(duì)一組具體實(shí)現(xiàn)的抽象性描述,所由于抽象類對(duì)一組具體實(shí)現(xiàn)的抽象性描述,所以抽象體是不能修改的。通常抽象類不具備實(shí)以抽象體是不能修改的。通常抽象類不具備實(shí)際功能,只用來派生子類。際功能,只用來派生子類。5.2 抽象類抽象類n1.抽象方法抽象方法Java語言中,用關(guān)鍵字語言中,用關(guān)鍵字abstract修飾的方法為抽象方法。語法修飾的方法為抽象方法。語法格式形如:格式形如:abstrac

7、t 返回值類型返回值類型 方法名(方法名(形式參數(shù)形式參數(shù)););抽象方法只有方法頭沒有方法體,即只提供方法的規(guī)格說明,抽象方法只有方法頭沒有方法體,即只提供方法的規(guī)格說明,沒有具體的實(shí)現(xiàn)。沒有具體的實(shí)現(xiàn)。注意注意: 1)final關(guān)鍵字不能修飾抽象方法。這是因?yàn)殛P(guān)鍵字不能修飾抽象方法。這是因?yàn)閒inal是不可是不可修改的方法是最終的方法,而抽象方法沒有方法體,能被修改的方法是最終的方法,而抽象方法沒有方法體,能被派生類進(jìn)行覆蓋;派生類進(jìn)行覆蓋; 2)static是不能修飾抽象方法的。靜態(tài)方法占據(jù)固定內(nèi)存是不能修飾抽象方法的。靜態(tài)方法占據(jù)固定內(nèi)存空間,而抽象方法根本就不可能運(yùn)行,不會(huì)加載到內(nèi)存

8、中。空間,而抽象方法根本就不可能運(yùn)行,不會(huì)加載到內(nèi)存中。所以,所以,static關(guān)鍵字不能修飾抽象方法。關(guān)鍵字不能修飾抽象方法。5.2 抽象類抽象類n2.抽象類抽象類是用關(guān)鍵字抽象類是用關(guān)鍵字abstract修飾的類為抽象類。語修飾的類為抽象類。語法格式形如:法格式形如:abstract class 抽象類名抽象類名 類體類體5.2 抽象類抽象類注意注意: 抽象類只是具體實(shí)體的抽象描述,是不可以實(shí)例化對(duì)象。 盡管抽象類定義構(gòu)造方法是沒有語法錯(cuò)誤,但是沒有實(shí)際意義。抽象類中可以定義非抽象方法,也可以定義抽象方法。 抽象方法在它的派生子類中可以覆蓋,來實(shí)現(xiàn)具體功能。 抽象類派生出的子類,必須對(duì)抽象

9、類中的抽象方法重寫。 5.2 抽象類抽象類例:一個(gè)抽象類的例子定義一個(gè)抽象類例:一個(gè)抽象類的例子定義一個(gè)抽象類AbstractClassExample以及該類的子類以及該類的子類DerivedAbstractClass,程序清單分別見,程序清單分別見AbstractClassExample.java和和DerivedAbstractClass.java程序的運(yùn)行結(jié)果見圖程序的運(yùn)行結(jié)果見圖5-2.圖圖5-25.3 接口接口nJava語言不支持多繼承,但是在有的情況下需要使用多繼承。 nJava語言可以通過接口概念,一方面實(shí)現(xiàn)多繼承,同時(shí)避免“二義性問題”的產(chǎn)生,另一方面為Java語言在支持單繼承

10、機(jī)制的前提下實(shí)現(xiàn)多態(tài)提供了方便。 n從編程的角度看,Java語言定義的接口實(shí)際上是一組抽象方法和常量的集合,為其他類提供運(yùn)算的外部說明。接口為一個(gè)或多個(gè)類提供一個(gè)行為規(guī)范,具體的實(shí)現(xiàn)在這些類中完成,這些類之間并不存在層次關(guān)系。通過接口可以了解對(duì)象的實(shí)例方法的原型,而不需要了解這些方法的具體實(shí)現(xiàn)。接口的存在有效解決了如何實(shí)現(xiàn)多繼承,同時(shí)避免了由于多繼承產(chǎn)生的“二義性問題”。 5.3 接口接口n1.接口的格式定義Java語言中,接口是通過關(guān)鍵字語言中,接口是通過關(guān)鍵字interface來實(shí)現(xiàn)定義的,具體來實(shí)現(xiàn)定義的,具體格式如下:格式如下:public interface 接口名接口名 exten

11、ds 父接口名表父接口名表 接口體接口體接口名的定義規(guī)則同類名的規(guī)則。接口可以有繼承關(guān)系,通接口名的定義規(guī)則同類名的規(guī)則。接口可以有繼承關(guān)系,通過關(guān)鍵字過關(guān)鍵字extends實(shí)現(xiàn)繼承。接口體中定義的是方法和常量。實(shí)現(xiàn)繼承。接口體中定義的是方法和常量。接口體中定義的所有方法不管是否用來顯式的定義為公共的接口體中定義的所有方法不管是否用來顯式的定義為公共的抽象性質(zhì)(抽象性質(zhì)(public abstract),還是缺省性質(zhì)定義,所有方法),還是缺省性質(zhì)定義,所有方法隱含為公共的(隱含為公共的(public)和抽象()和抽象(abstract)的,方法體為空。)的,方法體為空。接口體中定義的常量格式如

12、下:接口體中定義的常量格式如下:final static數(shù)據(jù)類型數(shù)據(jù)類型 常量標(biāo)識(shí)符常量標(biāo)識(shí)符=常量值;常量值; 5.3 接口接口n2.接口的實(shí)現(xiàn)Java語言中通過關(guān)鍵字語言中通過關(guān)鍵字implements來實(shí)現(xiàn)接口,來實(shí)現(xiàn)接口,具體的實(shí)現(xiàn)是通過類來完成的。接口實(shí)現(xiàn)的具體具體的實(shí)現(xiàn)是通過類來完成的。接口實(shí)現(xiàn)的具體格式如下:格式如下:class 類名類名 implements 接口名表接口名表 類體類體n 接口的定義類似于抽象類,但是它的實(shí)現(xiàn)接口的定義類似于抽象類,但是它的實(shí)現(xiàn)是依賴于類,不是通過繼承來實(shí)現(xiàn)的。在實(shí)是依賴于類,不是通過繼承來實(shí)現(xiàn)的。在實(shí)現(xiàn)的類中,對(duì)接口中定義的所有方法進(jìn)行覆現(xiàn)的類

13、中,對(duì)接口中定義的所有方法進(jìn)行覆蓋蓋. 5.3 接口接口例:一個(gè)應(yīng)用接口的例子定義一個(gè)接口例:一個(gè)應(yīng)用接口的例子定義一個(gè)接口ShapeInterface和實(shí)現(xiàn)該接口的一個(gè)圓和實(shí)現(xiàn)該接口的一個(gè)圓Circle類類, ,程序清單分別見程序清單分別見ShapeInterface.java和和Circle.java程序的運(yùn)行結(jié)果見圖程序的運(yùn)行結(jié)果見圖5-3.圖圖5-35.3 接口接口n3.接口和抽象類之間的區(qū)別接口和抽象類之間的區(qū)別接口不能實(shí)現(xiàn)任何的方法,而抽象類可以。類可以實(shí)現(xiàn)多個(gè)接口,但只有一個(gè)父類。接口不是類分級(jí)結(jié)構(gòu)的一部分。而沒有聯(lián)系的類可以實(shí)現(xiàn)相同的接口。繼承是“is a”關(guān)系,接口是“l(fā)ik

14、e a”關(guān)系抽象類可以修改,接口修改有困難。5.4 多態(tài)性多態(tài)性多態(tài)(Polymorphism)即程序中同名的不同方法共存的情況,常見的兩種多態(tài)方式為: 子類對(duì)父類方法的覆蓋; 利用重載在同一個(gè)類中定義多個(gè)同名的不同方法。在運(yùn)行時(shí)自動(dòng)選擇正確的方法進(jìn)行調(diào)用稱作動(dòng)態(tài)綁定(dynamic binding)。在編譯時(shí)可以選擇正確的方法進(jìn)行調(diào)用稱作靜態(tài)綁定(static binding)5.4 多態(tài)性多態(tài)性1.動(dòng)態(tài)綁定理解調(diào)用一個(gè)對(duì)象方法的機(jī)制是非常重要的。下面具體介紹:假設(shè)調(diào)用x.f(參數(shù));(1)編譯器檢查對(duì)象的聲明類型和方法名。(2)接著,編譯器檢查方法調(diào)用中的參數(shù)類型。如果在所有的叫做f的方法

15、中有一個(gè)其參數(shù)類型同調(diào)用提供的參數(shù)類型最匹配,那么該方法就會(huì)被選擇調(diào)用。這個(gè)過程稱作重載選擇。5.4 多態(tài)性多態(tài)性(3)如果方法是private、static、final或者是構(gòu)造器,編譯器可以確定調(diào)用的方法,這種方法是靜態(tài)調(diào)用。 與之對(duì)應(yīng),調(diào)用方法將依賴于隱式參數(shù)的實(shí)際類型,并且在運(yùn)行時(shí)動(dòng)態(tài)綁定。(4)當(dāng)程序運(yùn)行并且使用動(dòng)態(tài)綁定來調(diào)用一個(gè)方法時(shí),那么虛擬機(jī)必須調(diào)用同x所指向的對(duì)象的實(shí)際類型相匹配的方法版本。5.4 多態(tài)性多態(tài)性n2.方法的重載方法的重載重載(Overloading)實(shí)質(zhì)上就是在一個(gè)類內(nèi)用一個(gè)標(biāo)識(shí)符定義不同的方法或符號(hào)運(yùn)算的方法名或符號(hào)名。Java語言中支持符號(hào)的重載,如前提及

16、的運(yùn)算符“+”。不過不過JavaJava語言中不支持用戶自定義的語言中不支持用戶自定義的符號(hào)重載符號(hào)重載,可以支持用戶定義方法的重載可以支持用戶定義方法的重載。方法的重載具體可以理解為,同一個(gè)方法名對(duì)應(yīng)不同的方法定義。這些方法的格式說明中的參數(shù)不同,即,具體涉及到參數(shù)的類型、參數(shù)的個(gè)數(shù)是有所不同的。重載的例:定義一個(gè)計(jì)數(shù)器可以實(shí)現(xiàn)求數(shù)的絕對(duì)值運(yùn)算見程序清單Counter.java 5.4 多態(tài)性多態(tài)性n3.方法的覆蓋和隱藏方法的覆蓋(Overriding)實(shí)質(zhì)是指子類具有重新定義父類成員方法的能力。這種重新定義表示子類定義的方法具有和父類的方法同名稱、同參數(shù)類型、同參數(shù)個(gè)數(shù)、以及同返回值。方法

17、格式定義盡管相同,但具有不同的方法體,實(shí)現(xiàn)的內(nèi)容根據(jù)程序員的要求而有所不同。子類的方法覆蓋父類的同名方法。這意味著,子類對(duì)象的實(shí)例方法調(diào)用只會(huì)調(diào)用子類中定義的方法,而不是父類中同格式說明的方法。如果子類的方法覆蓋父類的靜態(tài)方法,則父類的方法在子類中隱藏起來了 .5.4 多態(tài)性多態(tài)性重載覆蓋重載方法補(bǔ)充彼此覆蓋方法替代它已覆蓋的方法重載方法參數(shù)表中可有不同類型的參數(shù)覆蓋方法的參數(shù)表必須有相同類型相同順序的參數(shù)重載方法的返回值可以不同覆蓋方法的返回值必須相同重載方法實(shí)際上是不同的方法,可以拋出不同的異常覆蓋方法拋出原方法中能拋出的已檢查的異常表表5-重載和覆蓋的比較5.4 多態(tài)性多態(tài)性n4.數(shù)據(jù)成

18、員的隱藏?cái)?shù)據(jù)成員的隱藏父類的數(shù)據(jù)成員可以在子類中隱藏,只要子類中定義了同名的數(shù)據(jù)成員。即使數(shù)據(jù)成員的類型不同,也視為父類的數(shù)據(jù)成員被隱藏了。5.4 多態(tài)性多態(tài)性nsuper關(guān)鍵字關(guān)鍵字super關(guān)鍵字表示對(duì)類的父類的引用。在子類中有關(guān)鍵字表示對(duì)類的父類的引用。在子類中有時(shí)會(huì)使用父類的數(shù)據(jù)和方法,這時(shí)就可以利用時(shí)會(huì)使用父類的數(shù)據(jù)和方法,這時(shí)就可以利用super關(guān)鍵字來實(shí)現(xiàn)對(duì)父類的引用。關(guān)鍵字來實(shí)現(xiàn)對(duì)父類的引用。super關(guān)鍵字不關(guān)鍵字不是一個(gè)對(duì)象的引用,而是調(diào)用父類的成員特有的關(guān)是一個(gè)對(duì)象的引用,而是調(diào)用父類的成員特有的關(guān)鍵字。鍵字。super關(guān)鍵字主要應(yīng)用在兩個(gè)方面:關(guān)鍵字主要應(yīng)用在兩個(gè)方面:

19、 1)應(yīng)用于引用父類的構(gòu)造方法;)應(yīng)用于引用父類的構(gòu)造方法; 2)應(yīng)用于引用父類中被子類覆蓋的成員方法和)應(yīng)用于引用父類中被子類覆蓋的成員方法和隱藏?cái)?shù)據(jù)成員。隱藏?cái)?shù)據(jù)成員。 5.4 多態(tài)性多態(tài)性n5.運(yùn)行多態(tài)性的實(shí)現(xiàn)運(yùn)行多態(tài)性的實(shí)現(xiàn)利用繼承機(jī)制實(shí)現(xiàn)多態(tài)性利用接口實(shí)現(xiàn)多態(tài)性5.4 多態(tài)性多態(tài)性n(1)利用繼承機(jī)制實(shí)現(xiàn)多態(tài)性利用繼承機(jī)制實(shí)現(xiàn)多態(tài)性對(duì)于數(shù)據(jù)來說,繼承是否為正確的設(shè)計(jì)可以用一個(gè)簡(jiǎn)單的規(guī)則來判斷。“is-a”規(guī)則表明子類的每一個(gè)對(duì)象都是一個(gè)超類的對(duì)象。例如,每一個(gè)經(jīng)理是一個(gè)員工。然而,只有經(jīng)理類是員工類的子類才是有意義的。很明顯,反過來就不行了并不是每個(gè)員工都是經(jīng)理。 還有一個(gè)明確敘述“

20、is-a”規(guī)則的方法是替代原則。該原則規(guī)定無論何時(shí),如果程序需要一個(gè)超類對(duì)象,都可以用一個(gè)子類對(duì)象來代替5.4 多態(tài)性多態(tài)性例:定義一個(gè)抽象類例:定義一個(gè)抽象類ParentClass和該類的子類和該類的子類ChildClass,以及定義一個(gè)測(cè)試類,以及定義一個(gè)測(cè)試類Test它們的程它們的程序請(qǐng)單見序請(qǐng)單見ParentClass.java,ChildClass.java和和Test.java運(yùn)行結(jié)果見圖運(yùn)行結(jié)果見圖5-4思考:在程序思考:在程序Test.java中,觀察語句中,觀察語句“ParentClass cc=new ChildClass(); ”,思考對(duì)象,思考對(duì)象cc每次調(diào)用每次調(diào)用showMessage()方法各是哪個(gè)類的方法方法各是哪個(gè)類的方法?圖圖5-35.4 多態(tài)性多態(tài)性n(2).利用接口實(shí)現(xiàn)多態(tài)性利用接口實(shí)現(xiàn)多態(tài)性接口的靈活性就在于“規(guī)定一個(gè)類必須做什么,而不管你如何做”。我們可以定義一個(gè)接口類型的引用變量來引用實(shí)現(xiàn)接口的類的實(shí)例,當(dāng)這個(gè)引用調(diào)用方法時(shí),它會(huì)根據(jù)實(shí)際引用的類的實(shí)例來判斷具體調(diào)用哪個(gè)方法,這和上述利用父類的對(duì)象引用訪問子類對(duì)象的機(jī)制相似。5.4 多態(tài)性多態(tài)性例:定義一個(gè)接口例:定義一個(gè)接口Wor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論