武漢大學(xué)課件java第四章第4章_第1頁(yè)
武漢大學(xué)課件java第四章第4章_第2頁(yè)
武漢大學(xué)課件java第四章第4章_第3頁(yè)
武漢大學(xué)課件java第四章第4章_第4頁(yè)
武漢大學(xué)課件java第四章第4章_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、2022-4-20 0:511第四章第四章 繼承與多態(tài)繼承與多態(tài)2022-4-20 0:51第第 2 頁(yè)頁(yè)v全面掌握面向?qū)ο蟮幕咎卣魅嬲莆彰嫦驅(qū)ο蟮幕咎卣鱲掌握如何使用繼承性來(lái)到達(dá)軟件的重用掌握如何使用繼承性來(lái)到達(dá)軟件的重用v深入掌握繼承過(guò)程中域的隱藏和方法的覆蓋技巧深入掌握繼承過(guò)程中域的隱藏和方法的覆蓋技巧v深入掌握抽象類和抽象方法的定義深入掌握抽象類和抽象方法的定義v深入掌握接口的定義和使用技巧深入掌握接口的定義和使用技巧 本章學(xué)習(xí)要點(diǎn)本章學(xué)習(xí)要點(diǎn)2022-4-20 0:51第第 3 頁(yè)頁(yè)v本章討論面向?qū)ο蟪绦蛟O(shè)計(jì)另外兩個(gè)最重要的特點(diǎn):繼承本章討論面向?qū)ο蟪绦蛟O(shè)計(jì)另外兩個(gè)最重要的特點(diǎn)

2、:繼承和多態(tài)。和多態(tài)。v繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)方法中實(shí)現(xiàn)軟件重用的一種重要繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)方法中實(shí)現(xiàn)軟件重用的一種重要手段,通過(guò)繼承可以更有效地組織程序結(jié)構(gòu),明確類之間手段,通過(guò)繼承可以更有效地組織程序結(jié)構(gòu),明確類之間的關(guān)系,并充分利用已有的類來(lái)創(chuàng)建新類,通過(guò)繼承可以的關(guān)系,并充分利用已有的類來(lái)創(chuàng)建新類,通過(guò)繼承可以實(shí)現(xiàn)代碼的復(fù)用,以完成更復(fù)雜的設(shè)計(jì)、開發(fā)。實(shí)現(xiàn)代碼的復(fù)用,以完成更復(fù)雜的設(shè)計(jì)、開發(fā)。v多態(tài)則可以統(tǒng)一多個(gè)相關(guān)類的對(duì)外接口,并在運(yùn)行時(shí)根據(jù)多態(tài)則可以統(tǒng)一多個(gè)相關(guān)類的對(duì)外接口,并在運(yùn)行時(shí)根據(jù)不同的情況執(zhí)行不同的操作,提高類的抽象度和靈活性。不同的情況執(zhí)行不同的操作,提高類的抽象度

3、和靈活性。2022-4-20 0:5144.1 4.1 子類、父類與繼承機(jī)制子類、父類與繼承機(jī)制2022-4-20 0:51第第 5 頁(yè)頁(yè)4.1.1 繼承的概念v在類的定義過(guò)程中,繼承是一種由已有的類創(chuàng)建新類的機(jī)在類的定義過(guò)程中,繼承是一種由已有的類創(chuàng)建新類的機(jī)制。繼承而得到的類為子類,被繼承的類為父類,父類包制。繼承而得到的類為子類,被繼承的類為父類,父類包括所有直接或間接被繼承的類。括所有直接或間接被繼承的類。Java中不支持多重繼承。中不支持多重繼承。v通過(guò)在類的聲明中加入通過(guò)在類的聲明中加入extends子句來(lái)創(chuàng)建一個(gè)類的子類:子句來(lái)創(chuàng)建一個(gè)類的子類: class SubClass e

4、xtends SuperClass v如果缺省如果缺省extends子句,則該類為子句,則該類為java.lang.Object的子類。的子類。子類可以繼承父類中訪問(wèn)權(quán)限設(shè)定為子類可以繼承父類中訪問(wèn)權(quán)限設(shè)定為public、 protected、package的成員變量和方法,但是不能繼承訪問(wèn)權(quán)限為的成員變量和方法,但是不能繼承訪問(wèn)權(quán)限為private的成員變量和方法。的成員變量和方法。 2022-4-20 0:51第第 6 頁(yè)頁(yè)4.1.1 繼承的概念v何時(shí)選擇繼承何時(shí)選擇繼承?一個(gè)很好的經(jīng)驗(yàn):一個(gè)很好的經(jīng)驗(yàn):“B是一個(gè)是一個(gè)A嗎嗎?”如果是則讓如果是則讓B做做A的子類的子類.一個(gè)父類可以同時(shí)擁

5、有多個(gè)子類,而每一個(gè)子類則是對(duì)公共一個(gè)父類可以同時(shí)擁有多個(gè)子類,而每一個(gè)子類則是對(duì)公共域和方法在功能、內(nèi)涵方面的擴(kuò)展和延伸。域和方法在功能、內(nèi)涵方面的擴(kuò)展和延伸。父類、子類間的關(guān)系具有:父類、子類間的關(guān)系具有: 共享性共享性 即子類可以共享父類的公共域和方法。即子類可以共享父類的公共域和方法。 差異性差異性 即子類和父類一定會(huì)存在某些差異,否則就應(yīng)該是即子類和父類一定會(huì)存在某些差異,否則就應(yīng)該是同一個(gè)類。同一個(gè)類。 層次性層次性 即由即由Java規(guī)定的單繼承性,每個(gè)類都處于繼承關(guān)系規(guī)定的單繼承性,每個(gè)類都處于繼承關(guān)系中的某一個(gè)層面。中的某一個(gè)層面。2022-4-20 0:51第第 7 頁(yè)頁(yè)4.

6、1.2 類的層次vJava語(yǔ)言中類的是有嚴(yán)格的層次結(jié)構(gòu)的。語(yǔ)言中類的是有嚴(yán)格的層次結(jié)構(gòu)的。v除除Object類之外,每個(gè)類都繼承惟一的父類。這種繼承性類之外,每個(gè)類都繼承惟一的父類。這種繼承性性質(zhì)使得類的層次結(jié)構(gòu)形成了如圖所示的一種樹狀結(jié)構(gòu)。性質(zhì)使得類的層次結(jié)構(gòu)形成了如圖所示的一種樹狀結(jié)構(gòu)。vObject類定義和實(shí)現(xiàn)了類定義和實(shí)現(xiàn)了Java系統(tǒng)所需要的眾多類的共同行系統(tǒng)所需要的眾多類的共同行為,它是所有類的父類,也即這個(gè)樹狀結(jié)構(gòu)中的根類,所為,它是所有類的父類,也即這個(gè)樹狀結(jié)構(gòu)中的根類,所有的類都是由這個(gè)類繼承、擴(kuò)充而來(lái)的,這個(gè)有的類都是由這個(gè)類繼承、擴(kuò)充而來(lái)的,這個(gè)Object類定類定義在義

