《面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程》課件 項(xiàng)目7 認(rèn)識(shí)繼承與多態(tài)_第1頁
《面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程》課件 項(xiàng)目7 認(rèn)識(shí)繼承與多態(tài)_第2頁
《面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程》課件 項(xiàng)目7 認(rèn)識(shí)繼承與多態(tài)_第3頁
《面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程》課件 項(xiàng)目7 認(rèn)識(shí)繼承與多態(tài)_第4頁
《面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程》課件 項(xiàng)目7 認(rèn)識(shí)繼承與多態(tài)_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

面向?qū)ο蟪绦蛟O(shè)計(jì)項(xiàng)目教程本章學(xué)習(xí)目標(biāo):項(xiàng)目7認(rèn)識(shí)繼承與多態(tài)●

了解類與類之間的關(guān)系●

掌握繼承的概念和特點(diǎn)●

掌握方法的重寫和應(yīng)用●

掌握super關(guān)鍵字和final關(guān)鍵字的應(yīng)用●

掌握多態(tài)向上轉(zhuǎn)型的應(yīng)用●

了解引用變量的強(qiáng)制類型轉(zhuǎn)換●

了解內(nèi)部類的概念、分類和

基本應(yīng)用任務(wù)1part了解類之間的關(guān)系

根據(jù)UML(UnifiedModelingLanguage,統(tǒng)一建模語言)規(guī)范,類與類之間存在以下六種關(guān)系。

(1)繼承:一個(gè)類可以繼承另外一個(gè)類,并在此基礎(chǔ)上添加自己的特有功能。繼承也稱為泛化,表現(xiàn)的是一種共性與特性的關(guān)系。

(2)實(shí)現(xiàn):一個(gè)類實(shí)現(xiàn)接口中聲明的方法,其中接口對(duì)方法進(jìn)行聲明,而類完成方法的定義,即實(shí)現(xiàn)具體功能。實(shí)現(xiàn)是類與接口之間常用的關(guān)系,一個(gè)類可以實(shí)現(xiàn)一個(gè)或多個(gè)接口中的方法。

(3)依賴:在一個(gè)類的方法中操作另外一個(gè)類的對(duì)象,這種情況稱為第一個(gè)類依賴于第二個(gè)類。

(4)關(guān)聯(lián):在一個(gè)類中使用另外一個(gè)類的對(duì)象作為該類的成員變量,這種關(guān)系稱為關(guān)聯(lián)關(guān)系。關(guān)聯(lián)關(guān)系體現(xiàn)的是兩個(gè)類之間語義級(jí)別的一種強(qiáng)依賴關(guān)系。

(5)聚合:聚合關(guān)系是關(guān)聯(lián)關(guān)系的一種特例,體現(xiàn)的是整體與部分的關(guān)系,即has-a的關(guān)系。通常表現(xiàn)為一個(gè)類(整體)由多個(gè)其他類的對(duì)象(部分)作為該類的成員變量,此時(shí)整體與部分之間是可以分離的,整體和部分都可以具有各自的生命周期,部分可以屬于多個(gè)整體對(duì)象,與可以為多個(gè)整體對(duì)象共享。

(6)組成:組成關(guān)系也是關(guān)聯(lián)關(guān)系的一種特例,與聚合關(guān)系一樣也是體系整體與部分的關(guān)系,但組成關(guān)系中的整體與部分是不可分離的,即contains-a的關(guān)系,這種關(guān)系比聚合更強(qiáng),也稱為強(qiáng)聚合,當(dāng)整體的生命周期結(jié)束后,部分的生命周期也隨之結(jié)束。

類與類之間的這六種關(guān)系中,繼承和實(shí)現(xiàn)體現(xiàn)了類與類之間的一種縱向關(guān)系,而其余四種則體現(xiàn)了類與類之間的橫向關(guān)系。其中,關(guān)聯(lián)、聚合和組成這三種關(guān)系更多體現(xiàn)的是一種語義上的區(qū)別,而在代碼上則是無法區(qū)分的。類之間關(guān)系概述任務(wù)2part實(shí)現(xiàn)類的繼承性2.1繼承的特點(diǎn)Java的繼承通過extends關(guān)鍵字來實(shí)現(xiàn),實(shí)現(xiàn)繼承的類被稱為子類,有的也稱其為派生類,被繼承的類被稱為父類,有的也稱其為基類或超類。Java里子類繼承父類的聲明格式如下;

