第5章java接口與多態(tài)課件_第1頁
第5章java接口與多態(tài)課件_第2頁
第5章java接口與多態(tài)課件_第3頁
第5章java接口與多態(tài)課件_第4頁
第5章java接口與多態(tài)課件_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第5章 接口與多態(tài)5.1 接口5.2 塑型5.3 多態(tài)的概念5.4 多態(tài)的應(yīng)用5.5 構(gòu)造方法與多態(tài)5.6 內(nèi)部類5.7 本章小結(jié)15.1 接口接口與抽象類一樣都是定義多個(gè)類的共同屬性使抽象的概念更深入了一層,是一個(gè)“純”抽象類,它只提供一種形式,并不提供實(shí)現(xiàn)允許創(chuàng)建者規(guī)定方法的基本形式:方法名、參數(shù)列表以及返回類型,但不規(guī)定方法主體也可以包含基本數(shù)據(jù)類型的數(shù)據(jù)成員,但它們都默認(rèn)為static和final25.1.1 接口的作用及語法接口的作用是面向?qū)ο蟮囊粋€(gè)重要機(jī)制實(shí)現(xiàn)多繼承,同時(shí)免除C+中的多繼承那樣的復(fù)雜性建立類和類之間的“協(xié)議”把類根據(jù)其實(shí)現(xiàn)的功能來分別代表,而不必顧慮它所在的類繼承層

2、次;這樣可以最大限度地利用動(dòng)態(tài)綁定,隱藏實(shí)現(xiàn)細(xì)節(jié)實(shí)現(xiàn)不同類之間的常量共享3接口允許我們?cè)诳雌饋聿幌喔傻膶?duì)象之間定義共同行為5.1.1 接口的作用及語法與抽象類的不同4保險(xiǎn)公司的例子具有車輛保險(xiǎn)、人員保險(xiǎn)、公司保險(xiǎn)等多種保險(xiǎn)業(yè)務(wù),在對(duì)外提供服務(wù)方面具有相似性,如都需要計(jì)算保險(xiǎn)費(fèi)(premium)等,因此可聲明一個(gè)Insurable 接口在UML圖中,實(shí)現(xiàn)接口用帶有空三角形的虛線表示5.1.1 接口的作用及語法例5_1InsurableCompanyPersonCar5接口的語法聲明格式為接口修飾符 interface 接口名稱 extends 父接口名/方法的原型聲明或靜態(tài)常量接口的數(shù)據(jù)成員一定

3、要賦初值,且此值將不能再更改,允許省略final關(guān)鍵字接口中的方法必須是“抽象方法”,不能有方法體,允許省略public及abstract關(guān)鍵字5.1.1 接口的作用及語法6例5.1中的Insurable 接口聲明如下,可見其中的方法都是抽象方法 public interface Insurable public int getNumber(); public int getCoverageAmount(); public double calculatePremium(); public Date getExpiryDate(); 5.1.1 接口的作用及語法例5_1保險(xiǎn)接口的聲明7聲明一個(gè)

4、接口Shape2D,可利用它來實(shí)現(xiàn)二維的幾何形狀類Circle和Rectangle把計(jì)算面積的方法聲明在接口里pi值是常量,把它聲明在接口的數(shù)據(jù)成員里interface Shape2D /聲明Shape2D接口 final double pi=3.14; /數(shù)據(jù)成員一定要初始化 public abstract double area();/抽象方法在接口的聲明中,允許省略一些關(guān)鍵字,也可聲明如下interface Shape2D double pi=3.14; double area(); 5.1.1 接口的作用及語法例5_285.1.2 實(shí)現(xiàn)接口接口的實(shí)現(xiàn)接口不能用new運(yùn)算符直接產(chǎn)生對(duì)象,

