Java繼承與多態(tài)課件_第1頁
Java繼承與多態(tài)課件_第2頁
Java繼承與多態(tài)課件_第3頁
Java繼承與多態(tài)課件_第4頁
Java繼承與多態(tài)課件_第5頁
已閱讀5頁,還剩105頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章繼承與多態(tài)第5章繼承與多態(tài)1一、繼承性與多態(tài)性的實現(xiàn)技術(shù)類是用來描述具有相同屬性和行為對象集合的工具。任何一個類別的對象都不是獨立存在于客觀世界上的,因此類與類之間必定存在著某些關(guān)系,概括起來有下列三種:關(guān)聯(lián)關(guān)系聚合關(guān)系泛化關(guān)系一、繼承性與多態(tài)性的實現(xiàn)技術(shù)類是用來描述具有相同屬性和行為對2關(guān)聯(lián)關(guān)系關(guān)聯(lián)是指兩個或多個類之間的一種特定關(guān)系,它描述了各個類對象之間相互依賴的關(guān)系。最常見的關(guān)聯(lián)是兩個類之間的關(guān)聯(lián),即二元關(guān)聯(lián)。學(xué)生課程目錄文件選修存放5~200*1*在Java程序中,常用成員對象實現(xiàn)。關(guān)聯(lián)關(guān)系關(guān)聯(lián)是指兩個或多個類之間的一種特定關(guān)系,它描述了各個3聚合關(guān)系顧名思義,聚合是將多個類聚集在一起的意思。聚合的方式有如下幾種:包含關(guān)系(hasa)組成關(guān)系(partof)所屬關(guān)系(owns)雇傭關(guān)系(employed_by)公司雇員*1在Java程序中用成員對象實現(xiàn)集合關(guān)系。聚合關(guān)系顧名思義,聚合是將多個類聚集在一起的意思。聚合的方4泛化關(guān)系泛化描述了兩個類之間的“一般-特殊”關(guān)系。可以使用“Isa”進行檢測。人學(xué)生大學(xué)生中學(xué)生泛化關(guān)系體現(xiàn)了類之間的繼承關(guān)系。在Java程序中,用定義子類實現(xiàn)。泛化關(guān)系泛化描述了兩個類之間的“一般-特殊”關(guān)系。可以使用5繼承機制是實現(xiàn)軟件可重用的基石,是提高軟件系統(tǒng)的可擴展性和可維護性的主要途徑。所謂繼承是指一個類的定義可以基于另外一個已經(jīng)存在的類,即子類基于父類,從而實現(xiàn)父類代碼的重用。在Java語言中,通過定義子類支持繼承性。

繼承機制是實現(xiàn)軟件可重用的基石,是提高軟件系統(tǒng)的可擴展性和可6多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的一個核心概念,它有助于增加軟件系統(tǒng)的可擴展性、自然性和可維護性。所謂多態(tài)是指不同的類對象收到同一個消息可以產(chǎn)生完全不同的響應(yīng)效果的現(xiàn)象。利用多態(tài)機制,用戶可以發(fā)送一個通用的消息給各個類對象,而實現(xiàn)細節(jié)由接收對象自行決定,這樣,同一個消息可能會導(dǎo)致調(diào)用不同的方法。在Java語言中,主要利用子類覆蓋父類的成員方法的方式支持多態(tài)性。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的一個核心概念,它有助于增加軟件系統(tǒng)7二、類的繼承在Java中,類是一個層次結(jié)構(gòu),其中有一個被稱為Object的特殊超類,所有的類都是Object直接或間接的子類。子類繼承父類的數(shù)據(jù)成員和成員方法,同時也可以更改父類的數(shù)據(jù)成員或重載父類的成員方法,以及在父類的基礎(chǔ)上添加新的數(shù)據(jù)成員和成員方法。因此,父類和子類之間反映的是“一般與特殊”的關(guān)系二、類的繼承在Java中,類是一個層次結(jié)構(gòu),其中有一個被8應(yīng)用繼承的主要場合反映類之間的泛化,即“一般-特殊”關(guān)系學(xué)生大學(xué)生中學(xué)生draw()draw(){…}draw(){…}圓形矩形統(tǒng)一同類操作的接口應(yīng)用繼承的主要場合反映類之間的泛化,即“一般-特殊”關(guān)系學(xué)生9子類的定義格式[修飾符]子類名稱extends父類名稱{子類體;}《注意》沒有extends,默認(rèn)父類為Object只能有一個父類,即單繼承子類繼承父類中除private部分的全部內(nèi)容類繼承具有傳遞性子類的定義格式[修飾符]子類名稱extends10classB{

int

b1=1;

publicint

b2=2;

protectedint

b3=3;

privateint

b4=4;

int

getb4(){returnb4;}}classAextendsB{inta=5;

intsum(){returnb1+b2+b3+getb4()+a;}}b1b2b3b4agetb4()Sum()A類對象包含的成員classBb1A類對象包含的成員11classClassInheritance{publicstaticvoidmain(Stringargs[]){Bbb=newB();System.out.println("B:"+bb.b1+""+bb.b2+""+bb.b3+""+bb.getb4());Aaa=newA();System.out.println("A:"+aa.b1+""+aa.b2+""+aa.b3+""+aa.getb4()+""+aa.a+""+aa.sum());}}假設(shè)ClassInheritance類與A、B類在同一個包中。classClassInheritance假設(shè)ClassI12classB{intb1=1;publicintb2=2;protectedintb3=3;privateintb4=4;

intgetb4(){returnb4;}voidsetb4(inti){b4=i;}}classAextendsB{inta=5;}