7、在java.lang包中。包中。 2022-4-20 0:51第第 8 頁(yè)頁(yè)4.1.2 類的層次Java語(yǔ)言中類的層次 結(jié)構(gòu)結(jié)構(gòu)2022-4-20 0:5194.2 繼承的實(shí)現(xiàn)2022-4-20 0:51第第 10 頁(yè)頁(yè)4.2.1 4.2.1 子類的定義子類的定義定義一個(gè)子類,即在定義一個(gè)類的時(shí)候加上定義一個(gè)子類,即在定義一個(gè)類的時(shí)候加上extends關(guān)關(guān)鍵字,并在之后帶上其父類名,其一般格式為:鍵字,并在之后帶上其父類名,其一般格式為: 類的修飾符類的修飾符 class extends ; ; 這和前面定義類的格式并沒(méi)有什么區(qū)別,只是現(xiàn)在這和前面定義類的格式并沒(méi)有什么區(qū)別,只是現(xiàn)在“exte

8、nds ”不再是可選項(xiàng)。不再是可選項(xiàng)。2022-4-20 0:51第第 11 頁(yè)頁(yè)4.2.1 4.2.1 子類的定義子類的定義vclass point v int x, y;v void getxy( int i, int j) v x=i; y=j;v vvclass circle extends point v double r;v double area()v return 3.14*r*r ; v v2022-4-20 0:51第第 12 頁(yè)頁(yè)4.2.1 4.2.1 子類的定義子類的定義電話及其子類的繼承關(guān)系 2022-4-20 0:51第第 13 頁(yè)頁(yè)4.2.1 4.2.1 子類的定

9、義子類的定義【例例4.2】 實(shí)現(xiàn)圖實(shí)現(xiàn)圖4.2中電話類的繼承結(jié)構(gòu)。為了代碼的簡(jiǎn)中電話類的繼承結(jié)構(gòu)。為了代碼的簡(jiǎn)潔,而把注意力集中在我們要討論的語(yǔ)法機(jī)制上,這里潔,而把注意力集中在我們要討論的語(yǔ)法機(jī)制上,這里假設(shè)移動(dòng)電話僅一種,電話的計(jì)費(fèi)方式為:國(guó)內(nèi)長(zhǎng)途話假設(shè)移動(dòng)電話僅一種,電話的計(jì)費(fèi)方式為:國(guó)內(nèi)長(zhǎng)途話費(fèi)是市話費(fèi)的費(fèi)是市話費(fèi)的3倍,國(guó)際長(zhǎng)途話費(fèi)是市話費(fèi)的倍,國(guó)際長(zhǎng)途話費(fèi)是市話費(fèi)的9倍。倍。 abstract class Telephone long phoneNumber; final int local_Call=1; final int distance_Call=3; final int

10、international_Call=9; double balance ; abstract boolean charge_Mode (int call_Mode ) ; double getBalance ( ) return balance ; 2022-4-20 0:51第第 14 頁(yè)頁(yè)4.2.2 域的繼承與隱藏 v1. 域的繼承域的繼承v子類可以繼承父類的所有非私有域。例如各類電話類所包子類可以繼承父類的所有非私有域。例如各類電話類所包含的域分別為:含的域分別為:vMobile_Phone類類 vlong phoneNumber;vint local_Call;vint distan

11、ce_Call;vint international_Callvdouble balance; 來(lái)自繼承父類來(lái)自繼承父類Telephone的的5個(gè)基本域個(gè)基本域String networkType;2022-4-20 0:51第第 15 頁(yè)頁(yè)4.2.2 域的繼承與隱藏 IP_Phone類類 vlong phoneNumber;vint local_Call;vint distance_Call;vint international_Callvdouble balance; 來(lái)自繼承父類來(lái)自繼承父類Telephone的的5個(gè)基個(gè)基本域本域double monthFee;來(lái)自繼承父類來(lái)自繼承父類F

12、ixed_Telephone boolearn started; Date expireDate;子類子類IP_Phone類中聲明的域類中聲明的域2022-4-20 0:51第第 16 頁(yè)頁(yè)4.2.2 域的繼承與隱藏 Ordinary_phone類類 vlong phoneNumber;vint local_Call;vint distance_Call;vint international_Callvdouble balance; 來(lái)自繼承父類來(lái)自繼承父類Telephone的的5個(gè)基個(gè)基本域本域double monthFee;來(lái)自繼承父類來(lái)自繼承父類Fixed_Telephone boole

13、an longdistanceService;boolean internationalService; 子類子類Ordinary_phone類中聲明的域類中聲明的域2022-4-20 0:51第第 17 頁(yè)頁(yè)4.2.2 域的繼承與隱藏 v2. 域的隱藏域的隱藏v子類重新定義一個(gè)與從父類繼承來(lái)的域變量完全相同子類重新定義一個(gè)與從父類繼承來(lái)的域變量完全相同的變量,稱為域的隱藏。即子類中定義了與父類同名的變量,稱為域的隱藏。即子類中定義了與父類同名的域變量,就是子類變量對(duì)同名父類變量的隱藏。這的域變量,就是子類變量對(duì)同名父類變量的隱藏。這里所謂隱藏是指子類擁有了兩個(gè)相同名字的變量,一里所謂隱藏是指

14、子類擁有了兩個(gè)相同名字的變量,一個(gè)來(lái)自繼承父類,另一個(gè)由自己定義。在這種情況下,個(gè)來(lái)自繼承父類,另一個(gè)由自己定義。在這種情況下,當(dāng)子類執(zhí)行繼承的父類方法時(shí),處理的是父類的變量,當(dāng)子類執(zhí)行繼承的父類方法時(shí),處理的是父類的變量,而當(dāng)子類執(zhí)行它自己定義的方法時(shí),所操作的就是它而當(dāng)子類執(zhí)行它自己定義的方法時(shí),所操作的就是它自定義的變量,而把來(lái)自繼承父類的變量自定義的變量,而把來(lái)自繼承父類的變量“隱藏隱藏”起起來(lái)了。來(lái)了。2022-4-20 0:51第第 18 頁(yè)頁(yè)class Aclass B extends A static int data_a=3; static int data_a = 5;cl

