JAVA與面向?qū)ο蟪绦蛟O(shè)計_05類的繼承和派生_第1頁
JAVA與面向?qū)ο蟪绦蛟O(shè)計_05類的繼承和派生_第2頁
JAVA與面向?qū)ο蟪绦蛟O(shè)計_05類的繼承和派生_第3頁
JAVA與面向?qū)ο蟪绦蛟O(shè)計_05類的繼承和派生_第4頁
JAVA與面向?qū)ο蟪绦蛟O(shè)計_05類的繼承和派生_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第五章第五章 類的繼承和派生類的繼承和派生Inheritance/extends/derive教學(xué)目標(biāo)教學(xué)目標(biāo)n理解繼承的概念和作用n派生類的定義n理解訪問修飾符protectedn方法的重寫n繼承下的構(gòu)造函數(shù)的使用n繼承下的finalize方法的使用n理解超類和子類的關(guān)系5.1 繼承的概念和軟件的重用性繼承的概念和軟件的重用性n繼承是從已有的類中派生出新的類。n新的類能吸收已有類的數(shù)據(jù)屬性和行為;n并能擴(kuò)展新的能力。n類和類之間的繼承關(guān)系可以用UML符號表示如圖5-1,n父類又叫超類或基類,n子類又叫派生類。n父類是子類的一般化,子類是父類的特化(具體化)。超類或基類父類子類派生類圖5-1

2、繼承關(guān)系super/base/parentchild/derived5.1 繼承的概念和軟件的重用性繼承的概念和軟件的重用性n如表5-1所示,列出了幾個超類和子類的實(shí)際例子。超類或基類父類子類派生類圖5-1 繼承關(guān)系超 類子 類學(xué)生研究生、本科生、小學(xué)生形狀三角形、圓、矩形雇員教師、醫(yī)生、職員交通工具轎車、卡車、公交車水果蘋果、梨、桃、桔表表5-1 繼承例子繼承例子n“is-a” 關(guān)系: 是類之間的繼承關(guān)系。 子類的對象可當(dāng)作超類對象子類的對象可當(dāng)作超類對象。但反過來,不能把超類對象可當(dāng)作子類對象。 例如,轎車可看成是交通工具,但不能把交通工具看成就是轎車。n“has-a”關(guān)系:代表類之間的組

3、合(參見4.9節(jié))。在“has-a”關(guān)系中一個對象包含一個或多個其他對象的引用成員。 如,轎車由方向盤、輪子、發(fā)動機(jī)等組成。5.1 繼承的概念和軟件的重用性(續(xù))繼承的概念和軟件的重用性(續(xù)) n繼承分為單繼承和多繼承。n單繼承是指一個子類最多只能有一個父類。n多繼承是一個子類可有二個以上的父類。由于多繼承會帶來二義性,在實(shí)際應(yīng)用中應(yīng)盡量使用單繼承。nJava類只支持單繼承,而接口支持多繼承。類只支持單繼承,而接口支持多繼承。5.1 繼承的概念和軟件的重用性(續(xù))繼承的概念和軟件的重用性(續(xù)) objectWinDialogWin單繼承,in javaClass 1Class 4Class 2

4、Class 3多繼承多繼承,in C+單繼承與多繼承例子單繼承與多繼承例子5.1 繼承的概念和軟件的重用性(續(xù))繼承的概念和軟件的重用性(續(xù))n繼承使軟件的代碼得到重用。n在繼承關(guān)系中,n子類通過吸收已有類的數(shù)據(jù)(屬性)和方法(行為)n并增加新功能或修改已有功能來創(chuàng)建新類。n軟件的重用性不僅節(jié)省了程序的開發(fā)時間,還促進(jìn)了經(jīng)過驗(yàn)證和調(diào)試的高質(zhì)量軟件的重用,這增加實(shí)現(xiàn)系統(tǒng)的效率。n在java中,Object類定義和實(shí)現(xiàn)了Java系統(tǒng)所需要的眾多類的共同行為,它是所有類的根類,所有的類都是由這個類繼承、擴(kuò)充而來的。5.2 派生類的定義派生類的定義n派生類定義的一般格式為: 類修飾符 class 子類