5、必須利用其特性設(shè)計(jì)新的類,再用新類來創(chuàng)建對(duì)象利用接口設(shè)計(jì)類的過程,稱為接口的實(shí)現(xiàn),使用implements關(guān)鍵字語法如下public class 類名稱 implements 接口名稱 /* Bodies for the interface methods */ /* Own data and methods. */ 必須實(shí)現(xiàn)接口中的所有方法來自接口的方法必須聲明成public9實(shí)現(xiàn)接口Insurable,聲明汽車類實(shí)現(xiàn)例5.1中的Insurable接口,實(shí)現(xiàn)接口中的所有抽象方法public class Car implements Insurable public int getPolicy

6、Number() / write code here public double calculatePremium() / write code here public Date getExpiryDate() / write code here public int getCoverageAmount() / write code here public int getMileage() /新添加的方法 /write code here 5.1.2 實(shí)現(xiàn)接口 例5_310對(duì)象可以被轉(zhuǎn)型為其所屬類實(shí)現(xiàn)的接口類型getPolicyNumber、calculatePremium是Insurable

7、接口中聲明的方法getMileage是Car類新添加的方法,Insurable接口中沒有聲明此方法Car jetta = new Car(); Insurable item = (Insurable)jetta; /對(duì)象轉(zhuǎn)型為接口類型 item.getPolicyNumber();item.calculatePremium(); item.getMileage(); / 接口中沒有聲明此方法,不可以jetta.getMileage(); / 類中有此方法,可以(Car)item).getMileage(); / 轉(zhuǎn)型回原類,可調(diào)用此方法了5.1.2 實(shí)現(xiàn)接口對(duì)象轉(zhuǎn)型115.1.2 實(shí)現(xiàn)接口 例

8、5_4class Circle implements Shape2D double radius; public Circle(double r) radius=r; public double area() return (pi * radius * radius); class Rectangle implements Shape2D int width,height; public Rectangle(int w,int h) width=w; height=h; public double area() return (width * height); 聲明Circle與Rectang

