《Java面向?qū)ο蟪绦蛟O(shè)計(第4版)》課件chapter05 類的繼承和派生_第1頁
《Java面向?qū)ο蟪绦蛟O(shè)計(第4版)》課件chapter05 類的繼承和派生_第2頁
《Java面向?qū)ο蟪绦蛟O(shè)計(第4版)》課件chapter05 類的繼承和派生_第3頁
《Java面向?qū)ο蟪绦蛟O(shè)計(第4版)》課件chapter05 類的繼承和派生_第4頁
《Java面向?qū)ο蟪绦蛟O(shè)計(第4版)》課件chapter05 類的繼承和派生_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

教學(xué)目標(biāo)理解繼承的概念和作用派生類的定義理解訪問修飾符protected方法的重寫繼承下的構(gòu)造函數(shù)的使用繼承下的finalize方法的使用理解超類和子類的關(guān)系5.1繼承的概念和軟件的重用性繼承是從已有的類中派生出新的類。新的類能吸收已有類的數(shù)據(jù)屬性和行為;并能擴展新的能力。類和類之間的繼承關(guān)系可以用UML符號表示如圖5-1,父類又叫超類或基類,子類又叫派生類。父類是子類的一般化,子類是父類的特化(具體化)。超類或基類父類子類派生類圖5-1繼承關(guān)系super/base/parentchild/derived5.1繼承的概念和軟件的重用性如表5-1所示,列出了幾個超類和子類的實際例子。超類或基類父類子類派生類圖5-1繼承關(guān)系超類子類學(xué)生研究生、本科生、小學(xué)生形狀三角形、圓、矩形雇員教師、醫(yī)生、職員交通工具轎車、卡車、公交車水果蘋果、梨、桃、桔表5-1繼承例子“is-a”關(guān)系:是類之間的繼承關(guān)系。

子類的對象可當(dāng)作超類對象。但反過來,不能把超類對象可當(dāng)作子類對象。例如,轎車可看成是交通工具,但不能把交通工具看成就是轎車?!癶as-a”關(guān)系:代表類之間的組合(參見4.9節(jié))。在“has-a”關(guān)系中一個對象包含一個或多個其他對象的引用成員。如,轎車由方向盤、輪子、發(fā)動機等組成。5.1繼承的概念和軟件的重用性(續(xù))繼承分為單繼承和多繼承。單繼承是指一個子類最多只能有一個父類。多繼承是一個子類可有二個以上的父類。由于多繼承會帶來二義性,在實際應(yīng)用中應(yīng)盡量使用單繼承。Java類只支持單繼承,而接口支持多繼承。5.1繼承的概念和軟件的重用性(續(xù))objectWinDialogWin單繼承,injavaClass1Class4Class2Class3多繼承,inC++單繼承與多繼承例子5.1繼承的概念和軟件的重用性(續(xù))繼承使軟件的代碼得到重用。在繼承關(guān)系中,子類通過吸收已有類的數(shù)據(jù)(屬性)和方法(行為)并增加新功能或修改已有功能來創(chuàng)建新類。軟件的重用性不僅節(jié)省了程序的開發(fā)時間,還促進了經(jīng)過驗證和調(diào)試的高質(zhì)量軟件的重用,這增加實現(xiàn)系統(tǒng)的效率。在java中,Object類定義和實現(xiàn)了Java系統(tǒng)所需要的眾多類的共同行為,它是所有類的根類,所有的類都是由這個類繼承、擴充而來的。5.2派生類的定義派生類定義的一般格式為:

[類修飾符]class子類名extends父類名{

成員變量定義; 成員方法定義;

}派生類的定義中,用關(guān)鍵字extends來明確指出它所繼承的超類。例5-1通過繼承來定義派生類5.2派生類的定義(續(xù))classAutomobile{

intNumber; voidsetNumber(intNum){ Number=Num; } voidshowNumber(){ System.out.println("Automobilenumber:"+Number); }}超類5.2派生類的定義(續(xù))classTruckextendsAutomobile{

intcapacity; voidsetCapacity(inttruckCapacity){ capacity=truckCapacity; } voidshowCapacity(){ System.out.println("TruckCapacity:"+capacity); }}派生類5.2派生類的定義(續(xù))classAutomobileExtends{ publicstaticvoidmain(Stringargs[]){ Trucktc=newTruck(); tc.setNumber(8888); tc.setCapacity(10); tc.showNumber(); tc.showCapacity(); }}該程序運行的結(jié)果為:

Automobilenumber:8888 TruckCapacity:10派生類使用從超類中繼承的方法setNumber派生類使用從超類中繼承的方法showNumber5.3作用域和繼承第4章討論了成員訪問控制修飾符:public、private、package和protected。超類public的成員可以在超類中使用,也可以在子類使用,程序可以在任何地方訪問public超類成員。超類的private成員僅在超類中使用,在子類中不能被訪問。超類protected成員,可在子類和同一包內(nèi)其他類被訪問。超類package成員,可在同一包內(nèi)其他類被訪問。子類從超類中繼承成員時,超類的所有public和protected成員在子類中,都保持它們原有的訪問修飾符。5.4方法的重新定義(overriding)如果在子類中定義的某個方法與父類的某個方法有相同方法署名(方法頭),則稱子類重新定義(overriding)了父類的該方法,或稱重寫或覆蓋。子類的對象調(diào)用這個方法時,將使用子類中定義的方法,對它而言,父類中定義的方法就“看不見”了。如要在子類的方法中要使用超類的這個被重寫的方法,用:super.超類同名方法(…)。例5-2方法的重寫

Point類的設(shè)計:

成員變量:

intx,y

成員方法:

setX(int),getX(),setY(int),getY(),toString();Point(),Point(intxValue,intyValue)Circle類的設(shè)計:

成員變量:

x,y //繼承自Point類

radius

成員方法:

setX(),getX(),setY(),getY() //繼承自Point類

setRadius(),getRadius(),getDiameter(),getCircumference()toString()//重寫父類同名方法

getArea()

Circle(),Circle

(intxValue,intyValue,doubleradiusValue)5.4方法的重新定義(overriding)(續(xù))Point.java文件的部分代碼:……publicStringtoString(){return"["+x+","+y+"]";}

……Circle.java文件的部分代碼:

……publicStringtoString(){

return"Center="

+super.toString()+"Radius="+radius; }

……重寫了超類Point類中的toString方法通過super調(diào)用超類中的被重寫的toString方法5.5繼承下的構(gòu)造函數(shù)和finalize方法繼承下的構(gòu)造函數(shù)的調(diào)用次序:子類對象的實例化過程開始于一系列的構(gòu)造函數(shù)調(diào)用,子類構(gòu)造函數(shù)在執(zhí)行自己的任務(wù)之前,將顯式地(通過super引用)或隱式地(調(diào)用超類的默認構(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ù)。繼承下的finalize方法的調(diào)用次序類層次結(jié)構(gòu)中子類finalize方法調(diào)用應(yīng)先于超類的finalize方法,直至最后調(diào)用Object超類的finalize方法。finalize方法的定義格式:voidfinalize()例5-3繼承下的構(gòu)造函數(shù)和finalize方法//Point1.javapublicclassPoint1{privateintx;privateinty;

publicPoint1(){ System.out.println("Point1no-argumentconstructor:"+this);}

publicPoint1(intxValue,intyValue){System.out.println("Point1constructor:"+this);}protectedvoidfinalize(){ System.out.println("Point1finalizer:"+this);}......}相當(dāng)與this.toSring()與對象的類型有關(guān).若this指向Point1對象,則調(diào)用Point1類中的方法,若this指向Circle1對象,則調(diào)用Circle1類中的方法,//Circle1.javapublicclassCircle1extendsPoint1{privatedoubleradius;

publicCircle1(){System.out.println("Circle1no-argumentconstructor:"+this);}

publicCircle1(intxValue,intyValue,doubleradiusValue){

super(xValue,yValue); setRadius(radiusValue);System.out.println("Circle1constructor:"+this);}

protectedvoidfinalize(){System.out.println("Circle1finalizer:"+this);super.finalize(); }......}子類方法finalize的最后一個操作應(yīng)調(diào)用超類的finalize方法,以確保在垃圾收集器回收對象內(nèi)存時,能夠正確的結(jié)束對象的所有部分。間接地調(diào)用父類無參構(gòu)造方法Point1()顯式地調(diào)用父類有參構(gòu)造方法Point1()//ConstructorFinalizerTest.javapublicclassConstructorFinalizerTest{publicstaticvoidmain(Stringargs[]){Point1point;Circle1circle1,circle2;point=newPoint1(11,22);

System.out.println();

circle1=newCircle1(72,29,4.5);System.out.println();circle2=newCircle1(5,7,10.67);point=null;circle1=null; circle2=null; System.out.println();System.gc(); } }5.6超類和子類的關(guān)系(一)再次使用點—圓繼承層次來討論超類與子類的關(guān)系。為了使圓類繼承點類并能訪問點類中的成員變量,可將點類中的x和y定義成protected的成員.例5-4中,Circle2類通過繼承Point2類,就可以在Circle2類中訪問它的超類(Point2類)的protected和public成員了。例5-4使用protected數(shù)據(jù)的點-圓層次//Point2.javapublicclassPoint2{

protectedintx;

protectedinty;

……publicvoidsetX(intxValue){x=xValue;}publicintgetX(){returnx;}publicvoidsetY(intyValue){y=yValue;}publicintgetY(){returny;}

……}//Circle2.javapublicclassCircle2extendsPoint2{privatedoubleradius;publicCircle2(){}publicCircle2(intxValue,intyValue,doubleradiusValue){

x=xValue; //使用繼承自超類Point2的變量x