15、ass C extends B void print_out() System.out.println(“data_a= ”+data_a); System.out.println(“A.data_a= ”+A.data_a); System.out.println(“B.data_a= ”+B.data_a); class demo public static void main(String args) C c = new C( ); c.print_out( ); data_a=5A.data_a=3B.data_a=54.2.2 域的繼承與隱藏2022-4-20 0:51第第 19 頁(yè)

16、頁(yè)4.2.2 域的繼承與隱藏 固定電話固定電話 電話類電話類 剩余金額、電話號(hào)碼 計(jì)費(fèi)方式、查詢余額 座機(jī)費(fèi) 計(jì)費(fèi)方式 普通電話普通電話 是否接通長(zhǎng)途 剩余金額 計(jì)費(fèi)方式 隱藏父類的剩余金額例4.3 2022-4-20 0:51第第 20 頁(yè)頁(yè)4.2.3 方法的繼承與覆蓋 1. 方法的繼承方法的繼承父類的非私有方法可以被子類所繼承。根據(jù)方法的繼承關(guān)系,將例4.3中電話類及其各子類所包含的方法列舉如下。(1)Telephone類abstract boolean charge_Mode();double getBalance();(2)Fixed_Telephone類abstract boolea

17、n charge_Mode(); /來(lái)自繼承父類Telephonedouble getBalance(); /來(lái)自繼承父類Telephone(3)Ordinary_phone類boolean charge_Mode(); double getBelance(); /來(lái)自繼承父類Fixed_Telephone2022-4-20 0:51第第 21 頁(yè)頁(yè)4.2.3 方法的繼承與覆蓋v2. 方法的覆蓋方法的覆蓋方法的覆蓋(方法的覆蓋(Override)是指子類重定義從父類繼承來(lái)的一)是指子類重定義從父類繼承來(lái)的一個(gè)同名方法,此時(shí)父類的這個(gè)方法在子類中將不復(fù)存在。個(gè)同名方法,此時(shí)父類的這個(gè)方法在子類中

18、將不復(fù)存在。這是子類通過(guò)重新定義與父類同名的方法,實(shí)現(xiàn)自身的行這是子類通過(guò)重新定義與父類同名的方法,實(shí)現(xiàn)自身的行為。為。方法覆蓋時(shí)應(yīng)遵循的原則方法覆蓋時(shí)應(yīng)遵循的原則:(1)覆蓋后的方法不能比被覆蓋的方法有更嚴(yán)格的訪問(wèn)權(quán)限。覆蓋后的方法不能比被覆蓋的方法有更嚴(yán)格的訪問(wèn)權(quán)限。(2)覆蓋后的方法不能比被覆蓋的方法產(chǎn)生更多的異常覆蓋后的方法不能比被覆蓋的方法產(chǎn)生更多的異常。2022-4-20 0:51第第 22 頁(yè)頁(yè)4.2.3 方法的繼承與覆蓋class Car int color_number; int door_number; int speed; public void push_break()

19、 speed = 0; public void add_oil() class Trash_Car extends Car double amount; public void fill_trash() public void push_break() speed = speed 10; 2022-4-20 0:51第第 23 頁(yè)頁(yè)4.2.3 方法的繼承與覆蓋v 覆蓋方法的調(diào)用覆蓋方法的調(diào)用 對(duì)于重寫的方法,對(duì)于重寫的方法,Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例的類型來(lái)決定選擇哪個(gè)方法調(diào)用。的類型來(lái)決定選擇哪個(gè)方法調(diào)用。public class DemoCar p

20、ublic static void main( String args ) Car aCar = new Trash_Car( );aCar. push_break( ); 在這里,在這里, 類類Trash_Car中的中的push_break( )方方法將被調(diào)用。法將被調(diào)用。2022-4-20 0:51第第 24 頁(yè)頁(yè)4.2.3 方法的繼承與覆蓋v方法的覆蓋與域的隱藏的不同之處在于:子類隱藏父類的方法的覆蓋與域的隱藏的不同之處在于:子類隱藏父類的域只是使之不可見,父類的同名域在子類對(duì)象中仍然占有域只是使之不可見,父類的同名域在子類對(duì)象中仍然占有自己獨(dú)立的內(nèi)存空間;而子類方法對(duì)父類同名方法的覆蓋

21、自己獨(dú)立的內(nèi)存空間;而子類方法對(duì)父類同名方法的覆蓋將清除父類方法占用的內(nèi)存空間,從而使父類方法在子類將清除父類方法占用的內(nèi)存空間,從而使父類方法在子類對(duì)象中不復(fù)存在。對(duì)象中不復(fù)存在。v域的隱藏和方法的覆蓋的意義在于:通過(guò)隱藏域和覆蓋方域的隱藏和方法的覆蓋的意義在于:通過(guò)隱藏域和覆蓋方法可以把父類的狀態(tài)和行為改為自身的狀態(tài)和行為,對(duì)外法可以把父類的狀態(tài)和行為改為自身的狀態(tài)和行為,對(duì)外統(tǒng)一名字與接口,又不失其繼承性。統(tǒng)一名字與接口,又不失其繼承性。2022-4-20 0:51254.3 多 態(tài) 性2022-4-20 0:51第第 26 頁(yè)頁(yè)v多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的又一個(gè)重要的技術(shù)和手段。多態(tài)性

22、是面向?qū)ο蟪绦蛟O(shè)計(jì)的又一個(gè)重要的技術(shù)和手段。 v多態(tài)性是指同名的不同方法在程序中共存。即為同一個(gè)方多態(tài)性是指同名的不同方法在程序中共存。即為同一個(gè)方法定義幾個(gè)版本,運(yùn)行時(shí)根據(jù)不同情況執(zhí)行不同的版本。法定義幾個(gè)版本,運(yùn)行時(shí)根據(jù)不同情況執(zhí)行不同的版本。調(diào)用者只需使用同一個(gè)方法名,系統(tǒng)會(huì)根據(jù)不同情況,調(diào)調(diào)用者只需使用同一個(gè)方法名,系統(tǒng)會(huì)根據(jù)不同情況,調(diào)用相應(yīng)的不同方法,從而實(shí)現(xiàn)不同的功能。用相應(yīng)的不同方法,從而實(shí)現(xiàn)不同的功能。v多態(tài)性又被稱為多態(tài)性又被稱為“一個(gè)名字,多個(gè)方法一個(gè)名字,多個(gè)方法”。2022-4-20 0:51第第 27 頁(yè)頁(yè)4.3.1 4.3.1 多態(tài)性的概念多態(tài)性的概念多態(tài)性的實(shí)現(xiàn)