9、le兩個(gè)類實(shí)現(xiàn)Shape2D接口12測試類public class InterfaceTester public static void main(String args) Rectangle rect=new Rectangle(5,6); System.out.println(Area of rect = + rect.area(); Circle cir=new Circle(2.0); System.out.println(Area of cir = + cir.area(); 運(yùn)行結(jié)果Area of rect = 30.0Area of cir = 12.565.1.2 實(shí)現(xiàn)接口例5

10、_4運(yùn)行結(jié)果13聲明接口類型的變量,并用它來訪問對(duì)象public class VariableTester public static void main(String args) Shape2D var1,var2;var1=new Rectangle(5,6);System.out.println(Area of var1 = + var1.area();var2=new Circle(2.0);System.out.println(Area of var2 = + var2.area();輸出結(jié)果Area of var1 = 30.0Area of var2 = 12.565.1.2 實(shí)

11、現(xiàn)接口例5_514MovableObject接口定義了所有“可移動(dòng)對(duì)象”能做的事情public interface MovableObject public boolean start(); public void stop(); public boolean turn(int degrees); public double fuelRemaining(); public void changeSpeed(double kmPerHour);5.1.2 實(shí)現(xiàn)接口MovableObject接口15Plane、Car、 Train、 Boat 分別實(shí)現(xiàn) MovableObject 接口public

12、 class Plane implements MovableObject public int seatCapacity; public Company owner; public DatelastRepairDate; /實(shí)現(xiàn)MovalbelObject接口的所有方法 public boolean start() /啟動(dòng)飛機(jī),成功則返回true public void stop() /停止 public boolean turn(int degrees) /轉(zhuǎn)向,成功則返回true public double fuelRemaining() /返回燃料剩余量 public void cha

13、ngeSpeed(double kmPerHour) /改變速度 /plane類自己的方法: public Date getLastRepairDate() /. public double calculateWindResistance() /. 5.1.2 實(shí)現(xiàn)接口MovableObject接口的實(shí)現(xiàn)16為 MovableObjects安裝遙控器(remote control)public class RemoteControl private MovableObjectmachine; RemoteControl(MovableObject m) machine = m; /按下“啟動(dòng)”

14、按鈕: public void start() boolean okay = machine.start(); if (!okay) display(No Response on start); /. remote control 構(gòu)造方法的形參類型為 MovableObject,它可以是Plane, Car, Train, Boat, 等等5.1.2 實(shí)現(xiàn)接口RemoteControl類175.1.3 多重繼承多重繼承Java的設(shè)計(jì)以簡單實(shí)用為導(dǎo)向,不允許一個(gè)類有多個(gè)父類但允許一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,通過這種機(jī)制可實(shí)現(xiàn)多重繼承一個(gè)類實(shí)現(xiàn)多個(gè)接口的語法如下類修飾符 class 類名稱 impl

15、ements 接口1,接口2, 18Car類可以實(shí)現(xiàn)接口Insurable,Drivable,Sellablepublic class Car implements Insurable, Drivable, Sellable . 5.1.3 多重繼承Car的例子19聲明Circle類實(shí)現(xiàn)接口Shape2D和ColorShape2D具有pi與area()方法,用來計(jì)算面積Color則具有setColor方法,可用來賦值顏色通過實(shí)現(xiàn)這兩個(gè)接口,Circle類得以同時(shí)擁有這兩個(gè)接口的成員,達(dá)到了多重繼承的目的interface Shape2D /聲明Shape2D接口 final double pi

16、=3.14; /數(shù)據(jù)成員一定要初始化 public abstract double area(); /抽象方法interface Color void setColor(String str); /抽象方法5.1.3 多重繼承例5_620class Circle implements Shape2D,Color / 實(shí)現(xiàn)Circle類 double radius; String color; public Circle(double r) /構(gòu)造方法 radius=r; public double area() /定義area()的處理方式 return (pi*radius*radius);

17、 public void setColor(String str) /定義setColor()的處理方式 color=str; System.out.println(color=+color); 5.1.3 多重繼承例5_621測試類public class MultiInterfaceTester public static void main(String args) Circle cir; cir=new Circle(2.0); cir.setColor(blue); System.out.println(Area = + cir.area(); 輸出結(jié)果color=blueArea

18、= 12.565.1.3 多重繼承 例5_6運(yùn)行結(jié)果225.1.4 接口的擴(kuò)展接口的擴(kuò)展接口可通過擴(kuò)展的技術(shù)派生出新的接口原來的接口稱為基本接口(base interface)或父接口(super interface)派生出的接口稱為派生接口(derived interface)或子接口(sub interface)派生接口不僅可以保有父接口的成員,同時(shí)也可加入新成員以滿足實(shí)際問題的需要實(shí)現(xiàn)接口的類也必須實(shí)現(xiàn)此接口的父接口接口擴(kuò)展的語法interface 子接口的名稱 extends 父接口的名稱1,父接口的名稱2, 23Shape是父接口,Shape2D與Shape3D是其子接口。Circl

19、e類及Rectangle類實(shí)現(xiàn)接口Shape2D,而Box類及Sphere類實(shí)現(xiàn)接口Shape3D5.1.4 接口的擴(kuò)展例5_7Shape接口Shape2D接口Shape3D接口Sphere類Box類Rectangle類Circle類24部分代碼如下/ 聲明Shape接口interface Shape double pi=3.14; void setColor(String str); /聲明Shape2D接口擴(kuò)展了Shape接口interface Shape2D extends Shape double area();5.1.4 接口的擴(kuò)展例5_725class Circle impleme

20、nts Shape2D double radius; String color; public Circle(double r) radius=r; public double area() return (pi*radius*radius); public void setColor(String str) color=str; System.out.println(color=+color); public class ExtendsInterfaceTester /測試類 public static void main(String args) Circle cir; cir=new C

21、ircle(2.0); cir.setColor(blue); System.out.println(Area = + cir.area(); 5.1.4 接口的擴(kuò)展例5_726運(yùn)行結(jié)果color=blueArea = 12.56說明首先聲明了父接口Shape,然后聲明其子接口Shape2D之后聲明類Circle實(shí)現(xiàn)Shape2D子接口,因而在此類內(nèi)必須明確定義setColor()與area()方法的處理方式最后在主類中我們聲明了Circle類型的變量cir并創(chuàng)建新的對(duì)象,最后通過cir對(duì)象調(diào)用setColor()與area()方法5.1.4 接口的擴(kuò)展例5_7運(yùn)行結(jié)果27FixedInsur

22、able 和DepreciatingInsurable接口都繼承了Insurable接口實(shí)現(xiàn)它們類也必須實(shí)現(xiàn)Insurable接口中的所有方法public interface DepreciatingInsurable extends Insurable public double computeFairMarketValue(); public interface FixedInsurable extends Insurable public int getEvaluationPeriod();5.1.4 接口的擴(kuò)展 Insurable接口的例子285.2 塑型塑型(type-casting

23、)又稱為類型轉(zhuǎn)換方式隱式(自動(dòng))的類型轉(zhuǎn)換顯式(強(qiáng)制)的類型轉(zhuǎn)換295.2.1 塑型的概念塑型的對(duì)象包括基本數(shù)據(jù)類型將值從一種形式轉(zhuǎn)換成另一種形式引用變量將對(duì)象暫時(shí)當(dāng)成更一般的對(duì)象來對(duì)待,并不改變其類型只能被塑型為任何一個(gè)父類類型對(duì)象所屬的類實(shí)現(xiàn)的一個(gè)接口被塑型為父類或接口后,再被塑型回其本身所在的類30Manager對(duì)象可以被塑型為Employee、Person、Object或Insurable,不能被塑型為Customer、Company或Car ObjectPersonEmployeeCustomerManagerCompanyCarInsurable5.2.1 塑型的概念一個(gè)例子31基

24、本數(shù)據(jù)類型相容類型之間存儲(chǔ)容量低的自動(dòng)向存儲(chǔ)容量高的類型轉(zhuǎn)換引用變量被塑型成更一般的類Employee emp; emp = new Manager(); /將Manager類型的對(duì)象直接賦給 /Employee類的引用變量,系統(tǒng)會(huì) /自動(dòng)將Manage對(duì)象塑型為Employee類被塑型為對(duì)象所屬類實(shí)現(xiàn)的接口類型Car jetta = new Car(); Insurable item = jetta; 5.2.1 塑型的概念 隱式(自動(dòng))的類型轉(zhuǎn)換325.2.1 塑型的概念 顯式(強(qiáng)制)的類型轉(zhuǎn)換基本數(shù)據(jù)類型(int)871.34354; / 結(jié)果為 871 (char)65; / 結(jié)果為A

25、 (long)453; / 結(jié)果為453L引用變量:還原為本來的類型Employee emp; Manager man;emp = new Manager();man = (Manager)emp; /將emp強(qiáng)制塑型為本來的類型335.2.2 塑型的應(yīng)用塑型應(yīng)用的場合包括賦值轉(zhuǎn)換賦值號(hào)右邊的表達(dá)式類型或?qū)ο筠D(zhuǎn)換為左邊的類型方法調(diào)用轉(zhuǎn)換實(shí)參的類型轉(zhuǎn)換為形參的類型算數(shù)表達(dá)式轉(zhuǎn)換算數(shù)混合運(yùn)算時(shí),不同類型的項(xiàng)轉(zhuǎn)換為相同的類型再進(jìn)行運(yùn)算字符串轉(zhuǎn)換字符串連接運(yùn)算時(shí),如果一個(gè)操作數(shù)為字符串,一個(gè)操作數(shù)為數(shù)值型,則會(huì)自動(dòng)將數(shù)值型轉(zhuǎn)換為字符串 34當(dāng)一個(gè)類對(duì)象被塑型為其父類后,它提供的方法會(huì)減少當(dāng)Manage

26、r對(duì)象被塑型為Employee之后,它只能接收getName()及getEmployeeNumber()方法,不能接收getSalary()方法將其塑型為本來的類型后,又能接收getSalary()方法了5.2.2 塑型的應(yīng)用355.2.3 方法的查找如果在塑型前和塑型后的類中都提供了相同的方法,如果將此方法發(fā)送給塑型后的對(duì)象,那么系統(tǒng)將會(huì)調(diào)用哪一個(gè)類中的方法?實(shí)例方法的查找類方法的查找36從對(duì)象創(chuàng)建時(shí)的類開始,沿類層次向上查找 Manager man = new Manager(); Employee emp1 = new Employee(); Employee emp2 = (Emplo

27、yee)man; putePay(); / 調(diào)用Employee類中的computePay()方法 putePay(); / 調(diào)用Manager類中的computePay()方法 putePay(); / 調(diào)用Manager類中的computePay()方法 5.2.3 方法的查找 實(shí)例方法的查找37總是在引用變量聲明時(shí)所屬的類中進(jìn)行查找 Manager man = new Manager(); Employee emp1 = new Employee(); Employee emp2 = (Employee)man; man.expenseAllowance(); /in Manager e

28、mp1.expenseAllowance(); /in Employee emp2.expenseAllowance(); /in Employee! 5.2.3 方法的查找類方法的查找385.3 多態(tài)的概念多態(tài)是指不同類型的對(duì)象可以響應(yīng)相同的消息從相同的基類派生出來的多個(gè)類型可被當(dāng)作同一種類型對(duì)待,可對(duì)這些不同的類型進(jìn)行同樣的處理,由于多態(tài)性,這些不同派生類對(duì)象響應(yīng)同一方法時(shí)的行為是有所差別的 例如所有的Object類的對(duì)象都響應(yīng)toString()方法所有的BankAccount類的對(duì)象都響應(yīng)deposit()方法395.3.1 多態(tài)的目的多態(tài)的目的所有的對(duì)象都可被塑型為相同的類型,響應(yīng)相

29、同的消息使代碼變得簡單且容易理解使程序具有很好的“擴(kuò)展性”40繪圖直接的方式希望能夠畫出任意子類型對(duì)象的形狀,可以在Shape 類中聲明幾個(gè)繪圖方法,對(duì)不同的實(shí)際對(duì)象,采用不同的畫法if (aShape instanceof Circle) aShape.drawCircle(); if (aShape instanceof Triangle) aShape.drawTriangle(); if (aShape instanceof Rectangle)aShape.drawRectangle();5.3.1 多態(tài)的目的一個(gè)例子41繪圖更好的方式在每個(gè)子類中都聲明同名的draw()方法以后繪圖可如下進(jìn)行Shape s = new Circle(); s.draw(); Circle屬于Shape的一種,系統(tǒng)會(huì)執(zhí)行自動(dòng)塑型當(dāng)調(diào)用方法draw時(shí),實(shí)際調(diào)用的是Circle.draw()在程序運(yùn)行時(shí)才進(jìn)行綁定,接下來介紹綁定的概念5.3.1 多態(tài)的目的一個(gè)例子425.3.2 綁定的概念綁定指將一個(gè)方法調(diào)用同一個(gè)方法主體連接到一起根據(jù)綁定時(shí)期的不同,可分為早期綁定程序運(yùn)行之前執(zhí)行綁定晚期綁定也叫作“動(dòng)態(tài)綁定”或“運(yùn)行期綁定基于對(duì)象的類別,在程序運(yùn)行時(shí)執(zhí)行綁定43仍以繪圖為例,所有類都放在binding包中基類Shape建

溫馨提示

  • 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)論