【訪問符】【修飾符】class子類名extends父類名{[屬性][方法]}2.1繼承的特點(diǎn)類的繼承性具有如下的特點(diǎn):(1)Java類繼承只支持單繼承。(2)子類能夠繼承父類的非私有成員變量和成員方法,包括類成員變量和類成員方法。(3)子類不能繼承父類的構(gòu)造方法。因?yàn)楦割悩?gòu)造方法創(chuàng)建的是父類對(duì)象,子類必須聲明自己的構(gòu)造方法,創(chuàng)建子類自己的對(duì)象。(4)創(chuàng)建子類對(duì)象時(shí),首先默認(rèn)要執(zhí)行父類不帶參數(shù)的構(gòu)造方法進(jìn)行初始化。(5)子類不能刪除從父類繼承過來的成員。(6)子類可以增加自己的成員變量和成員方法。(7)子類可以重寫繼承自父類的成員變量和成員方法。(8)繼承具有傳遞性。2.2方法的重寫方法的重寫

子類繼承了父類,子類也是一個(gè)特殊的父類。大部分時(shí)候,子類總是以父類為基礎(chǔ),額外增加新的屬性和方法。但有一種情況例外,就是子類需要重寫父類的方法。

這種子類包含與父類同名方法的現(xiàn)象被稱為方法重寫,也被稱為方法覆蓋(Override)??梢哉f子類重寫了父類的方法,也可以說子類覆蓋了父類的方法。2.2方法的重寫

方法的重寫要遵循以下幾點(diǎn)原則:

(1)方法名、返回值類型、參數(shù)列表必須完全相同。

(2)子類方法聲明拋出的異常類應(yīng)該比父類方法聲明拋出的異常類更小或相等。

(3)子類方法的訪問權(quán)限應(yīng)比父類方法的訪問權(quán)限更大或相等。

(4)覆蓋方法和被覆蓋方法要么都是類方法,要么都是實(shí)例方法,不能一個(gè)是類方法一個(gè)是實(shí)例方法。例如,下述代碼將會(huì)引發(fā)編譯錯(cuò)誤。2.3super關(guān)鍵字super是Java提供的一個(gè)關(guān)鍵字,super用于限定該對(duì)象調(diào)用它從父類繼承得到的屬性和方法。正如this一樣,super也不能出現(xiàn)在static修飾的方法中。super關(guān)鍵字代表父類對(duì)象,其主要用途有兩種。一種是在子類的構(gòu)造方法中調(diào)用父類的構(gòu)造方法;另一種是在子類方法中訪問父類的屬性和方法。2.3super關(guān)鍵字1.調(diào)用父類構(gòu)造方法

在Java中,子類不能繼承父類的構(gòu)造方法,但子類構(gòu)造方法里可以通過super調(diào)用父類構(gòu)造方法,執(zhí)行父類構(gòu)造方法里的初始化代碼。super關(guān)鍵字調(diào)用父類構(gòu)造方法的基本語法如下:super(參數(shù)列表);

其中,使用super調(diào)用父類構(gòu)造方法必須放在子類構(gòu)造方法方法體的第一行,所以this調(diào)用和super調(diào)用不會(huì)同時(shí)出現(xiàn)。2.3super關(guān)鍵字子類調(diào)用父類構(gòu)造方法分如下幾種情況。

(1)子類構(gòu)造方法方法體第一行使用super顯示調(diào)用父類構(gòu)造方法,系統(tǒng)將根據(jù)super調(diào)用里傳入的實(shí)參列表調(diào)用父類對(duì)應(yīng)的構(gòu)造方法。

(2)子類構(gòu)造方法方法體的第一行代碼使用this顯示調(diào)用本類中重載的構(gòu)造方法,系統(tǒng)將根據(jù)this調(diào)用里傳入的實(shí)參列表調(diào)用本類中的另一個(gè)構(gòu)造方法。執(zhí)行本類中另一個(gè)構(gòu)造方法時(shí)即會(huì)調(diào)用父類構(gòu)造方法。