23、有兩種方式:多態(tài)性的實(shí)現(xiàn)有兩種方式:(1)覆蓋實(shí)現(xiàn)多態(tài)性)覆蓋實(shí)現(xiàn)多態(tài)性通過(guò)子類對(duì)繼承父類方法的重定義來(lái)實(shí)現(xiàn)。使用時(shí)注意:在通過(guò)子類對(duì)繼承父類方法的重定義來(lái)實(shí)現(xiàn)。使用時(shí)注意:在子類重定義父類方法時(shí),要求與父類中方法的原型(參數(shù)個(gè)子類重定義父類方法時(shí),要求與父類中方法的原型(參數(shù)個(gè)數(shù)、類型、順序)完全相同。數(shù)、類型、順序)完全相同。(2)重載實(shí)現(xiàn)多態(tài)性)重載實(shí)現(xiàn)多態(tài)性通過(guò)定義類中的多個(gè)同名的不同方法來(lái)實(shí)現(xiàn)。編譯時(shí)是根據(jù)通過(guò)定義類中的多個(gè)同名的不同方法來(lái)實(shí)現(xiàn)。編譯時(shí)是根據(jù)參數(shù)(個(gè)數(shù)、類型、順序)的不同來(lái)區(qū)分不同方法的。參數(shù)(個(gè)數(shù)、類型、順序)的不同來(lái)區(qū)分不同方法的。2022-4-20 0:51第第

24、 28 頁(yè)頁(yè)4.3.2 覆蓋實(shí)現(xiàn)多態(tài)性在覆蓋實(shí)現(xiàn)多態(tài)性的方式中,子類重定義父類方法,此時(shí)方在覆蓋實(shí)現(xiàn)多態(tài)性的方式中,子類重定義父類方法,此時(shí)方法的名字、參數(shù)個(gè)數(shù)、類型、順序完全相同,那么如何區(qū)別法的名字、參數(shù)個(gè)數(shù)、類型、順序完全相同,那么如何區(qū)別這些同名的不同方法呢?這些同名的不同方法呢?由于這些方法是存在于一個(gè)類層次結(jié)構(gòu)的不同類中的,在調(diào)由于這些方法是存在于一個(gè)類層次結(jié)構(gòu)的不同類中的,在調(diào)用方法時(shí)只需要指明調(diào)用哪個(gè)類(或?qū)ο螅┑姆椒?,就很容用方法時(shí)只需要指明調(diào)用哪個(gè)類(或?qū)ο螅┑姆椒ǎ秃苋菀装阉鼈儏^(qū)分開來(lái),其調(diào)用形式為:易把它們區(qū)分開來(lái),其調(diào)用形式為: 對(duì)象名對(duì)象名.方法名方法名 類名類名

25、.方法名方法名例如,例如,IP電話的計(jì)費(fèi),若建立電話的計(jì)費(fèi),若建立IP_Phone類的對(duì)象類的對(duì)象my,其調(diào)用,其調(diào)用為:為: my.charge_Mode();假如假如charge_Mode()是一個(gè)類方法,則要使用類名,其調(diào)用為:是一個(gè)類方法,則要使用類名,其調(diào)用為: IP_Phone.charge_Mode(); 例例4.5 2022-4-20 0:51第第 29 頁(yè)頁(yè)4.3.3 重載實(shí)現(xiàn)多態(tài)性v通過(guò)重載來(lái)實(shí)現(xiàn),它是在通過(guò)重載來(lái)實(shí)現(xiàn),它是在同一個(gè)類同一個(gè)類中定義多個(gè)同名方法,這中定義多個(gè)同名方法,這些方法同名的原因是些方法同名的原因是具有類似的功能且目的相同具有類似的功能且目的相同,但在

26、實(shí)現(xiàn),但在實(shí)現(xiàn)該功能的具體方式和細(xì)節(jié)方面有所不同,因此需要定義多種該功能的具體方式和細(xì)節(jié)方面有所不同,因此需要定義多種不同的方法體。不同的方法體。 v由于重載發(fā)生在同一個(gè)類中,不能再用類名或?qū)ο竺麃?lái)區(qū)分由于重載發(fā)生在同一個(gè)類中,不能再用類名或?qū)ο竺麃?lái)區(qū)分不同的方法了,所以在重載中采用的區(qū)分方法是使用不同的不同的方法了,所以在重載中采用的區(qū)分方法是使用不同的形式參數(shù)表,包括形式參數(shù)的個(gè)數(shù)不同、類型不同或順序的形式參數(shù)表,包括形式參數(shù)的個(gè)數(shù)不同、類型不同或順序的不同。不同。v例如,在重載加法例如,在重載加法add(x,y)時(shí),整數(shù)加法的形參類型是整時(shí),整數(shù)加法的形參類型是整型,復(fù)數(shù)加法的形參類型是

27、復(fù)數(shù)型。根據(jù)填入的參數(shù)的類型型,復(fù)數(shù)加法的形參類型是復(fù)數(shù)型。根據(jù)填入的參數(shù)的類型或者參量等的不同,系統(tǒng)可以確定調(diào)用哪一個(gè)加法函數(shù)來(lái)完或者參量等的不同,系統(tǒng)可以確定調(diào)用哪一個(gè)加法函數(shù)來(lái)完成加法計(jì)算。成加法計(jì)算。 例例4.6 2022-4-20 0:51第第 30 頁(yè)頁(yè)4.3.4 多態(tài)性舉例多態(tài)性舉例多態(tài)性還可以是指在程序中需要使用父類對(duì)象的地方,都多態(tài)性還可以是指在程序中需要使用父類對(duì)象的地方,都可以用子類對(duì)象來(lái)代替??梢杂米宇悓?duì)象來(lái)代替。例如:例如:public class Employee extends Objectpublic class Manager extends Employee

28、則:則:Employee e = new Manager(); /合法語(yǔ)句合法語(yǔ)句2022-4-20 0:51第第 31 頁(yè)頁(yè)4.3.4 多態(tài)性舉例多態(tài)性舉例v 對(duì)象狀態(tài)的確定對(duì)象狀態(tài)的確定在在Java語(yǔ)言中,提供了操作符語(yǔ)言中,提供了操作符instanceof用來(lái)判斷對(duì)象是否用來(lái)判斷對(duì)象是否屬于某個(gè)類的實(shí)例。屬于某個(gè)類的實(shí)例。public void method (Employee e) if ( e instanceof Manager ) /do something as a Manager else if ( e instanceof Contractor ) /do somethin