classCextendsA{intc=6;voidchange(intincrease){b1+=increase;b2+=increase;b3+=increase;setb4(getb4()+increase);a+=increase;c+=increase;}}繼承的傳遞性classBclassCextendsA繼承的傳遞性13classCPP{publicstaticvoidmain(Stringarg[]){Ccc=newC();System.out.println("C:"+cc.b1+""+cc.b2+""+cc.b3+""+cc.getb4()+""+cc.a+""+cc.c);cc.change(15);System.out.println("C:"+cc.b1+""+cc.b2+""+cc.b3+""+cc.getb4()+""+cc.a+""+cc.c);}}假設(shè)CPP類與A、B、C類在同一個包中。classCPP假設(shè)CPP類與A、B、C類在同一個包中。14子類與父類的屬性與方法子類繼承父類中除private部分的所有內(nèi)容;子類中新增加的屬性和方法是對父類的擴展;子類中定義的與父類同名的屬性是對父類屬性的隱藏,同名的成員方法是對父類方法的重載或覆蓋。子類與父類的屬性與方法子類繼承父類中除private部分的所15類的成員覆蓋類成員覆蓋是指在子類中新增加的數(shù)據(jù)成員的名稱與父類相同,成員方法與父類定義的原型一樣;若希望引用父類中的相應(yīng)成員,需要使用關(guān)鍵字super作為前綴。類的成員覆蓋類成員覆蓋是指在子類中新增加的數(shù)據(jù)成員的名稱與父16classA{intx=1234;voidshow(){System.out.println("classA:");}}classBextendsA{doublex=567.89;//數(shù)據(jù)成員覆蓋,不提倡這樣使用。voidshow()//成員方法覆蓋{

super.show();System.out.println("classB:");}}classA17三、子類的構(gòu)造方法1、子類應(yīng)該負(fù)責(zé)調(diào)用父類的構(gòu)造方法。2、若子類中沒有定義構(gòu)造方法,則它自動地調(diào)用父類無參數(shù)的構(gòu)造方法;若子類定義了構(gòu)造方法,應(yīng)該在第一條語句的位置調(diào)用父類的構(gòu)造方法,否則系統(tǒng)將在此位置插入一條調(diào)用父類無參數(shù)構(gòu)造方法的語句。3、對于父類中含有參數(shù)的構(gòu)造方法,只能在子類的構(gòu)造方法中利用super顯式地調(diào)用。三、子類的構(gòu)造方法1、子類應(yīng)該負(fù)責(zé)調(diào)用父類的構(gòu)造方法。18classA{privateinta;A(){a=0;}A(inti){a=i;}intgetA(){returna;}}classBextendsA{doubleb1,b2;B(){this(11.1,12.2);}B(doubled1,doubled2){b1=d1;b2=d2;}B(inti,doubled1,doubled2){super(i);b1=d1;b2=d2;}B(inti,doubled){super(i);b1=d;b2=0;}B(doubled){super(4);b1=0;b2=d;}}classA19繼承性舉例:幾何圖元描述。任何一個幾何圖元都有顏色和原點這兩個基本屬性。矩形是一種圖元,它還有長(length)、寬(width)兩個屬性,正方形是一種特殊的矩形,它的特殊性在于長和寬相等。幾何圖元正方形圖元矩形圖元繼承性舉例:幾何圖元描述。任何一個幾何圖元都有顏色和原點這兩20Shape-Colorcolor-Pointorigin+voidsetShape()+ColorgetColor()+PointgetOrigin()+StringtoString()Color-intred,green,blue+setColor()+getRed()+getGreen()+getBlue()+StringtoString()Point-intx,y+setPoint()+getX()+getY()+StringtoString()ShapeRectangle-intlength,width+intarea()+intpermeter()+intgetLength()+intgetWidth()+voidsetWL()Square