(3)子類構(gòu)造方法中既沒有super調(diào)用,也沒有this調(diào)用,系統(tǒng)將會(huì)在執(zhí)行子類構(gòu)造方法之前,隱式調(diào)用父類無參數(shù)的構(gòu)造方法。

2.3super關(guān)鍵字2.調(diào)用父類的屬性和方法

當(dāng)子類定義的屬性與父類的屬性同名時(shí),這樣子類從父類繼承的這個(gè)屬性將被隱藏。如果需要使用父類被隱藏的屬性,可以使用“super.屬性名”格式來引用父類的屬性。當(dāng)子類重寫了父類的方法時(shí),可以使用“super.方法名()”格式來調(diào)用父類的方法。

2.4final關(guān)鍵字final關(guān)鍵字表示“不可改變的,最終的”的意思,可用于修飾類、變量和方法。當(dāng)final關(guān)鍵字修飾變量時(shí),表示該變量一旦被初始化,就不可被改變的量,即常量;當(dāng)final關(guān)鍵字修飾方法時(shí),表示該方法不可被子類重寫,即最終方法;當(dāng)final關(guān)鍵字修飾類時(shí),表示該類不可被子類繼承,即最終類。2.4final關(guān)鍵字1.final成員變量

在Java語法中規(guī)定,final修飾的成員變量必須由程序員顯示地指定初始值。final修飾的類成員變量和實(shí)例成員變量能指定初始值的地方如下:

(1)類成員變量必須在靜態(tài)初始化塊中或聲明該變量時(shí)指定初始值。

(2)實(shí)例成員變量必須在非靜態(tài)初始化塊、聲明該變量時(shí)或構(gòu)造方法中指定初始值。

2.4final關(guān)鍵字2.final方法

使用final修飾的方法不能被子類重寫。如果某些方法完成了關(guān)鍵性的、基礎(chǔ)性的功能,不需要或不允許被子類改變,則可以將這些方法聲明為final的。2.4final關(guān)鍵字3.final類

使用final修飾的類不能被繼承。例如下述代碼所示:finalclassFather{}classSonextendsFather{//錯(cuò)誤,final類不能被繼承}

一個(gè)final類中的所有方法都被默認(rèn)為final的,因此final類中的方法不必顯示聲明為final。其實(shí),Java基礎(chǔ)類庫中的類都是final類,如String、Integer等,都無法被子類繼承。任務(wù)3part實(shí)現(xiàn)類的多態(tài)性

多態(tài)性一般發(fā)生在子類和父類之間,就是同一種事物,由于條件不同,產(chǎn)生了不同的結(jié)果。多態(tài)性分為靜態(tài)性多態(tài)和動(dòng)態(tài)性多態(tài)。Java引用變量有兩個(gè)類型:一個(gè)是編譯的類型,一個(gè)是運(yùn)行時(shí)類型。編譯時(shí)類型由聲明變量時(shí)使用的類型決定,運(yùn)行時(shí)類型由實(shí)際賦給該變量的對(duì)象決定。如果編譯時(shí)類型和運(yùn)行時(shí)類型不一致,則稱為動(dòng)態(tài)性多態(tài)。多態(tài)3.1上轉(zhuǎn)型對(duì)象

所謂上轉(zhuǎn)型對(duì)象就是一個(gè)父類類型的引用變量可以指向其子類的對(duì)象,即將子類對(duì)象賦給一個(gè)父類類型的引用變量。

上轉(zhuǎn)型對(duì)象能夠訪問到父類所有成員變量和父類中沒有被子類重寫的方法,還可以訪問到子類重寫父類的方法,而不能訪問到子類新增加的成員變量和方法。3.2引用變量的強(qiáng)制類型轉(zhuǎn)換

類型轉(zhuǎn)換運(yùn)算符是一對(duì)小括號(hào),類型轉(zhuǎn)換運(yùn)算符的用法是:(type)variable,這種用法可以將variable變量轉(zhuǎn)換成一個(gè)type類型的變量。這種強(qiáng)制類型轉(zhuǎn)換不是萬能的,當(dāng)進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí)需要注意:

(1)基本類型之間的轉(zhuǎn)換只能在數(shù)值類型之間進(jìn)行,這里所說的數(shù)值類型包括整數(shù)型、字符型和浮點(diǎn)型。但數(shù)值類型和布爾類型之間不能進(jìn)行類型轉(zhuǎn)換。

(2)引用類型之間的轉(zhuǎn)換只能在具有繼承關(guān)系的兩個(gè)類型之間進(jìn)行,如果是兩個(gè)沒有任何繼承關(guān)系的類型,則無法進(jìn)行類型轉(zhuǎn)換,否則編譯時(shí)就會(huì)出現(xiàn)錯(cuò)誤。如果試圖把一個(gè)父類實(shí)例轉(zhuǎn)換成子類類型,則這個(gè)對(duì)象必須實(shí)際上是子類實(shí)例才行(即編譯時(shí)類型是父類類型,而運(yùn)行時(shí)類型是子類類型),否則將會(huì)運(yùn)行時(shí)引發(fā)ClassCastException異常。3.3instanceof運(yùn)算符instanceof運(yùn)算符是一個(gè)二目運(yùn)算符,左邊操作數(shù)通常是一個(gè)引用類型的變量,右邊操作數(shù)通常是一個(gè)類(也可以是接口),它用于判斷左邊的對(duì)象是否是后面的類,或者其子類、實(shí)例類的實(shí)例。如果是,則返回true,否則返回false。

在使用instanceof運(yùn)算符時(shí)需要注意:instanceof運(yùn)算符左邊操作數(shù)的編譯時(shí)類型要么與右邊的類相同,要么具有父子繼承關(guān)系,否則會(huì)引起編譯錯(cuò)誤。任務(wù)4part實(shí)現(xiàn)內(nèi)部類的調(diào)用Java語法中,允許在一個(gè)類的類體之內(nèi)再定義一個(gè)類,這個(gè)定義在其他類內(nèi)部的類就被稱為內(nèi)部類(或嵌套類),包含內(nèi)部類的類也被稱為外部類(或宿主類)。內(nèi)部類主要有如下作用。

(1)內(nèi)部類提供了更好的封裝,可以把內(nèi)部類隱藏在外部類之內(nèi),不允許同一個(gè)包的其他類訪問該類。

(2)內(nèi)部類成員可以直接訪問外部類的私有數(shù)據(jù),因?yàn)閮?nèi)部類被當(dāng)成外部類成員,同一個(gè)類的成員之間可以互相訪問。但外部類不能訪問內(nèi)部類的成員。

(3)匿名內(nèi)部類適合用于創(chuàng)建那些僅需要一次使用的類。Java內(nèi)部類主要分為非靜態(tài)內(nèi)部類、局部?jī)?nèi)部類、靜態(tài)內(nèi)部類和匿名內(nèi)部類四種。內(nèi)部類本節(jié)概述4.1非靜態(tài)內(nèi)部類

定義內(nèi)部類非常簡(jiǎn)單,只要把一個(gè)類放在另一個(gè)類內(nèi)部定義即可。此處的“類內(nèi)部”包括類中的任何位置,甚至在方法中也可以定義內(nèi)部類(局部?jī)?nèi)部類)。

大部分時(shí)候,內(nèi)部類都被作為成員內(nèi)部類定義,而不是作為局部?jī)?nèi)部類。成員內(nèi)部類是一種與屬性、成員方法、構(gòu)造方法和初始化語句塊相似的類成員。局部?jī)?nèi)部類和匿名內(nèi)部類則不是類成員。成員內(nèi)部類分為靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類兩種,使用static修飾的成員內(nèi)部類是靜態(tài)內(nèi)部類,沒有使用static修飾的成員內(nèi)部類是非靜態(tài)成員內(nèi)部類。由于內(nèi)部類作為其外部類的成員,所以可以使用任意訪問權(quán)限控制符如private、protected和public等修飾。

4.2局部?jī)?nèi)部類