5、名 extends 父類名 成員變量定義; 成員方法定義;派生類的定義中,用關(guān)鍵字extends來明確指出它所繼承的超類。n例5-1 通過繼承來定義派生類5.2 派生類的定義(續(xù))派生類的定義(續(xù))class Automobileint Number;void setNumber(int Num)Number=Num;void showNumber()System.out.println(Automobile number:+Number); 超類5.2 派生類的定義(續(xù))派生類的定義(續(xù))class Truck extends Automobileint capacity;void setC

6、apacity(int truckCapacity)capacity=truckCapacity;void showCapacity()System.out.println(Truck Capacity:+capacity); 派生類5.2 派生類的定義(續(xù))派生類的定義(續(xù))class AutomobileExtendspublic static void main(String args)Truck tc=new Truck();tc.setNumber(8888); tc.setCapacity(10);tc.showNumber();tc.showCapacity();該程序運(yùn)行的結(jié)果

7、為: Automobile number:8888Truck Capacity:10 派生類使用從超類中繼承的方法setNumber派生類使用從超類中繼承的方法showNumber5.3 作用域和繼承作用域和繼承n第4章討論了成員訪問控制修飾符:public、private、package和protected。n超類public的成員可以在超類中使用,也可以在子類使用,程序可以在任何地方訪問public超類成員。n超類的private成員僅在超類中使用,在子類中不能被訪問。n超類protected成員,可在子類和同一包內(nèi)其他類被訪問。n超類package成員,可在同一包內(nèi)其他類被訪問。n子類從

8、超類中繼承成員時,超類的所有public和protected成員在子類中,都保持它們原有的訪問修飾符。5.4方法的重新定義方法的重新定義(overriding)n如果在子類中定義的某個方法與父類的某個方法有相同方法署名(方法頭),則稱子類重新定義(overriding)了父類的該方法,或稱重寫或覆蓋。n子類的對象調(diào)用這個方法時,將使用子類中定義的方法,對它而言,父類中定義的方法就“看不見”了。n如要在子類的方法中要使用超類的這個被重寫的方法,用:super.超類同名方法()。n例5-2 方法的重寫 Point類的設(shè)計類的設(shè)計: 成員變量成員變量:int x,y 成員方法成員方法:setX(in

9、t ),getX(),setY(int),getY(),toString(); Point() , Point(int xValue,int yValue)Circle類的設(shè)計類的設(shè)計: 成員變量成員變量:x,y/繼承自Point類 radius 成員方法成員方法:setX(),getX () ,setY () ,getY () /繼承自Point類set Radius () ,getRadius () ,getDiameter () , getCircumference () toString() /重寫父類同名方法 getArea() Circle (), Circle ( int xVa

10、lue, int yValue, double radiusValue )5.4方法的重新定義方法的重新定義(overriding)(續(xù))續(xù))nPoint.java文件的部分代碼: public String toString() return + x + , + y + ; nCircle.java文件的部分代碼: public String toString() return Center = +super.toString()+ Radius = + radius; 重寫了超類Point類中的toString方法通過super調(diào)用超類中的被重寫的toString方法5.5繼承下的構(gòu)造函數(shù)

11、和繼承下的構(gòu)造函數(shù)和finalize方法方法n繼承下的構(gòu)造函數(shù)的調(diào)用次序:繼承下的構(gòu)造函數(shù)的調(diào)用次序:子類對象的實(shí)例化過程開始于一系列的構(gòu)造函數(shù)調(diào)用,n子類構(gòu)造函數(shù)在執(zhí)行自己的任務(wù)之前,將顯式地(通過super引用)或隱式地(調(diào)用超類的默認(rèn)構(gòu)造函數(shù)或無參數(shù)構(gòu)造函數(shù))調(diào)用其直接超類的構(gòu)造函數(shù)。類似地,如果超類派生于另一個類,則要求超類的構(gòu)造函數(shù)調(diào)用層次結(jié)構(gòu)中上一級類的構(gòu)造函數(shù),依此類推。在調(diào)用請求中,最先調(diào)用的構(gòu)造函數(shù)總是Object類的構(gòu)造函數(shù)。最后才會執(zhí)行原有的子類構(gòu)造函數(shù)。n繼承下的finalize方法的調(diào)用次序n類層次結(jié)構(gòu)中子類finalize方法調(diào)用應(yīng)先于超類的finalize方法,直