+getEdge()+setEdge()第3次上機作業(yè)Shape-Colorcolor+voidsetShap21四、多態(tài)性的實現(xiàn)類對象之間的類型轉(zhuǎn)換ObjectTypeObject1=newObjectType();ObjectTypeObject2=Object1;結(jié)果:將Object1的引用賦給Object2若將子類對象的引用賦給父類對象的引用,則可以用顯式或隱式實現(xiàn),即可以直接將子類對象的引用直接賦給父類對象的引用;若將父類對象的引用賦給子類對象的引用,則必須使用顯式轉(zhuǎn)換,即強制類型轉(zhuǎn)換。四、多態(tài)性的實現(xiàn)類對象之間的類型轉(zhuǎn)換22classA{......}classBextendsA{......}ABBclass_b=newB();Aclass_a=class_b;class_aclass_bclassAABBclass_b=newB();cl23多態(tài)性的實現(xiàn)在Java語言中,使用動態(tài)聯(lián)編實現(xiàn)多態(tài)性,具體實現(xiàn)方式:多態(tài)性出現(xiàn)在繼承關(guān)系中;子類覆蓋父類的成員方法;若在程序中調(diào)用該方法,則根據(jù)對象所引用的實例所屬類確定最終調(diào)用的代碼塊。多態(tài)性的實現(xiàn)在Java語言中,使用動態(tài)聯(lián)編實現(xiàn)多態(tài)性,具體24多態(tài)性舉例AnimalDogCatDuck動物狗貓鴨子多態(tài)性舉例AnimalDogCatDuck動物狗貓鴨子25importjava.util.Random;publicabstractclassAnimal//動物類{protectedStringtype;//動物種類protectedStringname;//名稱protectedStringbreed;//品種publicAnimal(Stringtype,Stringname,Stringbreed){……}publicStringtoString(){return"Thisisa"+type+"\nIt's"+name+"the"+breed;}

publicabstractvoidsound();}importjava.util.Random;26classDogextendsAnimal//Dog類{publicDog(Stringname){super("Dog",name,"Unknow");}publicDog(Stringname,Stringbreed){super("Dog",name,breed);}

publicvoidsound(){System.out.println("WoofWoof");}}Cat、Duck兩個類的定義類似,只是sound()方法內(nèi)容不一樣。classDogextendsAnimal/27publicclassTryPolymorphism//測試類{ publicstaticvoidmain(String[]args) { Animal[]theAnimals={newDog("Rover","Poodle"), newCat("Max","Abyssinian"), newDuck("Daffy","Aylesbury")}; AnimalpetChoice;//聲明父類的引用for(inti=0;i<3;i++){petChoice=theAnimals[i];System.out.println("\nYourChoice:\n"+petChoice);

petChoice.sound();//根據(jù)petChoice所指對象類別做出響應(yīng)}}}publicclassTryPolymorphism28多態(tài)性應(yīng)用舉例:學(xué)校人事管理。為簡化問題的規(guī)模,假設(shè)只考慮學(xué)生和教師。Person-intnumber-Stringname-Datebirthday+getNumber()+getName()+getBirthday()+setInfo()+toString()Student-Stringmajor+getMajor()+setInfo()+toString()Teacher-Stringdepartment-floatsalary+getDepartment()+getSalary()+setInfo()+toString()多態(tài)性應(yīng)用舉例:學(xué)校人事管理。Person-intnumb29importjava.util.*;publicabstractclassPerson{ privateintnumber; privateStringname; privateDatebirthday; publicPerson(){……} publicPerson(intnumber,Stringname,Datebirthday){……}

publicvoidsetInfo(intnumber,Stringname,Datebirthday){……} publicintgetNumber(){returnnumber;} publicStringgetName(){returnname;} publicDategetBirthday(){returnbirthday;}