在方法中定義的內(nèi)部類稱為局部?jī)?nèi)部類。與局部變量類似,局部?jī)?nèi)部類不能用public、private等訪問修飾符和static修飾符進(jìn)行聲明,它的作用域被限定在聲明該類的方法塊中。局部?jī)?nèi)部類的優(yōu)勢(shì)在于:它可以對(duì)外界完全隱藏起來,除了所在的方法之外,對(duì)其他方法而言是不透明的。此外與其他內(nèi)部類比較,局部?jī)?nèi)部類不僅可以訪問包含它的外部類的成員,還可以訪問局部變量,但這些局部變量必須被聲明為final。如果需要用局部?jī)?nèi)部類定義變量、創(chuàng)建實(shí)例或派生子類,那么都只能在局部?jī)?nèi)部類所在的方法內(nèi)進(jìn)行。4.3靜態(tài)內(nèi)部類

如果使用static來修飾一個(gè)內(nèi)部類,則這個(gè)內(nèi)部類就屬于外部類本身,而不屬于外部類的某個(gè)對(duì)象。因此使用static修飾的內(nèi)部類被稱為類內(nèi)部類,也稱為靜態(tài)內(nèi)部類。

靜態(tài)內(nèi)部類可以包含靜態(tài)成員,也可以包含非靜態(tài)成員。靜態(tài)內(nèi)部類是外部類的一個(gè)靜態(tài)成員,因此靜態(tài)內(nèi)部類的成員可以直接訪問外部類的靜態(tài)成員,也可以通過外部類對(duì)象訪問外部類的非靜態(tài)成員;外部類依然不能直接靜態(tài)內(nèi)部類的成員,但可以使用靜態(tài)內(nèi)部類的類名作為調(diào)用者來訪問靜態(tài)內(nèi)部類的類成員,也可以使用靜態(tài)內(nèi)部類對(duì)象作為調(diào)用者來訪問靜態(tài)內(nèi)部類的實(shí)例成員。

4.4匿名內(nèi)部類

匿名內(nèi)部類就是沒有類名的內(nèi)部類,適合創(chuàng)建那種只需要一次使用的類。創(chuàng)建匿名內(nèi)部類時(shí)會(huì)立即創(chuàng)建一個(gè)該類的實(shí)例,這個(gè)類定義立即消失,匿名內(nèi)部類不能重復(fù)使用。定義匿名內(nèi)部類的格式如下:new父類構(gòu)造方法(實(shí)參列表)|實(shí)現(xiàn)接口(){//匿名內(nèi)部類的類體部分}

從上面定義可以看出,匿名內(nèi)部類必須繼承一個(gè)父類,或?qū)崿F(xiàn)一個(gè)接口,但最多只能繼承一個(gè)父類或?qū)崿F(xiàn)一個(gè)接口。4.4匿名內(nèi)部類在使用匿名內(nèi)部類時(shí),要注意遵循以下幾個(gè)原則:(1)匿名內(nèi)部類不能是抽象類,因?yàn)橄到y(tǒng)在創(chuàng)建匿名內(nèi)部類時(shí),會(huì)立即創(chuàng)建匿名內(nèi)部類的對(duì)象。(2)匿名內(nèi)部類不能有構(gòu)造方法,因?yàn)槟涿麅?nèi)部類沒有類名,所以無法定義構(gòu)造方法,但匿名內(nèi)部類可以定義實(shí)例初始化塊,通過實(shí)例初始化塊類完成構(gòu)造方法需要完成的事情。(3)匿名內(nèi)部類不能定義任何靜態(tài)成員、方法和類,但非靜態(tài)的方法、屬性、內(nèi)部類是可以的。(4)只能創(chuàng)建匿名內(nèi)部類的一個(gè)實(shí)例,最常用的創(chuàng)建匿名內(nèi)部類的方式是需要?jiǎng)?chuàng)建某個(gè)接口類型的對(duì)象。(5)一個(gè)匿名內(nèi)部類一定跟在new的后面,創(chuàng)建其實(shí)現(xiàn)的接口或父類的對(duì)象。(6)當(dāng)通過接口來創(chuàng)建匿名內(nèi)部類時(shí),匿名內(nèi)部類也不能顯示創(chuàng)建構(gòu)造方法,因此匿名內(nèi)部類只有一個(gè)隱式的無參數(shù)構(gòu)造方法,故new接口名后的括號(hào)里不能傳入?yún)?shù)值。(7)如果通過繼承父類來創(chuàng)建匿名內(nèi)部類時(shí),匿名內(nèi)部類將擁有和父類相似的構(gòu)造方法,即

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論