




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2022-4-20 0:511第四章第四章 繼承與多態(tài)繼承與多態(tài)2022-4-20 0:51第第 2 頁頁v全面掌握面向對象的基本特征全面掌握面向對象的基本特征v掌握如何使用繼承性來到達軟件的重用掌握如何使用繼承性來到達軟件的重用v深入掌握繼承過程中域的隱藏和方法的覆蓋技巧深入掌握繼承過程中域的隱藏和方法的覆蓋技巧v深入掌握抽象類和抽象方法的定義深入掌握抽象類和抽象方法的定義v深入掌握接口的定義和使用技巧深入掌握接口的定義和使用技巧 本章學習要點本章學習要點2022-4-20 0:51第第 3 頁頁v本章討論面向對象程序設計另外兩個最重要的特點:繼承本章討論面向對象程序設計另外兩個最重要的特點
2、:繼承和多態(tài)。和多態(tài)。v繼承是面向對象程序設計方法中實現(xiàn)軟件重用的一種重要繼承是面向對象程序設計方法中實現(xiàn)軟件重用的一種重要手段,通過繼承可以更有效地組織程序結構,明確類之間手段,通過繼承可以更有效地組織程序結構,明確類之間的關系,并充分利用已有的類來創(chuàng)建新類,通過繼承可以的關系,并充分利用已有的類來創(chuàng)建新類,通過繼承可以實現(xiàn)代碼的復用,以完成更復雜的設計、開發(fā)。實現(xiàn)代碼的復用,以完成更復雜的設計、開發(fā)。v多態(tài)則可以統(tǒng)一多個相關類的對外接口,并在運行時根據(jù)多態(tài)則可以統(tǒng)一多個相關類的對外接口,并在運行時根據(jù)不同的情況執(zhí)行不同的操作,提高類的抽象度和靈活性。不同的情況執(zhí)行不同的操作,提高類的抽象度
3、和靈活性。2022-4-20 0:5144.1 4.1 子類、父類與繼承機制子類、父類與繼承機制2022-4-20 0:51第第 5 頁頁4.1.1 繼承的概念v在類的定義過程中,繼承是一種由已有的類創(chuàng)建新類的機在類的定義過程中,繼承是一種由已有的類創(chuàng)建新類的機制。繼承而得到的類為子類,被繼承的類為父類,父類包制。繼承而得到的類為子類,被繼承的類為父類,父類包括所有直接或間接被繼承的類。括所有直接或間接被繼承的類。Java中不支持多重繼承。中不支持多重繼承。v通過在類的聲明中加入通過在類的聲明中加入extends子句來創(chuàng)建一個類的子類:子句來創(chuàng)建一個類的子類: class SubClass e
4、xtends SuperClass v如果缺省如果缺省extends子句,則該類為子句,則該類為java.lang.Object的子類。的子類。子類可以繼承父類中訪問權限設定為子類可以繼承父類中訪問權限設定為public、 protected、package的成員變量和方法,但是不能繼承訪問權限為的成員變量和方法,但是不能繼承訪問權限為private的成員變量和方法。的成員變量和方法。 2022-4-20 0:51第第 6 頁頁4.1.1 繼承的概念v何時選擇繼承何時選擇繼承?一個很好的經驗:一個很好的經驗:“B是一個是一個A嗎嗎?”如果是則讓如果是則讓B做做A的子類的子類.一個父類可以同時擁
5、有多個子類,而每一個子類則是對公共一個父類可以同時擁有多個子類,而每一個子類則是對公共域和方法在功能、內涵方面的擴展和延伸。域和方法在功能、內涵方面的擴展和延伸。父類、子類間的關系具有:父類、子類間的關系具有: 共享性共享性 即子類可以共享父類的公共域和方法。即子類可以共享父類的公共域和方法。 差異性差異性 即子類和父類一定會存在某些差異,否則就應該是即子類和父類一定會存在某些差異,否則就應該是同一個類。同一個類。 層次性層次性 即由即由Java規(guī)定的單繼承性,每個類都處于繼承關系規(guī)定的單繼承性,每個類都處于繼承關系中的某一個層面。中的某一個層面。2022-4-20 0:51第第 7 頁頁4.
6、1.2 類的層次vJava語言中類的是有嚴格的層次結構的。語言中類的是有嚴格的層次結構的。v除除Object類之外,每個類都繼承惟一的父類。這種繼承性類之外,每個類都繼承惟一的父類。這種繼承性性質使得類的層次結構形成了如圖所示的一種樹狀結構。性質使得類的層次結構形成了如圖所示的一種樹狀結構。vObject類定義和實現(xiàn)了類定義和實現(xiàn)了Java系統(tǒng)所需要的眾多類的共同行系統(tǒng)所需要的眾多類的共同行為,它是所有類的父類,也即這個樹狀結構中的根類,所為,它是所有類的父類,也即這個樹狀結構中的根類,所有的類都是由這個類繼承、擴充而來的,這個有的類都是由這個類繼承、擴充而來的,這個Object類定類定義在義
7、在java.lang包中。包中。 2022-4-20 0:51第第 8 頁頁4.1.2 類的層次Java語言中類的層次 結構結構2022-4-20 0:5194.2 繼承的實現(xiàn)2022-4-20 0:51第第 10 頁頁4.2.1 4.2.1 子類的定義子類的定義定義一個子類,即在定義一個類的時候加上定義一個子類,即在定義一個類的時候加上extends關關鍵字,并在之后帶上其父類名,其一般格式為:鍵字,并在之后帶上其父類名,其一般格式為: 類的修飾符類的修飾符 class extends ; ; 這和前面定義類的格式并沒有什么區(qū)別,只是現(xiàn)在這和前面定義類的格式并沒有什么區(qū)別,只是現(xiàn)在“exte
8、nds ”不再是可選項。不再是可選項。2022-4-20 0:51第第 11 頁頁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 頁頁4.2.1 4.2.1 子類的定義子類的定義電話及其子類的繼承關系 2022-4-20 0:51第第 13 頁頁4.2.1 4.2.1 子類的定
9、義子類的定義【例例4.2】 實現(xiàn)圖實現(xiàn)圖4.2中電話類的繼承結構。為了代碼的簡中電話類的繼承結構。為了代碼的簡潔,而把注意力集中在我們要討論的語法機制上,這里潔,而把注意力集中在我們要討論的語法機制上,這里假設移動電話僅一種,電話的計費方式為:國內長途話假設移動電話僅一種,電話的計費方式為:國內長途話費是市話費的費是市話費的3倍,國際長途話費是市話費的倍,國際長途話費是市話費的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 頁頁4.2.2 域的繼承與隱藏 v1. 域的繼承域的繼承v子類可以繼承父類的所有非私有域。例如各類電話類所包子類可以繼承父類的所有非私有域。例如各類電話類所包含的域分別為:含的域分別為:vMobile_Phone類類 vlong phoneNumber;vint local_Call;vint distan
11、ce_Call;vint international_Callvdouble balance; 來自繼承父類來自繼承父類Telephone的的5個基本域個基本域String networkType;2022-4-20 0:51第第 15 頁頁4.2.2 域的繼承與隱藏 IP_Phone類類 vlong phoneNumber;vint local_Call;vint distance_Call;vint international_Callvdouble balance; 來自繼承父類來自繼承父類Telephone的的5個基個基本域本域double monthFee;來自繼承父類來自繼承父類F
12、ixed_Telephone boolearn started; Date expireDate;子類子類IP_Phone類中聲明的域類中聲明的域2022-4-20 0:51第第 16 頁頁4.2.2 域的繼承與隱藏 Ordinary_phone類類 vlong phoneNumber;vint local_Call;vint distance_Call;vint international_Callvdouble balance; 來自繼承父類來自繼承父類Telephone的的5個基個基本域本域double monthFee;來自繼承父類來自繼承父類Fixed_Telephone boole
13、an longdistanceService;boolean internationalService; 子類子類Ordinary_phone類中聲明的域類中聲明的域2022-4-20 0:51第第 17 頁頁4.2.2 域的繼承與隱藏 v2. 域的隱藏域的隱藏v子類重新定義一個與從父類繼承來的域變量完全相同子類重新定義一個與從父類繼承來的域變量完全相同的變量,稱為域的隱藏。即子類中定義了與父類同名的變量,稱為域的隱藏。即子類中定義了與父類同名的域變量,就是子類變量對同名父類變量的隱藏。這的域變量,就是子類變量對同名父類變量的隱藏。這里所謂隱藏是指子類擁有了兩個相同名字的變量,一里所謂隱藏是指
14、子類擁有了兩個相同名字的變量,一個來自繼承父類,另一個由自己定義。在這種情況下,個來自繼承父類,另一個由自己定義。在這種情況下,當子類執(zhí)行繼承的父類方法時,處理的是父類的變量,當子類執(zhí)行繼承的父類方法時,處理的是父類的變量,而當子類執(zhí)行它自己定義的方法時,所操作的就是它而當子類執(zhí)行它自己定義的方法時,所操作的就是它自定義的變量,而把來自繼承父類的變量自定義的變量,而把來自繼承父類的變量“隱藏隱藏”起起來了。來了。2022-4-20 0:51第第 18 頁頁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 頁
16、頁4.2.2 域的繼承與隱藏 固定電話固定電話 電話類電話類 剩余金額、電話號碼 計費方式、查詢余額 座機費 計費方式 普通電話普通電話 是否接通長途 剩余金額 計費方式 隱藏父類的剩余金額例4.3 2022-4-20 0:51第第 20 頁頁4.2.3 方法的繼承與覆蓋 1. 方法的繼承方法的繼承父類的非私有方法可以被子類所繼承。根據(jù)方法的繼承關系,將例4.3中電話類及其各子類所包含的方法列舉如下。(1)Telephone類abstract boolean charge_Mode();double getBalance();(2)Fixed_Telephone類abstract boolea
17、n charge_Mode(); /來自繼承父類Telephonedouble getBalance(); /來自繼承父類Telephone(3)Ordinary_phone類boolean charge_Mode(); double getBelance(); /來自繼承父類Fixed_Telephone2022-4-20 0:51第第 21 頁頁4.2.3 方法的繼承與覆蓋v2. 方法的覆蓋方法的覆蓋方法的覆蓋(方法的覆蓋(Override)是指子類重定義從父類繼承來的一)是指子類重定義從父類繼承來的一個同名方法,此時父類的這個方法在子類中將不復存在。個同名方法,此時父類的這個方法在子類中
18、將不復存在。這是子類通過重新定義與父類同名的方法,實現(xiàn)自身的行這是子類通過重新定義與父類同名的方法,實現(xiàn)自身的行為。為。方法覆蓋時應遵循的原則方法覆蓋時應遵循的原則:(1)覆蓋后的方法不能比被覆蓋的方法有更嚴格的訪問權限。覆蓋后的方法不能比被覆蓋的方法有更嚴格的訪問權限。(2)覆蓋后的方法不能比被覆蓋的方法產生更多的異常覆蓋后的方法不能比被覆蓋的方法產生更多的異常。2022-4-20 0:51第第 22 頁頁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 頁頁4.2.3 方法的繼承與覆蓋v 覆蓋方法的調用覆蓋方法的調用 對于重寫的方法,對于重寫的方法,Java運行時系統(tǒng)根據(jù)調用該方法的實例運行時系統(tǒng)根據(jù)調用該方法的實例的類型來決定選擇哪個方法調用。的類型來決定選擇哪個方法調用。public class DemoCar p
20、ublic static void main( String args ) Car aCar = new Trash_Car( );aCar. push_break( ); 在這里,在這里, 類類Trash_Car中的中的push_break( )方方法將被調用。法將被調用。2022-4-20 0:51第第 24 頁頁4.2.3 方法的繼承與覆蓋v方法的覆蓋與域的隱藏的不同之處在于:子類隱藏父類的方法的覆蓋與域的隱藏的不同之處在于:子類隱藏父類的域只是使之不可見,父類的同名域在子類對象中仍然占有域只是使之不可見,父類的同名域在子類對象中仍然占有自己獨立的內存空間;而子類方法對父類同名方法的覆蓋
21、自己獨立的內存空間;而子類方法對父類同名方法的覆蓋將清除父類方法占用的內存空間,從而使父類方法在子類將清除父類方法占用的內存空間,從而使父類方法在子類對象中不復存在。對象中不復存在。v域的隱藏和方法的覆蓋的意義在于:通過隱藏域和覆蓋方域的隱藏和方法的覆蓋的意義在于:通過隱藏域和覆蓋方法可以把父類的狀態(tài)和行為改為自身的狀態(tài)和行為,對外法可以把父類的狀態(tài)和行為改為自身的狀態(tài)和行為,對外統(tǒng)一名字與接口,又不失其繼承性。統(tǒng)一名字與接口,又不失其繼承性。2022-4-20 0:51254.3 多 態(tài) 性2022-4-20 0:51第第 26 頁頁v多態(tài)性是面向對象程序設計的又一個重要的技術和手段。多態(tài)性
22、是面向對象程序設計的又一個重要的技術和手段。 v多態(tài)性是指同名的不同方法在程序中共存。即為同一個方多態(tài)性是指同名的不同方法在程序中共存。即為同一個方法定義幾個版本,運行時根據(jù)不同情況執(zhí)行不同的版本。法定義幾個版本,運行時根據(jù)不同情況執(zhí)行不同的版本。調用者只需使用同一個方法名,系統(tǒng)會根據(jù)不同情況,調調用者只需使用同一個方法名,系統(tǒng)會根據(jù)不同情況,調用相應的不同方法,從而實現(xiàn)不同的功能。用相應的不同方法,從而實現(xiàn)不同的功能。v多態(tài)性又被稱為多態(tài)性又被稱為“一個名字,多個方法一個名字,多個方法”。2022-4-20 0:51第第 27 頁頁4.3.1 4.3.1 多態(tài)性的概念多態(tài)性的概念多態(tài)性的實現(xiàn)
23、有兩種方式:多態(tài)性的實現(xiàn)有兩種方式:(1)覆蓋實現(xiàn)多態(tài)性)覆蓋實現(xiàn)多態(tài)性通過子類對繼承父類方法的重定義來實現(xiàn)。使用時注意:在通過子類對繼承父類方法的重定義來實現(xiàn)。使用時注意:在子類重定義父類方法時,要求與父類中方法的原型(參數(shù)個子類重定義父類方法時,要求與父類中方法的原型(參數(shù)個數(shù)、類型、順序)完全相同。數(shù)、類型、順序)完全相同。(2)重載實現(xiàn)多態(tài)性)重載實現(xiàn)多態(tài)性通過定義類中的多個同名的不同方法來實現(xiàn)。編譯時是根據(jù)通過定義類中的多個同名的不同方法來實現(xiàn)。編譯時是根據(jù)參數(shù)(個數(shù)、類型、順序)的不同來區(qū)分不同方法的。參數(shù)(個數(shù)、類型、順序)的不同來區(qū)分不同方法的。2022-4-20 0:51第第
24、 28 頁頁4.3.2 覆蓋實現(xiàn)多態(tài)性在覆蓋實現(xiàn)多態(tài)性的方式中,子類重定義父類方法,此時方在覆蓋實現(xiàn)多態(tài)性的方式中,子類重定義父類方法,此時方法的名字、參數(shù)個數(shù)、類型、順序完全相同,那么如何區(qū)別法的名字、參數(shù)個數(shù)、類型、順序完全相同,那么如何區(qū)別這些同名的不同方法呢?這些同名的不同方法呢?由于這些方法是存在于一個類層次結構的不同類中的,在調由于這些方法是存在于一個類層次結構的不同類中的,在調用方法時只需要指明調用哪個類(或對象)的方法,就很容用方法時只需要指明調用哪個類(或對象)的方法,就很容易把它們區(qū)分開來,其調用形式為:易把它們區(qū)分開來,其調用形式為: 對象名對象名.方法名方法名 類名類名
25、.方法名方法名例如,例如,IP電話的計費,若建立電話的計費,若建立IP_Phone類的對象類的對象my,其調用,其調用為:為: my.charge_Mode();假如假如charge_Mode()是一個類方法,則要使用類名,其調用為:是一個類方法,則要使用類名,其調用為: IP_Phone.charge_Mode(); 例例4.5 2022-4-20 0:51第第 29 頁頁4.3.3 重載實現(xiàn)多態(tài)性v通過重載來實現(xiàn),它是在通過重載來實現(xiàn),它是在同一個類同一個類中定義多個同名方法,這中定義多個同名方法,這些方法同名的原因是些方法同名的原因是具有類似的功能且目的相同具有類似的功能且目的相同,但在
26、實現(xiàn),但在實現(xiàn)該功能的具體方式和細節(jié)方面有所不同,因此需要定義多種該功能的具體方式和細節(jié)方面有所不同,因此需要定義多種不同的方法體。不同的方法體。 v由于重載發(fā)生在同一個類中,不能再用類名或對象名來區(qū)分由于重載發(fā)生在同一個類中,不能再用類名或對象名來區(qū)分不同的方法了,所以在重載中采用的區(qū)分方法是使用不同的不同的方法了,所以在重載中采用的區(qū)分方法是使用不同的形式參數(shù)表,包括形式參數(shù)的個數(shù)不同、類型不同或順序的形式參數(shù)表,包括形式參數(shù)的個數(shù)不同、類型不同或順序的不同。不同。v例如,在重載加法例如,在重載加法add(x,y)時,整數(shù)加法的形參類型是整時,整數(shù)加法的形參類型是整型,復數(shù)加法的形參類型是
27、復數(shù)型。根據(jù)填入的參數(shù)的類型型,復數(shù)加法的形參類型是復數(shù)型。根據(jù)填入的參數(shù)的類型或者參量等的不同,系統(tǒng)可以確定調用哪一個加法函數(shù)來完或者參量等的不同,系統(tǒng)可以確定調用哪一個加法函數(shù)來完成加法計算。成加法計算。 例例4.6 2022-4-20 0:51第第 30 頁頁4.3.4 多態(tài)性舉例多態(tài)性舉例多態(tài)性還可以是指在程序中需要使用父類對象的地方,都多態(tài)性還可以是指在程序中需要使用父類對象的地方,都可以用子類對象來代替??梢杂米宇悓ο髞泶?。例如:例如:public class Employee extends Objectpublic class Manager extends Employee
28、則:則:Employee e = new Manager(); /合法語句合法語句2022-4-20 0:51第第 31 頁頁4.3.4 多態(tài)性舉例多態(tài)性舉例v 對象狀態(tài)的確定對象狀態(tài)的確定在在Java語言中,提供了操作符語言中,提供了操作符instanceof用來判斷對象是否用來判斷對象是否屬于某個類的實例。屬于某個類的實例。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 構造方法的繼承與重載構造方法的繼承與重載2022-4-20 0:51第第 33 頁頁4.4.1 構造方法的重載v構造方法的重載是指同一個類中定義不同參數(shù)的多個構造方構造方法的重載是指同一個類中定義不同參數(shù)的多個構造方法,以完成不同情況下對象的初始化。法,以完成不同情況下對象的初始化。例如,例如,point類可定義不同的構造方法創(chuàng)建不同的點對象。類可定義不同的構造方法創(chuàng)建不同的點對象。point();/未初始化坐標未初始化坐標point(x);/初始化一個坐標初始化
30、一個坐標point(x, y);/初始化兩個坐標初始化兩個坐標一個類的若干個構造方法之間可以相互調用。當類中一個一個類的若干個構造方法之間可以相互調用。當類中一個構造方法需要調用另一個構造方法時,可以使用關鍵字構造方法需要調用另一個構造方法時,可以使用關鍵字this,并且這個調用語句應該是該構造方法的第一個可執(zhí)行語句。并且這個調用語句應該是該構造方法的第一個可執(zhí)行語句。2022-4-20 0:51第第 34 頁頁4.4.1 構造方法的重載【例例4.7】 對對Ordinary_phone類,可以根據(jù)需要定義幾個構類,可以根據(jù)需要定義幾個構造方法:造方法:Ordinary_phone( ) /無參
31、數(shù)的構造方法,對象的各域置為默認初始值無參數(shù)的構造方法,對象的各域置為默認初始值Ordinary_phone(boolean disService) this();/調自身的無參數(shù)的構造方法調自身的無參數(shù)的構造方法 longdistanceServicedisService; /確定是否開通國內長途電話確定是否開通國內長途電話Ordinary_phone(boolean disService, boolean intService) this(disService);/調自身的帶一個參數(shù)的構造方法調自身的帶一個參數(shù)的構造方法 internationalService = intService;
32、/國際長途電話國際長途電話2022-4-20 0:51第第 35 頁頁4.4.1 構造方法的重載vOrdinary_phone(boolean disService, boolean intService, double b) v /3個參數(shù)的構造方法個參數(shù)的構造方法v this(disService, intService);v /調自身的帶兩個參數(shù)的構造方法調自身的帶兩個參數(shù)的構造方法v balance =b; /設置話費金額設置話費金額vv使用使用this域來調用同類的其他構造方法,其優(yōu)點是可以最大域來調用同類的其他構造方法,其優(yōu)點是可以最大限度地提高對已有代碼的利用程度,提高程序的抽象
33、、封裝限度地提高對已有代碼的利用程度,提高程序的抽象、封裝程度,以及減少程序維護的工作量。程度,以及減少程序維護的工作量。2022-4-20 0:51第第 36 頁頁4.4.2 構造方法的繼承v子類可以繼承父類的構造方法,構造方法的繼承遵循以下原子類可以繼承父類的構造方法,構造方法的繼承遵循以下原則:則:v(1)子類無條件地繼承父類的無參數(shù)的構造方法。)子類無條件地繼承父類的無參數(shù)的構造方法。v(2)如果子類沒有定義構造方法,則它將繼承父類的無參)如果子類沒有定義構造方法,則它將繼承父類的無參數(shù)構造方法作為自己的構造方法;如果子類定義了構造方法,數(shù)構造方法作為自己的構造方法;如果子類定義了構造
34、方法,則在創(chuàng)建新對象時,將先執(zhí)行繼承的父類無參數(shù)構造方法,則在創(chuàng)建新對象時,將先執(zhí)行繼承的父類無參數(shù)構造方法,然后再執(zhí)行自己的構造方法。然后再執(zhí)行自己的構造方法。v(3)對于父類的帶參數(shù)構造方法,子類可以通過在自己的)對于父類的帶參數(shù)構造方法,子類可以通過在自己的構造方法中使用構造方法中使用supper關鍵字來調用它,但這個調用語句必關鍵字來調用它,但這個調用語句必須是子類構造方法的第一個可執(zhí)行語句。須是子類構造方法的第一個可執(zhí)行語句。v下面我們主要討論第下面我們主要討論第2和第和第3點。點。2022-4-20 0:51第第 37 頁頁4.4.2 構造方法的繼承v1. 父類與子類的構造方法的執(zhí)
35、行順序父類與子類的構造方法的執(zhí)行順序下面給出一個簡單示意性的例子。下面給出一個簡單示意性的例子?!纠?.6】 試分析下面程序的繼承關系以及構造試分析下面程序的繼承關系以及構造方法的調用順序。我們是否可以先不看執(zhí)行結果,方法的調用順序。我們是否可以先不看執(zhí)行結果,分析構造方法執(zhí)行順序是分析構造方法執(zhí)行順序是A()、B()、C()還是還是C()、B()、A()?例例4.62022-4-20 0:51第第 38 頁頁4.4.2 構造方法的繼承v2. 在構造方法中在構造方法中super關鍵字的使用關鍵字的使用super是表示父類對象的關鍵字,是表示父類對象的關鍵字,super表示當前對象的直表示當前
36、對象的直接父類,代表了當前父類對象的一個引用,其作用是利用接父類,代表了當前父類對象的一個引用,其作用是利用super可使用父類對象的方法或域??墒褂酶割悓ο蟮姆椒ɑ蛴颉ixed_Telephone( ) /無參數(shù)的構造方法無參數(shù)的構造方法Fixed_Telephone (long pn) phoneNumber = pn; /初始化電話號碼初始化電話號碼Fixed_ Telephone (long pn, double mf ) phoneNumber = pn; monthFee = mf; /初始化座機費初始化座機費Fixed_Telephone(long pn, double mf,
37、 double b) phoneNumber = pn; monthFee = mf; balance= b;/初始化電話費的剩余金額初始化電話費的剩余金額2022-4-20 0:51第第 39 頁頁4.4.2 構造方法的繼承設計子類的構造方法可選擇如下方式:設計子類的構造方法可選擇如下方式:(1)僅調用父類的無參數(shù)構造方法。)僅調用父類的無參數(shù)構造方法。(2)定義自己的一個(或多個)構造方法并調用父類的帶參)定義自己的一個(或多個)構造方法并調用父類的帶參數(shù)的構造方法。數(shù)的構造方法。 Fixed_Telephone( ) /無參數(shù)的構造方法無參數(shù)的構造方法Fixed_Telephone (l
38、ong pn) phoneNumber = pn; /初始化電話號碼初始化電話號碼Fixed_ Telephone (long pn, double mf ) phoneNumber = pn; monthFee = mf; /初始化座機費初始化座機費Fixed_Telephone(long pn, double mf, double b) phoneNumber = pn; monthFee = mf; balance= b;/初始化電話費的剩余金額初始化電話費的剩余金額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);/調用父類三調用父類三個參數(shù)的構造方法為繼承的域賦初值個參數(shù)的構造方法為繼承的域賦初值 longdistanceService = ds ;/用參數(shù)初始化自定用參數(shù)初始化自定義域義域2022-4-20 0:51第第 40 頁頁4.4.3 構造方法的綜合舉例綜合舉例構造方法的繼承與重載以及方法的覆蓋的綜合舉例。構造方法的繼承與重載以及方法的覆蓋的綜合舉例。 【例例4.8】 本例中使
40、用重載技術定義了本例中使用重載技術定義了Fixed_PhoneCsrd類的類的4個構造方個構造方法;使用繼承和重載技術定義了法;使用繼承和重載技術定義了Ordinary_phone類的兩個構類的兩個構造方法;使用覆蓋技術在造方法;使用覆蓋技術在Ordinary_phone類中覆蓋了父類的類中覆蓋了父類的getBalance()方法以及方法以及Object類的類的toString()方法。主類中創(chuàng)方法。主類中創(chuàng)建類的對象建類的對象myHomePhone時使用了第二個構造方法,并對時使用了第二個構造方法,并對大部分的域都進行初始化,大部分的域都進行初始化, 2022-4-20 0:51414.5
41、接 口2022-4-20 0:51第第 42 頁頁v接口(接口(interface)也有人翻譯為界面,是用來實現(xiàn)類間多重)也有人翻譯為界面,是用來實現(xiàn)類間多重繼承功能的一種結構。繼承功能的一種結構。v接口是在語法上與類有些相似。它定義了若干個抽象方法和接口是在語法上與類有些相似。它定義了若干個抽象方法和常量,形成一個屬性集合,該屬性集合通常對應了某一組功常量,形成一個屬性集合,該屬性集合通常對應了某一組功能。能。v凡是需要實現(xiàn)這種特定功能的類,都可以繼承并使用它。一凡是需要實現(xiàn)這種特定功能的類,都可以繼承并使用它。一個類只能直接繼承一個父類,但可以同時實現(xiàn)若干個接口。個類只能直接繼承一個父類,
42、但可以同時實現(xiàn)若干個接口。實現(xiàn)(或繼承)接口實際上就獲得了多個特殊父類的屬性,實現(xiàn)(或繼承)接口實際上就獲得了多個特殊父類的屬性,即實現(xiàn)了多重繼承。即實現(xiàn)了多重繼承。v接口定義的僅是實現(xiàn)某特定功能的一組對外接口和規(guī)范,而接口定義的僅是實現(xiàn)某特定功能的一組對外接口和規(guī)范,而這個功能的真正實現(xiàn)是在繼承這個接口的各類中完成的。這個功能的真正實現(xiàn)是在繼承這個接口的各類中完成的。2022-4-20 0:51第第 43 頁頁4.5.1 4.5.1 接口與多繼承接口與多繼承所謂多重繼承,是指一個子類可以有一個以上的直接父類,所謂多重繼承,是指一個子類可以有一個以上的直接父類,該子類可以繼承它所有的直接父類的
43、屬性。該子類可以繼承它所有的直接父類的屬性。 接口定義的僅僅是實現(xiàn)某一特定功能的一組對外的協(xié)議和規(guī)接口定義的僅僅是實現(xiàn)某一特定功能的一組對外的協(xié)議和規(guī)范,而并沒有真正地實現(xiàn)這個功能。這些功能的真正實現(xiàn)是范,而并沒有真正地實現(xiàn)這個功能。這些功能的真正實現(xiàn)是在繼承這個接口的各個類中完成的。在繼承這個接口的各個類中完成的。因為接口包含的是未實現(xiàn)的一些抽象的方法,它與抽象類有因為接口包含的是未實現(xiàn)的一些抽象的方法,它與抽象類有些相象。研究一下接口與抽象類到底有什么區(qū)別是很有意義些相象。研究一下接口與抽象類到底有什么區(qū)別是很有意義的。它們之間存在以下的區(qū)別:的。它們之間存在以下的區(qū)別: 接口不能有任何實
44、現(xiàn)了的方法,而抽象類可以。接口不能有任何實現(xiàn)了的方法,而抽象類可以。 類可以繼承(實現(xiàn))許多接口,但只能繼承一個父類。類可以繼承(實現(xiàn))許多接口,但只能繼承一個父類。 類有嚴格的層次結構,而接口沒有層次結構,沒有聯(lián)系的類類有嚴格的層次結構,而接口沒有層次結構,沒有聯(lián)系的類可以實現(xiàn)相同的接口??梢詫崿F(xiàn)相同的接口。 2022-4-20 0:51第第 44 頁頁4.5.2 接口的定義v接口是由常量和抽象方法組成的特殊類。接口的定義包括兩個部分:接口聲明和接口體。聲明接口一般格式如下:vpublic interface 接口名 extends 父接口名表 v 域類型 域名常量值;/常量域聲明v 返回類
45、型 方法名(參數(shù)表);/抽象方法聲明vv接口聲明中有兩個部分是必需的:interface關鍵字和接口的名字。用public修飾的接口是公共接口,可以被所有的類和接口使用;沒有public修飾符的接口則只能被同一個包中的其他類和接口利用。2022-4-20 0:51第第 45 頁頁4.5.3 接口的實現(xiàn)為了使用接口,要編寫實現(xiàn)接口的類。實現(xiàn)某一個接口,在類的聲為了使用接口,要編寫實現(xiàn)接口的類。實現(xiàn)某一個接口,在類的聲明中要包括一條明中要包括一條implements語句。一個類可以實現(xiàn)多個接口,可以語句。一個類可以實現(xiàn)多個接口,可以在在implements后面列出要實現(xiàn)的多個接口,這些接口以逗號分
46、隔。后面列出要實現(xiàn)的多個接口,這些接口以逗號分隔。一個類實現(xiàn)某個接口,那么這個類就應提供在接口中定義的所有抽一個類實現(xiàn)某個接口,那么這個類就應提供在接口中定義的所有抽象方法的具體實現(xiàn)。象方法的具體實現(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 頁頁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 接口的實現(xiàn)2
48、022-4-20 0:51第第 47 頁頁v實現(xiàn)接口時應注意的問題:實現(xiàn)接口時應注意的問題:(1)在類的聲明部分,用)在類的聲明部分,用implements關鍵字聲明該類將要實關鍵字聲明該類將要實現(xiàn)哪些接口?,F(xiàn)哪些接口。(2)類在實現(xiàn)抽象方法時,必須用)類在實現(xiàn)抽象方法時,必須用public修飾符。修飾符。(3)除抽象類以外,在類的定義部分必須為接口中所有的抽)除抽象類以外,在類的定義部分必須為接口中所有的抽象方法定義方法體,且方法首部應該與接口中的定義完全一象方法定義方法體,且方法首部應該與接口中的定義完全一致。致。(4)若實現(xiàn)某接口的類是)若實現(xiàn)某接口的類是abstract的抽象類,則它可
49、以不實的抽象類,則它可以不實現(xiàn)該接口所有的方法。但是對于這個抽象類的任何一個非抽現(xiàn)該接口所有的方法。但是對于這個抽象類的任何一個非抽象子類,不允許存在未被實現(xiàn)的接口方法。即非抽象類中不象子類,不允許存在未被實現(xiàn)的接口方法。即非抽象類中不能存在抽象方法。能存在抽象方法。4.5.3 接口的實現(xiàn)2022-4-20 0:51第第 48 頁頁4.5.4 接口的使用 如果一個接口需要擴充,可以創(chuàng)建新的接口來繼承老接口。如果一個接口需要擴充,可以創(chuàng)建新的接口來繼承老接口。比如,可以比如,可以StockWatcher接口需要增加一個方法,則可以創(chuàng)建接口需要增加一個方法,則可以創(chuàng)建一個子接口一個子接口Stock
50、Tracker: public interface StockTracker extends StockWatcher void currentValue(String tickerSymbol,double newValue); 接口除了被繼承和實現(xiàn)之外,還可以作為一種類型來使用接口除了被繼承和實現(xiàn)之外,還可以作為一種類型來使用當定義一個新的接口的時候,實際上是定義了一個新的引用數(shù)當定義一個新的接口的時候,實際上是定義了一個新的引用數(shù)據(jù)類型。在可以使用其他類型的名字(如變量聲明、方法參數(shù)據(jù)類型。在可以使用其他類型的名字(如變量聲明、方法參數(shù)等)的地方,都可使用這個接口名。等)的地方,都可使用
51、這個接口名。 例如,在例如,在StockMonitor類中的類中的watchStock()方法中的第一個方法中的第一個參數(shù)的數(shù)據(jù)類型為參數(shù)的數(shù)據(jù)類型為StockWatcher接口。只有實現(xiàn)接口。只有實現(xiàn)StockWatcher接口的類對象可以替代接口的類對象可以替代watcher形參。形參。 哲學家哲學家2022-4-20 0:51494.6 4.6 抽象類、接口和抽象類、接口和ObjectObject類的應類的應用用2022-4-20 0:51第第 50 頁頁v假設有若干假設有若干 (如如1000)個)個Circle,Rectangle以及若干個其他以及若干個其他形狀,希望計算它們的總面積,
52、直截了當?shù)淖龇ㄊ菍⑺鼈兎中螤?,希望計算它們的總面積,直截了當?shù)淖龇ㄊ菍⑺鼈兎謩e放到多個數(shù)組中,分別循環(huán)求出各形狀的面積,然后累加,別放到多個數(shù)組中,分別循環(huán)求出各形狀的面積,然后累加,這種做法是不漂亮的。這種做法是不漂亮的。v如果還有其它形狀:如果還有其它形狀:triangle,ellipses等,上述方法顯得等,上述方法顯得“累贅累贅”。我們希望有一種統(tǒng)一的表示,例如用一個數(shù)組。我們希望有一種統(tǒng)一的表示,例如用一個數(shù)組shape,接受所有的形狀,然后用:,接受所有的形狀,然后用:for (i=0; ishape.length; i+) area_total += shapei.area();
53、2022-4-20 0:51第第 51 頁頁首先看看首先看看Circle和和Rectangle兩個類,如何完成相關參數(shù)的計算兩個類,如何完成相關參數(shù)的計算 class Circle public float r; Circle(float r) this.r = r; /this指指這個對象的這個對象的 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 頁頁4.6.1 4.6.1 用抽象類實現(xiàn)多種形狀面積的累加用抽象類實現(xiàn)多種形狀面積的累加v現(xiàn)在要利用抽象類實現(xiàn)多種形狀面積的累加,確保每現(xiàn)在要利用抽象類實現(xiàn)多種形狀面積的累加,確保每種形狀分別用不同的方法來計算它們的面積和周長。種形狀分別用不同的方法來計算它們的面積和周長。因此,超類因此,超類Shape包含抽象方法包含抽象方法computeArea,然后在,然后在不同的子類中實現(xiàn)和覆蓋這個方法。不同的子類中實現(xiàn)和覆蓋這個方法。v假定聲明了假定聲明了1000個個Shape對象的數(shù)組,然后循環(huán)對象的數(shù)組,然
55、后循環(huán)1000次隨機產生次隨機產生1000個平面圖形對象,形狀為圓、矩形、個平面圖形對象,形狀為圓、矩形、正方形三種之一。正方形三種之一。 2022-4-20 0:51第第 53 頁頁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指指這個對象的這個對象的 public float computeArea() return 3.14*r*r; 實例實例2022-4-20 0:51第第 54 頁頁4.6.2 4.6.2 用接口實現(xiàn)多種形狀面積的累加用接口實現(xiàn)多種形狀面積的累加 v用接口的方式實現(xiàn)多種形狀面積的累加,需要將用抽象用接口的方式實現(xiàn)多種形狀面積的累加,需要將用抽象類表示的類表示的Shape類改成接口。由于接口的語法定義要求,類改成接口。由于接口的語法定義要求,我們要把原來抽象類中的成員變量去掉,成員方法改成抽我們要把原來抽象類中的成員變量去掉,成員方法改成抽象方法象方法computeArea(),該方法返回一個,該方法返回一個double類型。所類型。所以,這個接口定義為:以,這個接口定義為:vpublic interface Shape2v public abstract double computeArea();v public abstract String toString();v2022-4-20 0:51第第 55
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 體育交流合同范本
- 2024年中國太平洋人壽保險股份有限公司招聘筆試真題
- 買賣物品合同范本
- 2024年內蒙古興安盟實驗高中教師招聘考試真題
- 2024年納雍縣鴿子花農業(yè)有限公司招聘考試真題
- 農夫山泉公司勞動合同范本
- 創(chuàng)業(yè)投資協(xié)議合同范本
- 2024年河南省黃河科技學院附屬醫(yī)院招聘考試真題
- 公司系統(tǒng)服務合同范本
- 全體村民土地流轉合同范本
- 光伏電站安全培訓課件
- 小學生勤儉節(jié)約課件
- 化工行業(yè)生產過程安全管理升級策略方案
- 慢性胰腺炎病教學查房
- 中考英語復習閱讀理解-主旨大意題、推理判斷題
- 電解質溶液的圖像分析(原卷版)-2025年高考化學一輪復習講義(新教材新高考)
- 2025年中考歷史一輪復習知識清單:隋唐時期
- 【生物】蒸騰作用- 2024-2025學年七年級上冊生物(北師大版2024)
- 摩根大通金融科技支出
- 《井巷掘進作業(yè)》課件
- 銀行保安服務 投標方案(技術方案)
評論
0/150
提交評論