publicStringtoString(){……}}importjava.util.*;30publicclassStudentextendsPerson{ privateStringmajor; publicStudent(){super();} publicStudent(intnumber,Stringname,Datebirthday,Stringmajor) { super(number,name,birthday); this.major=newString(major); } publicStringgetMajor(){returnmajor;}

publicvoidsetInfo(intnumber,Stringname,Datebirthday,Stringmajor) {……}

publicStringtoString() { returnsuper.toString()+"Major:"+major; }}publicclassStudentextendsP31publicclassTeacherextendsPerson{ privateStringdepartment; floatsalary; publicTeacher(){……} publicTeacher(intnumber,Stringname,Datebirthday,Stringdepartment,floatsalary) {……} publicStringgetDepartment(){returndepartment;} publicfloatgetSalary(){returnsalary;}

publicvoidsetInfo(intnumber,Stringname,Datebirthday,Stringdepartment,floatsalary){……}

publicStringtoString(){……}}publicclassTeacherextendsP32importjava.io.*;importjava.util.*;publicclassTryClass{ publicstaticvoidmain(String[]args) {Datedate; Persons;date=newDate(1984,3,26);s=newStudent(100,"WangDong",date,"Computer"); System.out.println(s); s=newTeacher(200,"Chenping",newDate(1958,12,2),"Comupter",3000.0f); System.out.println(s); }}importjava.io.*;importja33構(gòu)造異質(zhì)鏈表異質(zhì)鏈表是每個結(jié)點存放不同類別對象的鏈表。要求這些對象所屬的類具有相同的父類。ListLink-Nodehead-Nodetail+append()+toString()Node-Personinfo-Nodenext+getInfo()+getNext()+setNext()+toString()構(gòu)造異質(zhì)鏈表異質(zhì)鏈表是每個結(jié)點存放不同類別對象的鏈表。要求這34publicclassNode//結(jié)點類{ privatePersoninfo; privateNodenext; publicNode(){……} publicNode(Personinfo){……} publicPersongetInfo(){returninfo;} publicNodegetNext(){returnnext;} publicvoidsetNext(Nodenode){this.next=node;} publicStringtoString(){returninfo.toString();}}publicclassNode//結(jié)點類35importjava.io.*;publicclassListLink//鏈表類{ Nodehead;//頭結(jié)點引用 Nodetail;//尾結(jié)點引用 publicListLink(){……} publicvoidappend(Personinfo){……} publicStringtoString() {Nodep; Strings=""; p=head.getNext();//頭結(jié)點之后的第1個結(jié)點 while(p!=null){s+=p.getInfo()+"\n";p=p.getNext(); } returns; }}importjava.io.*;36importjava.io.*;importjava.util.*;publicclassTryClass{ publicstaticvoidmain(String[]args) {ListLinklink=newListLink(); Datedate=newDate(1984,3,26); Students=newStudent(100,"WangDong",date,"Computer"); link.append(s); date=newDate(1958,12,2); Teachert=newTeacher(200,"Chenping",date,"Comupter",3000.0f); link.append(t); date=newDate(1982,10,26); s=newStudent(101,"LiLin",date,"Math"); link.append(s); date=newDate(1950,1,12); t=newTeacher(201,"Zhaoxue",date,"Physics",4000.0f); link.append(t); System.out.println(link);}}第4次上機作業(yè):請將第3題的圖元(線段、矩形、橢圓等)存儲在一個異質(zhì)鏈表中。importjava.io.*;impor37五、接口接口可以實現(xiàn)類間多繼承結(jié)構(gòu)。接口內(nèi)部只能定義public的抽象方法和公有的、靜態(tài)常量,因此接口中的所有方法都需要在子類中實現(xiàn)。五、接口接口可以實現(xiàn)類間多繼承結(jié)構(gòu)。接口內(nèi)部只能定義pub38接口的定義格式[public]interface接口名稱{常量;//默認(rèn)publicstaticfinal方法;//默認(rèn)publicabstract}在定義接口時,若沒有public,則該接口只能由同一個包中的類或接口引用。接口的定義格式[public]interface接口名39interfaceA{doubleg=9.8;voidshow();}classBimplementsA{publicvoidshow(){System.out.println(“g=“+g);}}classInterfaceTest{publicstaticvoidmain(Stringargs[]){Bb=newB();b.show();Aa=newB();a.show();}}publicstaticfinalpublicabstractinterfaceAclassInterfaceTes40接口的繼承舉例interfaceA{inta=1;voidshowa();}interfaceBextendsA{intb=2;voidshowb();}interfaceC{intc=3;voidshowc();}interfaceDextendsB,C{intd=4;voidshowd();}接口的繼承舉例interfaceAinterfaceC41classEimplementsD{inte=5;publicvoidshowa(){System.out.println(“a=“+a);}publicvoidshowb(){System.out.println(“b=“+b);}publicvoidshowc(){System.out.println(“c=“+c);}publicvoidshowd(){System.out.println(“d=“+d);}publicvoidshowe(){System.out.println(“e=“+e);}}類必須實現(xiàn)接口繼承的全部方法classEimplementsD類必須實現(xiàn)接口繼承的42classInterface_H_C{publicstaticvoidmain(Stringargs[]){Eee=newE();ee.showa();ee.showb();ee.showc();ee.showd();ee.showe();}}classInterface_H_C43使用接口應(yīng)注意的地方及益處一個類可以繼承多個接口,但必須實現(xiàn)每個接口的全部成員方法,若不實現(xiàn)全部成員方法,則必須將該類說明成abstract。使用接口的好處是統(tǒng)一操作接口,即可以在不暴露具體類的前提下,公開操作接口的規(guī)范。使用接口應(yīng)注意的地方及益處一個類可以繼承多個接口,但必須實現(xiàn)44接口應(yīng)用舉例:對象的比較。在Java語言的java.lang包中提供了一個通用接口Comparable。若要使對象之間能夠比較大小,就必須讓該對象所屬的類實現(xiàn)這個接口。這個接口的源代碼如下:packagejava.lang;publicinterfaceComparable{publicintcompareTo(ObjectO);}接口應(yīng)用舉例:對象的比較。在Java語言的java.lang45GeometricObjectCircleRectanglecomparableCircleComparableGeometricObjectCircleRectangle46publicabstractclassGeometricObject{ privateStringcolor="white"; privatebooleanfilled; protectedGeometricObject(Stringcolor,booleanfilled) { this.color=color;this.filled=filled; } publicStringgetColor(){returncolor;} publicvoidsetColor(Stringcolor){this.color=color;} publicbooleanisFilled(){returnfilled;} publicvoidsetFilled(booleanfilled){this.filled=filled;}