29、g as a Contractor else /do something else 2022-4-20 0:51324.4 4.4 構(gòu)造方法的繼承與重載構(gòu)造方法的繼承與重載2022-4-20 0:51第第 33 頁(yè)頁(yè)4.4.1 構(gòu)造方法的重載v構(gòu)造方法的重載是指同一個(gè)類中定義不同參數(shù)的多個(gè)構(gòu)造方構(gòu)造方法的重載是指同一個(gè)類中定義不同參數(shù)的多個(gè)構(gòu)造方法,以完成不同情況下對(duì)象的初始化。法,以完成不同情況下對(duì)象的初始化。例如,例如,point類可定義不同的構(gòu)造方法創(chuàng)建不同的點(diǎn)對(duì)象。類可定義不同的構(gòu)造方法創(chuàng)建不同的點(diǎn)對(duì)象。point();/未初始化坐標(biāo)未初始化坐標(biāo)point(x);/初始化一個(gè)坐標(biāo)初始化

30、一個(gè)坐標(biāo)point(x, y);/初始化兩個(gè)坐標(biāo)初始化兩個(gè)坐標(biāo)一個(gè)類的若干個(gè)構(gòu)造方法之間可以相互調(diào)用。當(dāng)類中一個(gè)一個(gè)類的若干個(gè)構(gòu)造方法之間可以相互調(diào)用。當(dāng)類中一個(gè)構(gòu)造方法需要調(diào)用另一個(gè)構(gòu)造方法時(shí),可以使用關(guān)鍵字構(gòu)造方法需要調(diào)用另一個(gè)構(gòu)造方法時(shí),可以使用關(guān)鍵字this,并且這個(gè)調(diào)用語(yǔ)句應(yīng)該是該構(gòu)造方法的第一個(gè)可執(zhí)行語(yǔ)句。并且這個(gè)調(diào)用語(yǔ)句應(yīng)該是該構(gòu)造方法的第一個(gè)可執(zhí)行語(yǔ)句。2022-4-20 0:51第第 34 頁(yè)頁(yè)4.4.1 構(gòu)造方法的重載【例例4.7】 對(duì)對(duì)Ordinary_phone類,可以根據(jù)需要定義幾個(gè)構(gòu)類,可以根據(jù)需要定義幾個(gè)構(gòu)造方法:造方法:Ordinary_phone( ) /無(wú)參

31、數(shù)的構(gòu)造方法,對(duì)象的各域置為默認(rèn)初始值無(wú)參數(shù)的構(gòu)造方法,對(duì)象的各域置為默認(rèn)初始值Ordinary_phone(boolean disService) this();/調(diào)自身的無(wú)參數(shù)的構(gòu)造方法調(diào)自身的無(wú)參數(shù)的構(gòu)造方法 longdistanceServicedisService; /確定是否開通國(guó)內(nèi)長(zhǎng)途電話確定是否開通國(guó)內(nèi)長(zhǎng)途電話Ordinary_phone(boolean disService, boolean intService) this(disService);/調(diào)自身的帶一個(gè)參數(shù)的構(gòu)造方法調(diào)自身的帶一個(gè)參數(shù)的構(gòu)造方法 internationalService = intService;

32、/國(guó)際長(zhǎng)途電話國(guó)際長(zhǎng)途電話2022-4-20 0:51第第 35 頁(yè)頁(yè)4.4.1 構(gòu)造方法的重載vOrdinary_phone(boolean disService, boolean intService, double b) v /3個(gè)參數(shù)的構(gòu)造方法個(gè)參數(shù)的構(gòu)造方法v this(disService, intService);v /調(diào)自身的帶兩個(gè)參數(shù)的構(gòu)造方法調(diào)自身的帶兩個(gè)參數(shù)的構(gòu)造方法v balance =b; /設(shè)置話費(fèi)金額設(shè)置話費(fèi)金額vv使用使用this域來(lái)調(diào)用同類的其他構(gòu)造方法,其優(yōu)點(diǎn)是可以最大域來(lái)調(diào)用同類的其他構(gòu)造方法,其優(yōu)點(diǎn)是可以最大限度地提高對(duì)已有代碼的利用程度,提高程序的抽象

33、、封裝限度地提高對(duì)已有代碼的利用程度,提高程序的抽象、封裝程度,以及減少程序維護(hù)的工作量。程度,以及減少程序維護(hù)的工作量。2022-4-20 0:51第第 36 頁(yè)頁(yè)4.4.2 構(gòu)造方法的繼承v子類可以繼承父類的構(gòu)造方法,構(gòu)造方法的繼承遵循以下原子類可以繼承父類的構(gòu)造方法,構(gòu)造方法的繼承遵循以下原則:則:v(1)子類無(wú)條件地繼承父類的無(wú)參數(shù)的構(gòu)造方法。)子類無(wú)條件地繼承父類的無(wú)參數(shù)的構(gòu)造方法。v(2)如果子類沒(méi)有定義構(gòu)造方法,則它將繼承父類的無(wú)參)如果子類沒(méi)有定義構(gòu)造方法,則它將繼承父類的無(wú)參數(shù)構(gòu)造方法作為自己的構(gòu)造方法;如果子類定義了構(gòu)造方法,數(shù)構(gòu)造方法作為自己的構(gòu)造方法;如果子類定義了構(gòu)造

34、方法,則在創(chuàng)建新對(duì)象時(shí),將先執(zhí)行繼承的父類無(wú)參數(shù)構(gòu)造方法,則在創(chuàng)建新對(duì)象時(shí),將先執(zhí)行繼承的父類無(wú)參數(shù)構(gòu)造方法,然后再執(zhí)行自己的構(gòu)造方法。然后再執(zhí)行自己的構(gòu)造方法。v(3)對(duì)于父類的帶參數(shù)構(gòu)造方法,子類可以通過(guò)在自己的)對(duì)于父類的帶參數(shù)構(gòu)造方法,子類可以通過(guò)在自己的構(gòu)造方法中使用構(gòu)造方法中使用supper關(guān)鍵字來(lái)調(diào)用它,但這個(gè)調(diào)用語(yǔ)句必關(guān)鍵字來(lái)調(diào)用它,但這個(gè)調(diào)用語(yǔ)句必須是子類構(gòu)造方法的第一個(gè)可執(zhí)行語(yǔ)句。須是子類構(gòu)造方法的第一個(gè)可執(zhí)行語(yǔ)句。v下面我們主要討論第下面我們主要討論第2和第和第3點(diǎn)。點(diǎn)。2022-4-20 0:51第第 37 頁(yè)頁(yè)4.4.2 構(gòu)造方法的繼承v1. 父類與子類的構(gòu)造方法的執(zhí)