y=yValue; //使用繼承自超類Point2的變量ysetRadius(radiusValue);}......publicStringtoString(){ //使用繼承自超類Point2的變量x和y return"Center=["+x+","+y+"];Radius="+radius;}}//CircleTest2.javaimportjava.text.DecimalFormat;importjavax.swing.JOptionPane;publicclassCircleTest2{publicstaticvoidmain(String[]args){Circle2circle=newCircle2(37,43,2.5);//使用繼承自Point2的方法getX和getYStringoutput="Xcoordinateis"+circle.getX()+"\nYcoordinateis"+circle.getY()+"\nRadiusis"+circle.getRadius();

circle.setX(35);

circle.setY(20); ......}}5.6超類和子類的關(guān)系(二)但在使用protected成員變量時,會產(chǎn)生兩個問題:子類可將非法值賦給變量,導(dǎo)致該變量處于非法狀態(tài)。例如,如果將Circle2的成員變量radius聲明為protected,則它的子類就能夠?qū)⒇撝蒂x給radius變量。編寫的子類Circle2方法更依賴于超類Point2實現(xiàn)。例如,如果由于某種原因?qū)⒊蓡T變量x和y的名稱改為xCoordinate和yCoordinate,則子類直接引用這些超類成員變量的所有地方都必須進行相應(yīng)地修改。為了使子類應(yīng)依賴于超類服務(wù),而不應(yīng)依賴于超類實現(xiàn):把超類中的成員變量聲明為private,并在超類中定義訪問這些private成員變量的public型的方法,例5-5

把超類中的成員變量聲明為private,在子類中使用從超類中繼承過來的方法對這些私有成員變量進行訪問。//Point3.javapublicclassPoint2{

privateintx;

privateinty;

……

publicvoidsetX(intxValue){x=xValue;}publicintgetX(){returnx;}

publicvoidsetY(intyValue){y=yValue;}publicintgetY(){returny;}

……}//Circle3.javapublicclassCircle3extendsPoint3{privatedoubleradius;publicCircle3(){//隱式調(diào)用超類的無參構(gòu)造方法}publicCircle3(intxValue,intyValue,doubleradiusValue){

super(xValue,yValue); //顯式調(diào)用超類的構(gòu)造方法

setRadius(radiusValue);}......publicStringtoString(){ //調(diào)用超類的toString方法

return"Center="+super.toString()+";Radius="+getRadius();}}//CircleTest3.javapublicclassCircleTest3{publicstaticvoidmain(String[]args){Circle3circle=newCircle3(37,43,2.5);Stringoutput="Xcoordinateis"+circle.getX()+"\nYcoordinateis"+circle.getY()+"\nRadiusis"+circle.getRadius();

circle.setX(35);circle.setY(20);circle.setRadius(4.25);

output+="\n\nThenewlocationandradiusofcircleare\n"+

circle.toString();DecimalFormattwoDigits=newDecimalFormat("0.00"); output+="\nDiameteris"+

twoDigits.format(

circle.getDiameter()

);output+="\nCircumferenceis"+

twoDigits.format(

circle.getCircumference()

);output+="\nAreais"+twoDigits.format(

circle.getArea()

);JOptionPane.showMessageDialog(null,output);System.exit(0);}}5.7繼承的程序設(shè)計舉例(一)下面讓我們來看一個具有3級繼承層次的例子。這3級為點—圓—圓柱體。它們之間的繼承關(guān)系如圖5-3所示。例5-6繼承的程序設(shè)計舉例圖5-3三級繼承層次Point類的設(shè)計: 成員變量:intx,y

成員方法:setX,getX,setY,getY,toString.Point(),Point(intxValue,intyValue)

Circle類的設(shè)計: 成員變量: doubleradius

成員方法:setRadius,getRadius,getDiameter,getCircumference,getArea,toString

Circle(),Circle(intxValue,intyValue,doubleradiusValue)Clinder類的設(shè)計:成員變量:doublehight

成員方法:setHight,getHight,getArea,toString

Cylinder(intxValue,intyValue,doubleradiusValue,doubleheightValue)//Point3.javapublicclassPoint3{privateintx; //將超類中的成員變量x聲明為privateprivateinty; //將超類中的成員變量x聲明為privatepublicPoint3(){}publicPoint3(intxValue,intyValue){x=xValue;y=yValue;}......publicStringtoString(){return"["+getX()+","+getY()+"]";}}//Circle3.javapublicclassCircle3extendsPoint3{privatedoubleradius;publicCircle3(){//隱式調(diào)用超類的構(gòu)造方法}publicCircle3(intxValue,intyValue,doubleradiusValue){

super(xValue,yValue); //顯式調(diào)用超類的構(gòu)造方法

setRadius(radiusValue);}

…….publicStringtoString(){ //調(diào)用超類的toString方法

return"Center="+super.toString()+";Radius="+getRadius();}}//Cyl

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論