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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

6、apacity(int truckCapacity)capacity=truckCapacity;void showCapacity()System.out.println(Truck Capacity:+capacity); 派生類(lèi)5.2 派生類(lèi)的定義(續(xù))派生類(lèi)的定義(續(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 派生類(lèi)使用從超類(lèi)中繼承的方法setNumber派生類(lèi)使用從超類(lèi)中繼承的方法showNumber5.3 作用域和繼承作用域和繼承n第4章討論了成員訪問(wèn)控制修飾符:public、private、package和protected。n超類(lèi)public的成員可以在超類(lèi)中使用,也可以在子類(lèi)使用,程序可以在任何地方訪問(wèn)public超類(lèi)成員。n超類(lèi)的private成員僅在超類(lèi)中使用,在子類(lèi)中不能被訪問(wèn)。n超類(lèi)protected成員,可在子類(lèi)和同一包內(nèi)其他類(lèi)被訪問(wèn)。n超類(lèi)package成員,可在同一包內(nèi)其他類(lèi)被訪問(wèn)。n子類(lèi)從

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

9、t ),getX(),setY(int),getY(),toString(); Point() , Point(int xValue,int yValue)Circle類(lèi)的設(shè)計(jì)類(lèi)的設(shè)計(jì): 成員變量成員變量:x,y/繼承自Point類(lèi) radius 成員方法成員方法:setX(),getX () ,setY () ,getY () /繼承自Point類(lèi)set Radius () ,getRadius () ,getDiameter () , getCircumference () toString() /重寫(xiě)父類(lèi)同名方法 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; 重寫(xiě)了超類(lèi)Point類(lèi)中的toString方法通過(guò)super調(diào)用超類(lèi)中的被重寫(xiě)的toString方法5.5繼承下的構(gòu)造函數(shù)

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

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

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

14、必須進(jìn)行相應(yīng)地修改。n為了使子類(lèi)應(yīng)依賴(lài)于為了使子類(lèi)應(yīng)依賴(lài)于超類(lèi)服務(wù)超類(lèi)服務(wù),而不應(yīng)依賴(lài)于,而不應(yīng)依賴(lài)于超類(lèi)實(shí)現(xiàn)超類(lèi)實(shí)現(xiàn): :n把超類(lèi)中的成員變量聲明為private,并在超類(lèi)中定義訪問(wèn)這些private成員變量的public型的方法, 例5-5 把超類(lèi)中的成員變量聲明為private, 在子類(lèi)中使用從超類(lèi)中繼承過(guò)來(lái)的方法對(duì)這些私有成員變量進(jìn)行訪問(wè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)用超類(lèi)的無(wú)參構(gòu)造方法 public Circle3( int xValue, int yValue, double radiusValue ) super( xValue, yValue ); /顯式調(diào)用超類(lèi)的構(gòu)造方法 setRadius( radiusV

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

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論