publicabstractdoublefindArea(); publicabstractdoublefindPerimeter();}publicabstractclassGeometri47publicclassCircleextendsGeometricObject{ privatedoubleradius; publicCircle(){this(1.0);} publicCircle(doubleradius){this(radius,"white",false);} publicCircle(doubleradius,Stringcolor,booleanfilled) {super(color,filled);this.radius=radius; } publicdoublegetRadius(){returnradius;} publicvoidsetRadius(doubleradius){this.radius=radius;} publicdoublefindArea(){returnradius*radius*Math.PI;} publicdoublefindPerimeter(){return2*radius*Math.PI;}

publicbooleanequals(Circlecircle){returnthis.radius==circle.getRadius();} publicStringtoString(){return"[Circle]radius="+radius;}}publicclassCircleextendsGe48publicclassRectangleextendsGeometricObject{ privatedoublewidth,height; publicRectangle(){this(1.0,1.0);} publicRectangle(doublewidth,doubleheight){this(width,height,"white",false);}

publicRectangle(doublewidth,doubleheight,Stringcolor,booleanfilled) {super(color,filled);this.width=width;this.height=height; } publicdoublegetWidth(){returnwidth;} publicvoidsetWidth(doublewidth){this.width=width;} publicdoublegetHeight(){returnheight;} publicvoidsetHeight(doubleheight){this.height=height;} publicdoublefindArea(){returnwidth*height;} publicdoublefindPerimeter(){return2*(width+height);}

publicbooleanequals(Rectanglerectangle) {return(width==rectangle.getWidth())&&(height==rectangle.getHeight());} publicStringtoString() {return"[Ractangle]width="+width+"andheight="+height; }}publicclassRectangleextends49publicclassComparableCircleextendsCircle