12、至最后調(diào)用Object超類的finalize方法。 nfinalize方法的定義格式: void finalize()例5-3 繼承下的構(gòu)造函數(shù)和finalize方法5.6 超類和子類的關(guān)系(一)超類和子類的關(guān)系(一) 再次使用點(diǎn)圓繼承層次來討論超類與子類的關(guān)系。 為了使圓類繼承點(diǎn)類并能訪問點(diǎn)類中的成員變量,可將點(diǎn)類中的x和y定義成protected的成員. 例5-4中,Circle2類通過繼承Point2類,就可以在Circle2類中訪問它的超類(Point2類)的protected和public成員了。例5-4 使用protected數(shù)據(jù)的點(diǎn)-圓層次5.6 超類和子類的關(guān)系(二)超類和子類

13、的關(guān)系(二)n但在使用但在使用protectedprotected成員變量時,會產(chǎn)生兩個問題成員變量時,會產(chǎn)生兩個問題: :n子類可將非法值賦給變量,導(dǎo)致該變量處于非法狀態(tài)。子類可將非法值賦給變量,導(dǎo)致該變量處于非法狀態(tài)。 例如,如果將Circle2的成員變量radius聲明為protected,則它的子類就能夠?qū)⒇?fù)值賦給radius變量。n編寫的子類編寫的子類Circle2Circle2方法更依賴于超類方法更依賴于超類Point2Point2實(shí)現(xiàn)。實(shí)現(xiàn)。 例如,如果由于某種原因?qū)⒊蓡T變量x和y的名稱改為xCoordinate和yCoordinate,則子類直接引用這些超類成員變量的所有地方都

14、必須進(jìn)行相應(yīng)地修改。n為了使子類應(yīng)依賴于為了使子類應(yīng)依賴于超類服務(wù)超類服務(wù),而不應(yīng)依賴于,而不應(yīng)依賴于超類實(shí)現(xiàn)超類實(shí)現(xiàn): :n把超類中的成員變量聲明為private,并在超類中定義訪問這些private成員變量的public型的方法, 例5-5 把超類中的成員變量聲明為private, 在子類中使用從超類中繼承過來的方法對這些私有成員變量進(jìn)行訪問。/Point3.javapublic class Point2 private int x; private int y; public void setX( int xValue ) x = xValue; public int getX() re

15、turn x; public void setY( int yValue ) y = yValue; public int getY() return y; /Circle3.javapublic class Circle3 extends Point3 private double radius; public Circle3() /隱式調(diào)用超類的無參構(gòu)造方法 public Circle3( int xValue, int yValue, double radiusValue ) super( xValue, yValue ); /顯式調(diào)用超類的構(gòu)造方法 setRadius( radiusV

16、alue ); . public String toString() /調(diào)用超類的toString方法 return Center = + super.toString() + ; Radius = + getRadius(); 5.7 繼承的程序設(shè)計舉例(一)繼承的程序設(shè)計舉例(一)下面讓我們來看一個具有3級繼承層次的例子。這3級為點(diǎn)圓圓柱體。它們之間的繼承關(guān)系如圖5-3所示。例5-6 繼承的程序設(shè)計舉例圖5-3三級繼承層次Point類的設(shè)計類的設(shè)計: 成員變量:int x,y 成員方法:setX,getX,setY,getY,toString. Point() , Point(int xV

17、alue,int yValue) Circle類的設(shè)計類的設(shè)計: 成員變量: double radius 成員方法: setRadius,getRadius,getDiameter, getCircumference,getArea ,toString Circle( ), Circle(int xValue,int yValue, double radiusValue)Clinder類的設(shè)計類的設(shè)計: 成員變量: double hight成員方法: setHight ,getHight , getArea, toString Cylinder( int xValue, int yValue, double radiusValue,double heightValue )小結(jié)小結(jié)n繼承作用:在原有類的基礎(chǔ)上派

溫馨提示

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

評論

0/150

提交評論