35、行順序父類與子類的構(gòu)造方法的執(zhí)行順序下面給出一個(gè)簡(jiǎn)單示意性的例子。下面給出一個(gè)簡(jiǎn)單示意性的例子?!纠?.6】 試分析下面程序的繼承關(guān)系以及構(gòu)造試分析下面程序的繼承關(guān)系以及構(gòu)造方法的調(diào)用順序。我們是否可以先不看執(zhí)行結(jié)果,方法的調(diào)用順序。我們是否可以先不看執(zhí)行結(jié)果,分析構(gòu)造方法執(zhí)行順序是分析構(gòu)造方法執(zhí)行順序是A()、B()、C()還是還是C()、B()、A()?例例4.62022-4-20 0:51第第 38 頁(yè)頁(yè)4.4.2 構(gòu)造方法的繼承v2. 在構(gòu)造方法中在構(gòu)造方法中super關(guān)鍵字的使用關(guān)鍵字的使用super是表示父類對(duì)象的關(guān)鍵字,是表示父類對(duì)象的關(guān)鍵字,super表示當(dāng)前對(duì)象的直表示當(dāng)前

36、對(duì)象的直接父類,代表了當(dāng)前父類對(duì)象的一個(gè)引用,其作用是利用接父類,代表了當(dāng)前父類對(duì)象的一個(gè)引用,其作用是利用super可使用父類對(duì)象的方法或域??墒褂酶割悓?duì)象的方法或域。Fixed_Telephone( ) /無(wú)參數(shù)的構(gòu)造方法無(wú)參數(shù)的構(gòu)造方法Fixed_Telephone (long pn) phoneNumber = pn; /初始化電話號(hào)碼初始化電話號(hào)碼Fixed_ Telephone (long pn, double mf ) phoneNumber = pn; monthFee = mf; /初始化座機(jī)費(fèi)初始化座機(jī)費(fèi)Fixed_Telephone(long pn, double mf,

37、 double b) phoneNumber = pn; monthFee = mf; balance= b;/初始化電話費(fèi)的剩余金額初始化電話費(fèi)的剩余金額2022-4-20 0:51第第 39 頁(yè)頁(yè)4.4.2 構(gòu)造方法的繼承設(shè)計(jì)子類的構(gòu)造方法可選擇如下方式:設(shè)計(jì)子類的構(gòu)造方法可選擇如下方式:(1)僅調(diào)用父類的無(wú)參數(shù)構(gòu)造方法。)僅調(diào)用父類的無(wú)參數(shù)構(gòu)造方法。(2)定義自己的一個(gè)(或多個(gè))構(gòu)造方法并調(diào)用父類的帶參)定義自己的一個(gè)(或多個(gè))構(gòu)造方法并調(diào)用父類的帶參數(shù)的構(gòu)造方法。數(shù)的構(gòu)造方法。 Fixed_Telephone( ) /無(wú)參數(shù)的構(gòu)造方法無(wú)參數(shù)的構(gòu)造方法Fixed_Telephone (l

38、ong pn) phoneNumber = pn; /初始化電話號(hào)碼初始化電話號(hào)碼Fixed_ Telephone (long pn, double mf ) phoneNumber = pn; monthFee = mf; /初始化座機(jī)費(fèi)初始化座機(jī)費(fèi)Fixed_Telephone(long pn, double mf, double b) phoneNumber = pn; monthFee = mf; balance= b;/初始化電話費(fèi)的剩余金額初始化電話費(fèi)的剩余金額Ordinary_phone (long pn , double mf , boolean ds) super (pn,

39、mf); longdistanceService = ds; Ordinary_phone(long pn , double mf , double b , boolean ds) super (pn ,mf, b);/調(diào)用父類三調(diào)用父類三個(gè)參數(shù)的構(gòu)造方法為繼承的域賦初值個(gè)參數(shù)的構(gòu)造方法為繼承的域賦初值 longdistanceService = ds ;/用參數(shù)初始化自定用參數(shù)初始化自定義域義域2022-4-20 0:51第第 40 頁(yè)頁(yè)4.4.3 構(gòu)造方法的綜合舉例綜合舉例構(gòu)造方法的繼承與重載以及方法的覆蓋的綜合舉例。構(gòu)造方法的繼承與重載以及方法的覆蓋的綜合舉例。 【例例4.8】 本例中使

40、用重載技術(shù)定義了本例中使用重載技術(shù)定義了Fixed_PhoneCsrd類的類的4個(gè)構(gòu)造方個(gè)構(gòu)造方法;使用繼承和重載技術(shù)定義了法;使用繼承和重載技術(shù)定義了Ordinary_phone類的兩個(gè)構(gòu)類的兩個(gè)構(gòu)造方法;使用覆蓋技術(shù)在造方法;使用覆蓋技術(shù)在Ordinary_phone類中覆蓋了父類的類中覆蓋了父類的getBalance()方法以及方法以及Object類的類的toString()方法。主類中創(chuàng)方法。主類中創(chuàng)建類的對(duì)象建類的對(duì)象myHomePhone時(shí)使用了第二個(gè)構(gòu)造方法,并對(duì)時(shí)使用了第二個(gè)構(gòu)造方法,并對(duì)大部分的域都進(jìn)行初始化,大部分的域都進(jìn)行初始化, 2022-4-20 0:51414.5

41、接 口2022-4-20 0:51第第 42 頁(yè)頁(yè)v接口(接口(interface)也有人翻譯為界面,是用來(lái)實(shí)現(xiàn)類間多重)也有人翻譯為界面,是用來(lái)實(shí)現(xiàn)類間多重繼承功能的一種結(jié)構(gòu)。繼承功能的一種結(jié)構(gòu)。v接口是在語(yǔ)法上與類有些相似。它定義了若干個(gè)抽象方法和接口是在語(yǔ)法上與類有些相似。它定義了若干個(gè)抽象方法和常量,形成一個(gè)屬性集合,該屬性集合通常對(duì)應(yīng)了某一組功常量,形成一個(gè)屬性集合,該屬性集合通常對(duì)應(yīng)了某一組功能。能。v凡是需要實(shí)現(xiàn)這種特定功能的類,都可以繼承并使用它。一凡是需要實(shí)現(xiàn)這種特定功能的類,都可以繼承并使用它。一個(gè)類只能直接繼承一個(gè)父類,但可以同時(shí)實(shí)現(xiàn)若干個(gè)接口。個(gè)類只能直接繼承一個(gè)父類,