implementsComparable{ publicComparableCircle(doubler){super(r);}

publicintcompareTo(Objecto) { if(getRadius()>((Circle)o.getRadius())return1; elseif(getRadius()<((Circle)o).getRadius())return-1;elsereturn0; }}publicclassComparableCircle50publicclassTryClass{ publicstaticvoidmain(String[]args) {ComparableCirclecircle1=newComparableCircle(10.3); ComparableCirclecircle2=newComparableCircle(22.3); switch(pareTo(circle2)){ case1:System.out.println("Circle1.radius>Circle2.radius");break; case0:System.out.println("Circle1.radius==Circle2.radius");break; case-1:System.out.println("Circle1.radius<Circle2.radius");break; }}}publicclassTryClass51六、包包是一組相關(guān)的類和接口的集合。將類和接口分裝在不同的包中,可以避免重名類的沖突,限定包之間類的訪問權(quán)限,更有效地管理眾多的類和接口。六、包包是一組相關(guān)的類和接口的集合。將類和接口分裝在不同的包52包的創(chuàng)建與使用packagepk1[.pk2[.pk3...]];包是分層管理的,其含義類似于目錄。若使用某個包中的類,則需要在程序的前面(在package之后)上寫:

import包名;若需要將某個類放在某個包中,則需要在程序的首行寫上:

package包名;包的創(chuàng)建與使用packagepk1[.pk2[53默認(rèn)的包在默認(rèn)情況下,系統(tǒng)會為每個.java源文件創(chuàng)建一個無名包,該.java文件中定義的所有類都隸屬于這個無名包,它們之間可以相互引用。但是由于這個無名包是沒有名字的,所以它不能被其他包import。默認(rèn)的包在默認(rèn)情況下,系統(tǒng)會為每個.java源文件創(chuàng)建一個54本章作業(yè)1、閱讀教材中本章的所有例題2、P1656、7本章作業(yè)1、閱讀教材中本章的所有例題55第5章繼承與多態(tài)第5章繼承與多態(tài)56一、繼承性與多態(tài)性的實現(xiàn)技術(shù)類是用來描述具有相同屬性和行為對象集合的工具。任何一個類別的對象都不是獨立存在于客觀世界上的,因此類與類之間必定存在著某些關(guān)系,概括起來有下列三種:關(guān)聯(lián)關(guān)系聚合關(guān)系泛化關(guān)系一、繼承性與多態(tài)性的實現(xiàn)技術(shù)類是用來描述具有相同屬性和行為對57關(guān)聯(lián)關(guān)系關(guān)聯(lián)是指兩個或多個類之間的一種特定關(guān)系,它描述了各個類對象之間相互依賴的關(guān)系。最常見的關(guān)聯(lián)是兩個類之間的關(guān)聯(lián),即二元關(guān)聯(lián)。學(xué)生課程目錄文件選修存放5~200*1*在Java程序中,常用成員對象實現(xiàn)。關(guān)聯(lián)關(guān)系關(guān)聯(lián)是指兩個或多個類之間的一種特定關(guān)系,它描述了各個58聚合關(guān)系顧名思義,聚合是將多個類聚集在一起的意思。聚合的方式有如下幾種:包含關(guān)系(hasa)組成關(guān)系(partof)所屬關(guān)系(owns)雇傭關(guān)系(employed_by)公司雇員*1在Java程序中用成員對象實現(xiàn)集合關(guān)系。聚合關(guān)系顧名思義,聚合是將多個類聚集在一起的意思。聚合的方59泛化關(guān)系泛化描述了兩個類之間的“一般-特殊”關(guān)系。可以使用“Isa”進行檢測。人學(xué)生大學(xué)生中學(xué)生泛化關(guān)系體現(xiàn)了類之間的繼承關(guān)系。在Java程序中,用定義子類實現(xiàn)。泛化關(guān)系泛化描述了兩個類之間的“一般-特殊”關(guān)系??梢允褂?0繼承機制是實現(xiàn)軟件可重用的基石,是提高軟件系統(tǒng)的可擴展性和可維護性的主要途徑。所謂繼承是指一個類的定義可以基于另外一個已經(jīng)存在的類,即子類基于父類,從而實現(xiàn)父類代碼的重用。在Java語言中,通過定義子類支持繼承性。

繼承機制是實現(xiàn)軟件可重用的基石,是提高軟件系統(tǒng)的可擴展性和可61多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的一個核心概念,它有助于增加軟件系統(tǒng)的可擴展性、自然性和可維護性。所謂多態(tài)是指不同的類對象收到同一個消息可以產(chǎn)生完全不同的響應(yīng)效果的現(xiàn)象。利用多態(tài)機制,用戶可以發(fā)送一個通用的消息給各個類對象,而實現(xiàn)細節(jié)由接收對象自行決定,這樣,同一個消息可能會導(dǎo)致調(diào)用不同的方法。在Java語言中,主要利用子類覆蓋父類的成員方法的方式支持多態(tài)性。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的一個核心概念,它有助于增加軟件系統(tǒng)62二、類的繼承在Java中,類是一個層次結(jié)構(gòu),其中有一個被稱為Object的特殊超類,所有的類都是Object直接或間接的子類。子類繼承父類的數(shù)據(jù)成員和成員方法,同時也可以更改父類的數(shù)據(jù)成員或重載父類的成員方法,以及在父類的基礎(chǔ)上添加新的數(shù)據(jù)成員和成員方法。因此,父類和子類之間反映的是“一般與特殊”的關(guān)系二、類的繼承在Java中,類是一個層次結(jié)構(gòu),其中有一個被63應(yīng)用繼承的主要場合反映類之間的泛化,即“一般-特殊”關(guān)系學(xué)生大學(xué)生中學(xué)生draw()draw(){…}draw(){…}圓形矩形統(tǒng)一同類操作的接口應(yīng)用繼承的主要場合反映類之間的泛化,即“一般-特殊”關(guān)系學(xué)生64子類的定義格式[修飾符]子類名稱extends父類名稱{子類體;}《注意》沒有extends,默認(rèn)父類為Object只能有一個父類,即單繼承子類繼承父類中除private部分的全部內(nèi)容類繼承具有傳遞性子類的定義格式[修飾符]子類名稱extends65classB{

int

b1=1;

publicint

b2=2;

protectedint

b3=3;

privateint

b4=4;

int

getb4(){returnb4;}}classAextendsB{inta=5;

intsum(){returnb1+b2+b3+getb4()+a;}}b1b2b3b4agetb4()Sum()A類對象包含的成員classBb1A類對象包含的成員66classClassInheritance{publicstaticvoidmain(Stringargs[]){Bbb=newB();System.out.println("B:"+bb.b1+""+bb.b2+""+bb.b3+""+bb.getb4());Aaa=newA();System.out.println("A:"+aa.b1+""+aa.b2+""+aa.b3+""+aa.getb4()+""+aa.a+""+aa.sum());}}假設(shè)ClassInheritance類與A、B類在同一個包中。classClassInheritance假設(shè)ClassI67classB{intb1=1;publicintb2=2;protectedintb3=3;privateintb4=4;

intgetb4(){returnb4;}voidsetb4(inti){b4=i;}}classAextendsB{inta=5;}

classCextendsA{intc=6;voidchange(intincrease){b1+=increase;b2+=increase;b3+=increase;setb4(getb4()+increase);a+=increase;c+=increase;}}繼承的傳遞性classBclassCextendsA繼承的傳遞性68classCPP{publicstaticvoidmain(Stringarg[]){Ccc=newC();System.out.println("C:"+cc.b1+""+cc.b2+""+cc.b3+""+cc.getb4()+""+cc.a+""+cc.c);cc.change(15);System.out.println("C:"+cc.b1+""+cc.b2+""+cc.b3+""+cc.getb4()+""+cc.a+""+cc.c);}}假設(shè)CPP類與A、B、C類在同一個包中。classCPP假設(shè)CPP類與A、B、C類在同一個包中。69子類與父類的屬性與方法子類繼承父類中除private部分的所有內(nèi)容;子類中新增加的屬性和方法是對父類的擴展;子類中定義的與父類同名的屬性是對父類屬性的隱藏,同名的成員方法是對父類方法的重載或覆蓋。子類與父類的屬性與方法子類繼承父類中除private部分的所70類的成員覆蓋類成員覆蓋是指在子類中新增加的數(shù)據(jù)成員的名稱與父類相同,成員方法與父類定義的原型一樣;若希望引用父類中的相應(yīng)成員,需要使用關(guān)鍵字super作為前綴。類的成員覆蓋類成員覆蓋是指在子類中新增加的數(shù)據(jù)成員的名稱與父71classA{intx=1234;voidshow(){System.out.println("classA:");}}classBextendsA{doublex=567.89;//數(shù)據(jù)成員覆蓋,不提倡這樣使用。voidshow()//成員方法覆蓋{

super.show();System.out.println("classB:");}}classA72三、子類的構(gòu)造方法1、子類應(yīng)該負(fù)責(zé)調(diào)用父類的構(gòu)造方法。2、若子類中沒有定義構(gòu)造方法,則它自動地調(diào)用父類無參數(shù)的構(gòu)造方法;若子類定義了構(gòu)造方法,應(yīng)該在第一條語句的位置調(diào)用父類的構(gòu)造方法,否則系統(tǒng)將在此位置插入一條調(diào)用父類無參數(shù)構(gòu)造方法的語句。3、對于父類中含有參數(shù)的構(gòu)造方法,只能在子類的構(gòu)造方法中利用super顯式地調(diào)用。三、子類的構(gòu)造方法1、子類應(yīng)該負(fù)責(zé)調(diào)用父類的構(gòu)造方法。73classA{privateinta;A(){a=0;}A(inti){a=i;}intgetA(){returna;}}classBextendsA{doubleb1,b2;B(){this(11.1,12.2);}B(doubled1,doubled2){b1=d1;b2=d2;}B(inti,doubled1,doubled2){super(i);b1=d1;b2=d2;}B(inti,doubled){super(i);b1=d;b2=0;}B(doubled){super(4);b1=0;b2=d;}}classA74繼承性舉例:幾何圖元描述。任何一個幾何圖元都有顏色和原點這兩個基本屬性。矩形是一種圖元,它還有長(length)、寬(width)兩個屬性,正方形是一種特殊的矩形,它的特殊性在于長和寬相等。幾何圖元正方形圖元矩形圖元繼承性舉例:幾何圖元描述。任何一個幾何圖元都有顏色和原點這兩75Shape-Colorcolor-Pointorigin+voidsetShape()+ColorgetColor()+PointgetOrigin()+StringtoString()Color-intred,green,blue+setColor()+getRed()+getGreen()+getBlue()+StringtoString()Point-intx,y+setPoint()+getX()+getY()+StringtoString()ShapeRectangle-intlength,width+intarea()+intpermeter()+intgetLength()+intgetWidth()+voidsetWL()Square

+getEdge()+setEdge()第3次上機作業(yè)Shape-Colorcolor+voidsetShap76四、多態(tài)性的實現(xiàn)類對象之間的類型轉(zhuǎn)換ObjectTypeObject1=newObjectType();ObjectTypeObject2=Object1;結(jié)果:將Object1的引用賦給Object2若將子類對象的引用賦給父類對象的引用,則可以用顯式或隱式實現(xiàn),即可以直接將子類對象的引用直接賦給父類對象的引用;若將父類對象的引用賦給子類對象的引用,則必須使用顯式轉(zhuǎn)換,即強制類型轉(zhuǎn)換。四、多態(tài)性的實現(xiàn)類對象之間的類型轉(zhuǎn)換77classA{......}classBextendsA{......}ABBclass_b=newB();Aclass_a=class_b;class_aclass_bclassAABBclass_b=newB();cl78多態(tài)性的實現(xiàn)在Java語言中,使用動態(tài)聯(lián)編實現(xiàn)多態(tài)性,具體實現(xiàn)方式:多態(tài)性出現(xiàn)在繼承關(guān)系中;子類覆蓋父類的成員方法;若在程序中調(diào)用該方法,則根據(jù)對象所引用的實例所屬類確定最終調(diào)用的代碼塊。多態(tài)性的實現(xiàn)在Java語言中,使用動態(tài)聯(lián)編實現(xiàn)多態(tài)性,具體79多態(tài)性舉例AnimalDogCatDuck動物狗貓鴨子多態(tài)性舉例AnimalDogCatDuck動物狗貓鴨子80importjava.util.Random;publicabstractclassAnimal//動物類{protectedStringtype;//動物種類protectedStringname;//名稱protectedStringbreed;//品種publicAnimal(Stringtype,Stringname,Stringbreed){……}publicStringtoString(){return"Thisisa"+type+"\nIt's"+name+"the"+breed;}

publicabstractvoidsound();}importjava.util.Random;81classDogextendsAnimal//Dog類{publicDog(Stringname){super("Dog",name,"Unknow");}publicDog(Stringname,Stringbreed){super("Dog",name,breed);}

publicvoidsound(){System.out.println("WoofWoof");}}Cat、Duck兩個類的定義類似,只是sound()方法內(nèi)容不一樣。classDogextendsAnimal/82publicclassTryPolymorphism//測試類{ publicstaticvoidmain(String[]args) { Animal[]theAnimals={newDog("Rover","Poodle"), newCat("Max","Abyssinian"), newDuck("Daffy","Aylesbury")}; AnimalpetChoice;//聲明父類的引用for(inti=0;i<3;i++){petChoice=theAnimals[i];System.out.println("\nYourChoice:\n"+petChoice);