42、但可以同時(shí)實(shí)現(xiàn)若干個(gè)接口。實(shí)現(xiàn)(或繼承)接口實(shí)際上就獲得了多個(gè)特殊父類的屬性,實(shí)現(xiàn)(或繼承)接口實(shí)際上就獲得了多個(gè)特殊父類的屬性,即實(shí)現(xiàn)了多重繼承。即實(shí)現(xiàn)了多重繼承。v接口定義的僅是實(shí)現(xiàn)某特定功能的一組對(duì)外接口和規(guī)范,而接口定義的僅是實(shí)現(xiàn)某特定功能的一組對(duì)外接口和規(guī)范,而這個(gè)功能的真正實(shí)現(xiàn)是在繼承這個(gè)接口的各類中完成的。這個(gè)功能的真正實(shí)現(xiàn)是在繼承這個(gè)接口的各類中完成的。2022-4-20 0:51第第 43 頁(yè)頁(yè)4.5.1 4.5.1 接口與多繼承接口與多繼承所謂多重繼承,是指一個(gè)子類可以有一個(gè)以上的直接父類,所謂多重繼承,是指一個(gè)子類可以有一個(gè)以上的直接父類,該子類可以繼承它所有的直接父類的

43、屬性。該子類可以繼承它所有的直接父類的屬性。 接口定義的僅僅是實(shí)現(xiàn)某一特定功能的一組對(duì)外的協(xié)議和規(guī)接口定義的僅僅是實(shí)現(xiàn)某一特定功能的一組對(duì)外的協(xié)議和規(guī)范,而并沒(méi)有真正地實(shí)現(xiàn)這個(gè)功能。這些功能的真正實(shí)現(xiàn)是范,而并沒(méi)有真正地實(shí)現(xiàn)這個(gè)功能。這些功能的真正實(shí)現(xiàn)是在繼承這個(gè)接口的各個(gè)類中完成的。在繼承這個(gè)接口的各個(gè)類中完成的。因?yàn)榻涌诎氖俏磳?shí)現(xiàn)的一些抽象的方法,它與抽象類有因?yàn)榻涌诎氖俏磳?shí)現(xiàn)的一些抽象的方法,它與抽象類有些相象。研究一下接口與抽象類到底有什么區(qū)別是很有意義些相象。研究一下接口與抽象類到底有什么區(qū)別是很有意義的。它們之間存在以下的區(qū)別:的。它們之間存在以下的區(qū)別: 接口不能有任何實(shí)

44、現(xiàn)了的方法,而抽象類可以。接口不能有任何實(shí)現(xiàn)了的方法,而抽象類可以。 類可以繼承(實(shí)現(xiàn))許多接口,但只能繼承一個(gè)父類。類可以繼承(實(shí)現(xiàn))許多接口,但只能繼承一個(gè)父類。 類有嚴(yán)格的層次結(jié)構(gòu),而接口沒(méi)有層次結(jié)構(gòu),沒(méi)有聯(lián)系的類類有嚴(yán)格的層次結(jié)構(gòu),而接口沒(méi)有層次結(jié)構(gòu),沒(méi)有聯(lián)系的類可以實(shí)現(xiàn)相同的接口??梢詫?shí)現(xiàn)相同的接口。 2022-4-20 0:51第第 44 頁(yè)頁(yè)4.5.2 接口的定義v接口是由常量和抽象方法組成的特殊類。接口的定義包括兩個(gè)部分:接口聲明和接口體。聲明接口一般格式如下:vpublic interface 接口名 extends 父接口名表 v 域類型 域名常量值;/常量域聲明v 返回類

45、型 方法名(參數(shù)表);/抽象方法聲明vv接口聲明中有兩個(gè)部分是必需的:interface關(guān)鍵字和接口的名字。用public修飾的接口是公共接口,可以被所有的類和接口使用;沒(méi)有public修飾符的接口則只能被同一個(gè)包中的其他類和接口利用。2022-4-20 0:51第第 45 頁(yè)頁(yè)4.5.3 接口的實(shí)現(xiàn)為了使用接口,要編寫實(shí)現(xiàn)接口的類。實(shí)現(xiàn)某一個(gè)接口,在類的聲為了使用接口,要編寫實(shí)現(xiàn)接口的類。實(shí)現(xiàn)某一個(gè)接口,在類的聲明中要包括一條明中要包括一條implements語(yǔ)句。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,可以語(yǔ)句。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,可以在在implements后面列出要實(shí)現(xiàn)的多個(gè)接口,這些接口以逗號(hào)分

46、隔。后面列出要實(shí)現(xiàn)的多個(gè)接口,這些接口以逗號(hào)分隔。一個(gè)類實(shí)現(xiàn)某個(gè)接口,那么這個(gè)類就應(yīng)提供在接口中定義的所有抽一個(gè)類實(shí)現(xiàn)某個(gè)接口,那么這個(gè)類就應(yīng)提供在接口中定義的所有抽象方法的具體實(shí)現(xiàn)。象方法的具體實(shí)現(xiàn)。 public class StockApplet extends Applet implements StockWatcher public void valueChanged(String tickerSymbol, double newValue) if (tickerSymbol.equals(sunTicker) else if (tickerSymbol.equals(oracleT

47、icker) 2022-4-20 0:51第第 46 頁(yè)頁(yè)interface Collection int MAX_NUM=100;void add(Object obj);void delete(Object obj);Object find(Object obj);int currentCount( );class FIFOQueue implements Collection void add ( Object obj ) void delete( Object obj ) Object find( Object obj ) int currentCount() 4.5.3 接口的實(shí)現(xiàn)2

48、022-4-20 0:51第第 47 頁(yè)頁(yè)v實(shí)現(xiàn)接口時(shí)應(yīng)注意的問(wèn)題:實(shí)現(xiàn)接口時(shí)應(yīng)注意的問(wèn)題:(1)在類的聲明部分,用)在類的聲明部分,用implements關(guān)鍵字聲明該類將要實(shí)關(guān)鍵字聲明該類將要實(shí)現(xiàn)哪些接口?,F(xiàn)哪些接口。(2)類在實(shí)現(xiàn)抽象方法時(shí),必須用)類在實(shí)現(xiàn)抽象方法時(shí),必須用public修飾符。修飾符。(3)除抽象類以外,在類的定義部分必須為接口中所有的抽)除抽象類以外,在類的定義部分必須為接口中所有的抽象方法定義方法體,且方法首部應(yīng)該與接口中的定義完全一象方法定義方法體,且方法首部應(yīng)該與接口中的定義完全一致。致。(4)若實(shí)現(xiàn)某接口的類是)若實(shí)現(xiàn)某接口的類是abstract的抽象類,則它可

49、以不實(shí)的抽象類,則它可以不實(shí)現(xiàn)該接口所有的方法。但是對(duì)于這個(gè)抽象類的任何一個(gè)非抽現(xiàn)該接口所有的方法。但是對(duì)于這個(gè)抽象類的任何一個(gè)非抽象子類,不允許存在未被實(shí)現(xiàn)的接口方法。即非抽象類中不象子類,不允許存在未被實(shí)現(xiàn)的接口方法。即非抽象類中不能存在抽象方法。能存在抽象方法。4.5.3 接口的實(shí)現(xiàn)2022-4-20 0:51第第 48 頁(yè)頁(yè)4.5.4 接口的使用 如果一個(gè)接口需要擴(kuò)充,可以創(chuàng)建新的接口來(lái)繼承老接口。如果一個(gè)接口需要擴(kuò)充,可以創(chuàng)建新的接口來(lái)繼承老接口。比如,可以比如,可以StockWatcher接口需要增加一個(gè)方法,則可以創(chuàng)建接口需要增加一個(gè)方法,則可以創(chuàng)建一個(gè)子接口一個(gè)子接口Stock

50、Tracker: public interface StockTracker extends StockWatcher void currentValue(String tickerSymbol,double newValue); 接口除了被繼承和實(shí)現(xiàn)之外,還可以作為一種類型來(lái)使用接口除了被繼承和實(shí)現(xiàn)之外,還可以作為一種類型來(lái)使用當(dāng)定義一個(gè)新的接口的時(shí)候,實(shí)際上是定義了一個(gè)新的引用數(shù)當(dāng)定義一個(gè)新的接口的時(shí)候,實(shí)際上是定義了一個(gè)新的引用數(shù)據(jù)類型。在可以使用其他類型的名字(如變量聲明、方法參數(shù)據(jù)類型。在可以使用其他類型的名字(如變量聲明、方法參數(shù)等)的地方,都可使用這個(gè)接口名。等)的地方,都可使用

51、這個(gè)接口名。 例如,在例如,在StockMonitor類中的類中的watchStock()方法中的第一個(gè)方法中的第一個(gè)參數(shù)的數(shù)據(jù)類型為參數(shù)的數(shù)據(jù)類型為StockWatcher接口。只有實(shí)現(xiàn)接口。只有實(shí)現(xiàn)StockWatcher接口的類對(duì)象可以替代接口的類對(duì)象可以替代watcher形參。形參。 哲學(xué)家哲學(xué)家2022-4-20 0:51494.6 4.6 抽象類、接口和抽象類、接口和ObjectObject類的應(yīng)類的應(yīng)用用2022-4-20 0:51第第 50 頁(yè)頁(yè)v假設(shè)有若干假設(shè)有若干 (如如1000)個(gè))個(gè)Circle,Rectangle以及若干個(gè)其他以及若干個(gè)其他形狀,希望計(jì)算它們的總面積,

52、直截了當(dāng)?shù)淖龇ㄊ菍⑺鼈兎中螤?,希望?jì)算它們的總面積,直截了當(dāng)?shù)淖龇ㄊ菍⑺鼈兎謩e放到多個(gè)數(shù)組中,分別循環(huán)求出各形狀的面積,然后累加,別放到多個(gè)數(shù)組中,分別循環(huán)求出各形狀的面積,然后累加,這種做法是不漂亮的。這種做法是不漂亮的。v如果還有其它形狀:如果還有其它形狀:triangle,ellipses等,上述方法顯得等,上述方法顯得“累贅累贅”。我們希望有一種統(tǒng)一的表示,例如用一個(gè)數(shù)組。我們希望有一種統(tǒng)一的表示,例如用一個(gè)數(shù)組shape,接受所有的形狀,然后用:,接受所有的形狀,然后用:for (i=0; ishape.length; i+) area_total += shapei.area();

53、2022-4-20 0:51第第 51 頁(yè)頁(yè)首先看看首先看看Circle和和Rectangle兩個(gè)類,如何完成相關(guān)參數(shù)的計(jì)算兩個(gè)類,如何完成相關(guān)參數(shù)的計(jì)算 class Circle public float r; Circle(float r) this.r = r; /this指指這個(gè)對(duì)象的這個(gè)對(duì)象的 public float area() return 3.14*r*r; class Rectangle public float width,height; Rectangle (float w, float h) width = w; height = h; public float ar

54、ea() return width*height; 2022-4-20 0:51第第 52 頁(yè)頁(yè)4.6.1 4.6.1 用抽象類實(shí)現(xiàn)多種形狀面積的累加用抽象類實(shí)現(xiàn)多種形狀面積的累加v現(xiàn)在要利用抽象類實(shí)現(xiàn)多種形狀面積的累加,確保每現(xiàn)在要利用抽象類實(shí)現(xiàn)多種形狀面積的累加,確保每種形狀分別用不同的方法來(lái)計(jì)算它們的面積和周長(zhǎng)。種形狀分別用不同的方法來(lái)計(jì)算它們的面積和周長(zhǎng)。因此,超類因此,超類Shape包含抽象方法包含抽象方法computeArea,然后在,然后在不同的子類中實(shí)現(xiàn)和覆蓋這個(gè)方法。不同的子類中實(shí)現(xiàn)和覆蓋這個(gè)方法。v假定聲明了假定聲明了1000個(gè)個(gè)Shape對(duì)象的數(shù)組,然后循環(huán)對(duì)象的數(shù)組,然

55、后循環(huán)1000次隨機(jī)產(chǎn)生次隨機(jī)產(chǎn)生1000個(gè)平面圖形對(duì)象,形狀為圓、矩形、個(gè)平面圖形對(duì)象,形狀為圓、矩形、正方形三種之一。正方形三種之一。 2022-4-20 0:51第第 53 頁(yè)頁(yè)abstract class Shape abstract float computeArea();class Rectangle extends Shape public float width,height; Rectangle (float w, float h) width = w; /這里不需這里不需this height = h; public float computeArea() return w

56、idth*height; class Circle extends Shape public float r; Circle(float r) this.r = r; /this指指這個(gè)對(duì)象的這個(gè)對(duì)象的 public float computeArea() return 3.14*r*r; 實(shí)例實(shí)例2022-4-20 0:51第第 54 頁(yè)頁(yè)4.6.2 4.6.2 用接口實(shí)現(xiàn)多種形狀面積的累加用接口實(shí)現(xiàn)多種形狀面積的累加 v用接口的方式實(shí)現(xiàn)多種形狀面積的累加,需要將用抽象用接口的方式實(shí)現(xiàn)多種形狀面積的累加,需要將用抽象類表示的類表示的Shape類改成接口。由于接口的語(yǔ)法定義要求,類改成接口。由于接口的語(yǔ)法定義要求,我們要把原來(lái)抽象類中的成員變量去掉,成員方法改成抽我們要把原來(lái)抽象類中的成員變量去掉,成員方法改成抽象方法象方法computeArea(),該方法返回一個(gè),該方法返回一個(gè)double類型。所類型。所以,這個(gè)接口定義為:以,這個(gè)接口定義為:vpublic interface Shape2v public abstract double computeArea();v public abstract String toString();v2022-4-20 0:51第第 55

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論