petChoice.sound();//根據(jù)petChoice所指對象類別做出響應(yīng)}}}publicclassTryPolymorphism83多態(tài)性應(yīng)用舉例:學(xué)校人事管理。為簡化問題的規(guī)模,假設(shè)只考慮學(xué)生和教師。Person-intnumber-Stringname-Datebirthday+getNumber()+getName()+getBirthday()+setInfo()+toString()Student-Stringmajor+getMajor()+setInfo()+toString()Teacher-Stringdepartment-floatsalary+getDepartment()+getSalary()+setInfo()+toString()多態(tài)性應(yīng)用舉例:學(xué)校人事管理。Person-intnumb84importjava.util.*;publicabstractclassPerson{ privateintnumber; privateStringname; privateDatebirthday; publicPerson(){……} publicPerson(intnumber,Stringname,Datebirthday){……}

publicvoidsetInfo(intnumber,Stringname,Datebirthday){……} publicintgetNumber(){returnnumber;} publicStringgetName(){returnname;} publicDategetBirthday(){returnbirthday;}

publicStringtoString(){……}}importjava.util.*;85publicclassStudentextendsPerson{ privateStringmajor; publicStudent(){super();} publicStudent(intnumber,Stringname,Datebirthday,Stringmajor) { super(number,name,birthday); this.major=newString(major); } publicStringgetMajor(){returnmajor;}

publicvoidsetInfo(intnumber,Stringname,Datebirthday,Stringmajor) {……}

publicStringtoString() { returnsuper.toString()+"Major:"+major; }}publicclassStudentextendsP86publicclassTeacherextendsPerson{ privateStringdepartment; floatsalary; publicTeacher(){……} publicTeacher(intnumber,Stringname,Datebirthday,Stringdepartment,floatsalary) {……} publicStringgetDepartment(){returndepartment;} publicfloatgetSalary(){returnsalary;}

publicvoidsetInfo(intnumber,Stringname,Datebirthday,Stringdepartment,floatsalary){……}

publicStringtoString(){……}}publicclassTeacherextendsP87importjava.io.*;importjava.util.*;publicclassTryClass{ publicstaticvoidmain(String[]args) {Datedate; Persons;date=newDate(1984,3,26);s=newStudent(100,"WangDong",date,"Computer"); System.out.println(s); s=newTeacher(200,"Chenping",newDate(1958,12,2),"Comupter",3000.0f); System.out.println(s); }}importjava.io.*;importja88構(gòu)造異質(zhì)鏈表異質(zhì)鏈表是每個結(jié)點存放不同類別對象的鏈表。要求這些對象所屬的類具有相同的父類。ListLink-Nodehead-Nodetail+append()+toString()Node-Personinfo-Nodenext+getInfo()+getNext()+setNext()+toString()構(gòu)造異質(zhì)鏈表異質(zhì)鏈表是每個結(jié)點存放不同類別對象的鏈表。要求這89publicclassNode//結(jié)點類{ privatePersoninfo; privateNodenext; publicNode(){……} publicNode(Personinfo){……} publicPersongetInfo(){returninfo;} publicNodegetNext(){returnnext;} publicvoidsetNext(Nodenode){this.next=node;} publicStringtoString(){returninfo.toString();}}publicclassNode//結(jié)點類90importjava.io.*;publicclassListLink//鏈表類{ Nodehead;//頭結(jié)點引用 Nodetail;//尾結(jié)點引用 publicListLink(){……} publicvoidappend(Personinfo){……} publicStringtoString() {Nodep; Strings=""; p=head.getNext();//頭結(jié)點之后的第1個結(jié)點 while(p!=null){s+=p.getInfo()+"\n";p=p.getNext(); } returns; }}importjava.io.*;91importjava.io.*;importjava.util.*;publicclassTryClass{ publicstaticvoidmain(String[]args) {ListLinklink=newListLink(); Datedate=newDate(1984,3,26); Students=newStudent(100,"WangDong",date,"Computer"); link.append(s); date=newDate(1958,12,2); Teachert=newTeacher(200,"Chenping",date,"Comupter",3000.0f); link.append(t); date=newDate(1982,10,26); s=newStudent(101,"LiLin",date,"Math"); link.append(s); date=newDate(1950,1,12); t=newTeacher(201,"Zhaoxue",date,"Physics",4000.0f); link.append(t); System.out.println(link);}}第4次上機作業(yè):請將第3題的圖元(線段、矩形、橢圓等)存儲在一個異質(zhì)鏈表中。importjava.io.*;impor92五、接口接口可以實現(xiàn)類間多繼承結(jié)構(gòu)。接口內(nèi)部只能定義public的抽象方法和公有的、靜態(tài)常量,因此接口中的所有方法都需要在子類中實現(xiàn)。

溫馨提示

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

評論

0/150

提交評論