




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
《類的繼承性》幻燈片本課件PPT僅供大家學(xué)習(xí)使用學(xué)習(xí)完請(qǐng)自行刪除,謝謝!本課件PPT僅供大家學(xué)習(xí)使用學(xué)習(xí)完請(qǐng)自行刪除,謝謝!本課件PPT僅供大家學(xué)習(xí)使用學(xué)習(xí)完請(qǐng)自行刪除,謝謝!本課件PPT僅供大家學(xué)習(xí)使用學(xué)習(xí)完請(qǐng)自行刪除,謝謝!《類的繼承性》幻燈片本課件PPT僅供大家學(xué)習(xí)使用《類的繼承性》教學(xué)課件《類的繼承性》教學(xué)課件《類的繼承性》教學(xué)課件《類的繼承性》教學(xué)課件訪問控制權(quán)限了解
訪問控制權(quán)限了解第3講面向?qū)ο缶幊獭哺呒?jí)篇〕第3講面向?qū)ο缶幊獭哺呒?jí)篇〕面向?qū)ο缶幊獭哺灼持R(shí)回憶面向?qū)ο缶幊獭哺灼持R(shí)回憶主要內(nèi)容3.1繼承性3.2多態(tài)性3.3抽象類3.4接口3.5內(nèi)部類和匿名類3.1繼承的作用3.2子類對(duì)象的創(chuàng)立3.3在子類中訪問父類的成員3.4覆蓋父類的方法主要內(nèi)容3.1繼承性3.1繼承的作用繼承Person-name:String-age:String+getName():String+setName(Stringn):void+getAge():String+setAge(inta):voidStudent-name:String-age:String-school:String+getName():String+setName(Stringn):void+getAge():String+setAge(inta):void+getSchool():String+setSchool(Strings):void為什么引入繼承的特性?模仿人類的思維方式—人類的繼承性繼承Person-name:String+getNamPerson類classPerson{privateStringname;privateintage;publicStringgetName(){returnname;}
publicvoidsetName(Stringn){name=n;}publicintgetAge(){returnage;}publicvoidsetAge(inta){age=a;}}Student類classStudent{privateStringname;privateintage;privateStringschool;publicStringgetName(){returnname;}publicvoidsetName(Stringn){name=n;}publicintgetAge(){returnage;}publicvoidsetAge(inta){age=a;}publicStringgetSchool{returnschool;}publicvoidsetSchool(Strings){school=s;}}Person類Student類繼承為什么引入繼承的特性?模仿人類的思維方式—人類的繼承性2.程序的代碼重用性—少寫代碼繼承為什么引入繼承的特性?模仿人類的思維方式—人類的繼承性2繼承關(guān)系格式:class父類{……}class子類extends
父類{……}試驗(yàn)!eXTdEMO1.JAVAeXTdEMO2.JAVA繼承關(guān)系格式:class父類試驗(yàn)!eXTdEMO1.JAVQQ牧場的設(shè)計(jì)目的:了解在真實(shí)系統(tǒng)中進(jìn)展設(shè)計(jì)時(shí)如何進(jìn)展繼承層次的設(shè)計(jì)?QQ牧場的設(shè)計(jì)目的:了解在真實(shí)系統(tǒng)中進(jìn)展設(shè)計(jì)時(shí)如何進(jìn)展繼承層①找出對(duì)象的共同屬性和行為這個(gè)程序必須能夠在任何時(shí)候參加新類型的動(dòng)物。首先要區(qū)分出所有動(dòng)物都有的、抽象的共同特征,然后以這些共同特征設(shè)計(jì)出能夠讓所有動(dòng)物加以擴(kuò)大的類。考慮:這6種動(dòng)物有什么共同特點(diǎn)?這些類型有什么相關(guān)性?①找出對(duì)象的共同屬性和行為這個(gè)程序必須能夠在任何時(shí)①找出對(duì)象的共同屬性和行為5個(gè)實(shí)例變量: picture:動(dòng)物JPEG圖像的名稱 food:此動(dòng)物所吃的食物(meat/grass) hunger:代表饑餓程度的int值。會(huì)根據(jù)動(dòng)物吃了多少食物而改變。 boundaries:代表動(dòng)物活動(dòng)范圍區(qū)域的長寬。 location:動(dòng)物在活動(dòng)區(qū)域中的位置。4個(gè)實(shí)例方法:
makeNoise():動(dòng)物發(fā)出聲音的行為和程序。 eat():動(dòng)物遇到食物時(shí)的行為程序。 sleep():睡眠的行為程序。 roam():不在進(jìn)食或睡眠時(shí)的行為程序。①找出對(duì)象的共同屬性和行為5個(gè)實(shí)例變量:②設(shè)計(jì)代表共同狀態(tài)與行為的類Animal-Stringpictual-Stringfood-inthunger-Positionboudaries-PositionlocationvoidmakeNoise()voideat()voidsleep()voidroam()LionCatTiggerHippoDogWolf②設(shè)計(jì)代表共同狀態(tài)與行為的類Animal-String③決定子類是否需要讓某項(xiàng)行為有特定的不同的運(yùn)行方式Animal成員變量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggerHippoDogWolf③決定子類是否需要讓某項(xiàng)行為有特定的不同的運(yùn)行方式Anima③決定子類是否需要讓某項(xiàng)行為有特定的不同的運(yùn)行方式Animal成員變量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()③決定子類是否需要讓某項(xiàng)行為有特定的不同的運(yùn)行方式Anima④尋找更多抽象化的時(shí)機(jī)Animal成員變量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()④尋找更多抽象化的時(shí)機(jī)Animal成員變量voidm⑤完成類的繼承層次Animal。。。。。。。。。。。。LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()Feline……roam()Canine……roam()⑤完成類的繼承層次Animal。。。。。。。。。。。。Lio⑤完成類的繼承層次④尋找更多抽象化的時(shí)機(jī)③決定子類是否需要讓某項(xiàng)行為有特定的不同的運(yùn)行方式②設(shè)計(jì)代表共同狀態(tài)與行為的類如何進(jìn)展繼承層次的設(shè)計(jì)--自下而上的設(shè)計(jì)
①找出對(duì)象的共同屬性和行為⑤完成類的繼承層次④尋找更多抽象化的時(shí)機(jī)③決定子類是否需要讓子類對(duì)象調(diào)用成員的原那么AnimalmakeNoise()eat()sleep()roam()WolfvoidmakeNoise()voideat()Canine……roam()創(chuàng)建大野狼對(duì)象Wolfw=newWolf();調(diào)用大野狼的方法w.makeNoise();調(diào)用犬科的方法w.roam();調(diào)用動(dòng)物的方法w.sleep()最低階原那么子類對(duì)象調(diào)用成員的原那么AnimalmakeNoise()W③添加子類的新成員②改造父類的成員①繼承父類的成員父類如何進(jìn)展子類設(shè)計(jì)--自上而下的設(shè)計(jì)
③添加子類的新成員②改造父類的成員①繼承父類的成員父類訪問控制權(quán)限了解
訪問控制權(quán)限了解③添加子類的新成員②改造父類的成員①繼承父類的成員父類如何進(jìn)展子類設(shè)計(jì)--自上而下的設(shè)計(jì)
③添加子類的新成員②改造父類的成員①繼承父類的成員父類子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程二、super的作用子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程子類的創(chuàng)立一、子類對(duì)象的實(shí)例化過程classPerson{ publicPerson()父類構(gòu)造〞);}}classStudent{ publicStudent()子類構(gòu)造〞);}}子類的創(chuàng)立一、子類對(duì)象的實(shí)例化過程子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程publicclassTestDemo11{ publicstaticvoidmain(Stringargs[]){
Studentstu=newStudent(); }}運(yùn)行結(jié)果:
?子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程運(yùn)行結(jié)果:?子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程1、先自動(dòng)調(diào)用父類構(gòu)造函數(shù)〔父類中的無參構(gòu)造函數(shù)〕2、然后調(diào)用子類構(gòu)造函數(shù)注意:如果父類中有多個(gè)構(gòu)造方法時(shí),如何才能調(diào)用父類中某個(gè)特定的構(gòu)造方法呢?其做法是在子類的構(gòu)造方法中通過super〔…〕來調(diào)用父類特定的構(gòu)造方法。子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程創(chuàng)立子類二、super()、super(……)classPerson{ privateStringname; privateintage; publicPerson() {調(diào)用Person類的無參構(gòu)造方法〞);} publicPeron(Stringname,intage)調(diào)用了Person類的有參構(gòu)造方法〞); =name; this.age=age;} publicvoidshow() {姓名:〞+name+〞年齡:〞+age);} }創(chuàng)立子類二、super()、super(……)子類對(duì)象的創(chuàng)立classStudentextendsPerson{ privateStringdepartment; publicStudent()無參構(gòu)造〞);} publicStudent(Stringname,intage,Stringdep) {super(name,age); department=dep;我是〞+department+〞的學(xué)生〞);有參構(gòu)造〞);}}子類對(duì)象的創(chuàng)立classStudentextendsP子類對(duì)象的創(chuàng)立publicclassTestDemo1{ publicstaticvoidmain(Stringargs[]){ Studentstu1=newStudent(); Studentstu2=newStudent(“李四〞,23,〞計(jì)算機(jī)系〞); stu1.show(); stu2.show(); }}子類對(duì)象的創(chuàng)立publicclassTestDemo1{子類對(duì)象的創(chuàng)立省略紅色字體super(name,age),父類中的構(gòu)造方法哪個(gè)會(huì)被調(diào)用?子類構(gòu)造方法中調(diào)用父類構(gòu)造方法的super語句位置有沒有限制?如果父類中只定義了有參的構(gòu)造方法,而子類的構(gòu)造方法中并沒有顯式的用super〔〕來調(diào)用父類中特定的構(gòu)造方法,程序此時(shí)會(huì)有問題嗎?找出this和super的一樣點(diǎn)和不同點(diǎn)。思考??!!找出繼承中構(gòu)造方法的調(diào)用規(guī)那么子類對(duì)象的創(chuàng)立省略紅色字體super(name,age),父成員變量的隱藏和方法的覆寫〔1〕當(dāng)在子類中定義的成員變量和父類中的成員變量同名時(shí),此時(shí)稱子類的成員變量隱藏了父類的成員變量。改造父類的成員〔2〕當(dāng)子類中定義了一個(gè)方法,并且這個(gè)方法的名字,返回類型,參數(shù)個(gè)數(shù)以及類型和父類的某個(gè)方法完全一樣時(shí),父類的這個(gè)方法將被隱藏,這時(shí)我們說重寫了父類的方法。子類通過成員變量的隱藏和方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。成員變量的隱藏和方法的覆寫〔1〕當(dāng)在子類中定義的成員變量和父成員變量的隱藏和方法的覆寫例如下面的這段程序就是這樣的情況:classSuperClass{//父類
inty;
voidsetY(){y=0;}}classSubClassextendsSuperClass{inty;//父類變量y被隱藏
voidsetY(){//重寫父類的方法setY()y=1;}}publicTestDemo3{publicstaticvoidmain(Stringargs[]){
SubClassss=newSubClass();
ss.setY();}}成員變量的隱藏和方法的覆寫例如下面的這段程序就是這樣的情況:
子類在隱藏了父類的成員變量或重寫了父類的方法后,常常還要用到父類的成員變量,或在重寫的方法中使用父類中被重寫的方法以簡化代碼的編寫,這時(shí)就要訪問父類的成員變量或調(diào)用父類的方法,Java中通過super來實(shí)現(xiàn)對(duì)父類成員的訪問。this用來引用當(dāng)前對(duì)象,與this類似,super用來引用當(dāng)前對(duì)象的父類。super的使用可以分為下面三種情況:
1)用來訪問父類被隱藏的成員變量,如:
super.y2)用來調(diào)用父類中被重寫的方法,如:
super.setY()
3)用來調(diào)用父類的構(gòu)造方法,如:
super([paramlist]);成員變量的隱藏和方法的覆寫思考:方法的重載與覆寫非常類似,找出它們的區(qū)別?。?!子類在隱藏了父類的成員變量或重寫了父類課后討論討論二類的繼承性與多態(tài)性〔1〕主題一:方案設(shè)計(jì)分析主題三:知識(shí)原理掌握—構(gòu)造方法的重載思考:〔1〕找出父類向子類派生時(shí),構(gòu)造方法的調(diào)用規(guī)律〔2〕找出方法的重載與重寫的區(qū)別課后討論討論二類的繼承性與多態(tài)性〔1〕主題一:方案設(shè)計(jì)分析寫出你所能想到的所有二維、三維形狀,并用它們組成一個(gè)形狀層次構(gòu)造。層次構(gòu)造把Shape當(dāng)作超類,并從中派生出TwoDimensionalShape類和ThreeDimensionalShape類。設(shè)計(jì)這個(gè)層次構(gòu)造,并定義它的所有類。畫出相應(yīng)的類層次構(gòu)造圖。接下來考慮如果將Shape類變成abstract超類,TwoDimensionalShape類和hreeDimensionalShape類也是abstract類。進(jìn)展相應(yīng)的派生后,要求在第三層的類中計(jì)算出每個(gè)類對(duì)應(yīng)對(duì)象的面積和體積。主題一:方案設(shè)計(jì)分析寫出你所能想到的所有二維、三維形狀,并用主題三:知識(shí)原理掌握—構(gòu)造方法的重載建立一個(gè)人類〔Person〕和學(xué)生類〔Student〕,功能要求如下:〔1〕Person中包含4個(gè)保護(hù)型的數(shù)據(jù)成員name、addr、sex、age,表示姓名、地址、性別和年齡。用一個(gè)4參構(gòu)造方法、一個(gè)兩參構(gòu)造方法、一個(gè)無參構(gòu)造方法來實(shí)例化對(duì)象,用一個(gè)輸出方法顯示4種屬性。〔2〕Student類繼承Person類,并增加輸出成員math、english存放數(shù)學(xué)、英語成績。用一個(gè)6參構(gòu)造方法、一個(gè)兩參構(gòu)造方法、一個(gè)無參構(gòu)造方法來實(shí)例化對(duì)象,另外重寫輸出方法用于顯示6種屬性。主題三:知識(shí)原理掌握—構(gòu)造方法的重載建立一個(gè)人類〔Perso第3章面向?qū)ο蟾呒?jí)程序設(shè)計(jì)3.1繼承3.2多態(tài)性3.3抽象類和抽象方法3.4接口3.5內(nèi)部類和匿名類第3章面向?qū)ο蟾呒?jí)程序設(shè)計(jì)3.1繼承3.2多態(tài)性多態(tài)(Polymorphism)的意思就是用一樣的名字來定義不同的方法。在Java中,普通類型的多態(tài)為重載,這就意味著可以使幾個(gè)不同的方法使用一樣的名字,這些方法以參數(shù)的個(gè)數(shù)不同、參數(shù)的類型不同等方面來進(jìn)展區(qū)分,以使得編譯器能夠進(jìn)展識(shí)別。也可以這樣講,重載是同一個(gè)方法具有不同的版本,每個(gè)版本之間在參數(shù)特征方面有差異。重載是Java實(shí)現(xiàn)多態(tài)性的方式之一。例如:family()方法可以有三個(gè)版本,如下:family(){}family(Stringch){address=ch;}family(Stringch,floatn){address=ch;pay=n;}這些方法并存于程序中,編譯時(shí),編譯器根據(jù)實(shí)參的類型和個(gè)數(shù)來區(qū)分從而調(diào)用那個(gè)方法。如果這些方法作為函數(shù)或過程同時(shí)出現(xiàn)在其它語言的程序中,如C,那將導(dǎo)致災(zāi)難性的錯(cuò)誤。3.2多態(tài)性多態(tài)(Polymorphism3.2多態(tài)性【例3-6】構(gòu)造方法重載的例子classperson{Stringname="Johnson";//姓名
intage=45;//年齡
person(){}
person(Stringa){name=a;}
person(Stringa,intb){name=a;age=b;}name+","+"Age="+age);}}publicclassPoly{publicstaticvoidmain(String[]args){personko1=newperson();personko2=newperson("Mike");personko3=newperson("Willian",50);ko1.display();ko2.display();ko3.display();}}3.2多態(tài)性【例3-6】構(gòu)造方法重載的例子3.2多態(tài)性在Java語言中,多態(tài)性主要表達(dá)在兩個(gè)方面:由方法重載實(shí)現(xiàn)的靜態(tài)多態(tài)性〔編譯時(shí)多態(tài)〕和方法重寫實(shí)現(xiàn)的動(dòng)態(tài)多態(tài)性〔運(yùn)行時(shí)多態(tài)〕,如下:
1〕編譯時(shí)多態(tài)
在編譯階段,具體調(diào)用哪個(gè)被重載的方法,編譯器會(huì)根據(jù)參數(shù)的不同來靜態(tài)確定調(diào)用相應(yīng)的方法。
2〕運(yùn)行時(shí)多態(tài)
由于子類繼承了父類所有的屬性〔私有的除外〕,所以子類對(duì)象可以作為父類對(duì)象使用。程序中但凡使用父類對(duì)象的地方,都可以用子類對(duì)象來代替。一個(gè)對(duì)象可以通過引用子類的實(shí)例來調(diào)用子類的方法。如果子類重寫了父類的方法,那么重寫方法的調(diào)用原那么如下:Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例,來決定調(diào)用哪個(gè)方法。對(duì)子類的一個(gè)實(shí)例,如果子類重寫了父類的方法,那么運(yùn)行時(shí)系統(tǒng)調(diào)用子類的方法;如果子類繼承了父類的方法〔未重寫〕,那么運(yùn)行時(shí)系統(tǒng)調(diào)用父類的方法。另外,方法重寫時(shí)應(yīng)遵循的原那么如下:改寫后的方法不能比被重寫的方法有更嚴(yán)格的訪問權(quán)限。改寫后的方法不能比被重寫的方法產(chǎn)生更多的異常。進(jìn)展方法重寫時(shí)必須遵從這兩個(gè)原那么,否那么編譯器會(huì)指出程序出錯(cuò)。3.2多態(tài)性在Java語言中,多態(tài)性主要表達(dá)在兩3.2多態(tài)性【例3-7】方法重寫的例子classParent{publicvoidfunction(){}}classChildextendsParent{
privatevoidfunction(){}}publicclassRTpolyTest{publicstaticvoidmain(Stringargs[]){Parentpl=newParent();Parentp2=newChild();p1.function();p2.function();}}3.2多態(tài)性【例3-7】方法重寫的例子3.2多態(tài)性編譯過程如下:D:\user\chap05>JavacRTpolyTest.javaRTpolyTest.java:8:function()inChildcannotoverridefunction()inParent;attemptingtoassignweakeraccessprivileges;waspublicprivatevoidfunction(){^RTpolyTest.java:16:cannotfindsymbolsymbol:variablep1location:classRTpolyTestp1.function();^2errors可以看出,該程序中實(shí)例p2調(diào)用function()方法時(shí)會(huì)導(dǎo)致訪問權(quán)限的沖突。
3.2多態(tài)性編譯過程如下:第3章面向?qū)ο蟾呒?jí)程序設(shè)計(jì)3.1繼承3.2多態(tài)性3.3抽象類和抽象方法3.4接口3.5內(nèi)部類和匿名類第3章面向?qū)ο蟾呒?jí)程序設(shè)計(jì)3.1繼承3.3抽象類和抽象方法Java語言中,用abstract關(guān)鍵字來修飾一個(gè)類時(shí),這個(gè)類叫做抽象類。一個(gè)abstract類只關(guān)心它的子類是否具有某種功能,并不關(guān)心該功能的具體實(shí)現(xiàn),功能的具體行為由子類負(fù)責(zé)實(shí)現(xiàn)的。例如:
publicabstractclassDrawing{publicabstractvoiddrawDot(intx,inty);publicvoiddrawLine(intx1,inty1,intx2,inty2){…………}}
用abstract來修飾一個(gè)方法時(shí),該方法叫做抽象方法。與final類和方法相反,abstract類必須被繼承,abstract方法必須被重寫。
3.3抽象類和抽象方法Java語言中,用abs3.3抽象類和抽象方法
當(dāng)一個(gè)類的定義完全表示抽象的概念時(shí),它不應(yīng)該被實(shí)例化為一個(gè)對(duì)象。例如Java中的Number類就是一個(gè)抽象類,它只表示數(shù)字這一抽象概念,只有當(dāng)它作為整數(shù)類Integer或?qū)崝?shù)類Float等的父類時(shí)才有意義。定義一個(gè)抽象類的格式如下:
abstractclassabstractClass{……}
由于抽象類不能被實(shí)例化,因此下面的語句會(huì)產(chǎn)生編譯錯(cuò)誤:
newabstractClass();抽象類中可以包含抽象方法,為所有子類定義一個(gè)統(tǒng)一的接口,對(duì)抽象方法只需聲明,而不需實(shí)現(xiàn),因此它沒有方法體。其格式如下:
abstracreturnTypeabstractMethod([paramlist));
3.3抽象類和抽象方法當(dāng)一個(gè)類的定義完全表示抽象使用abstract的另一例子abstractclassAA{abstractvoidcallme();voidmetoo(){}}classBBextendsAA{voidcallme(){}}publicclassAAbstract{publicstaticvoidmain(Stringargs[]){AAcc=newBB();//cc為上轉(zhuǎn)型對(duì)象
cc.callme();cc.metoo();}}
使用abstract的另一例子abstractclass第3章面向?qū)ο蟾呒?jí)程序設(shè)計(jì)3.1繼承3.2多態(tài)性3.3抽象類和抽象方法3.4接口3.5內(nèi)部類和匿名類第3章面向?qū)ο蟾呒?jí)程序設(shè)計(jì)3.1繼承3.4接口接口聲明使用接口的優(yōu)點(diǎn)3.4接口接口聲明接口聲明從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實(shí)現(xiàn)。通過接口使得處于不同層次,甚至互不相關(guān)的類可以具有一樣的行為。接口其實(shí)就是方法定義和常量值的集合。它的優(yōu)點(diǎn)主要表達(dá)在下面幾個(gè)方面:(1)通過接口可以實(shí)現(xiàn)不相關(guān)類的一樣行為,而不需要考慮這些類之間的層次關(guān)系。(2)通過接口可以指明多個(gè)類需要實(shí)現(xiàn)的方法。(3)通過接口可以了解對(duì)象的交互界面,而不需了解對(duì)象所對(duì)應(yīng)的類。接口把方法的定義和類的層次區(qū)分開來,通過它可以在運(yùn)行時(shí)動(dòng)態(tài)地定位所調(diào)用的方法。同時(shí)接口中可以實(shí)現(xiàn)“多重繼承〞,且一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。正是這些機(jī)制使得接口提供了比多重繼承〔如C++等語言〕更簡單、更靈活、而且更強(qiáng)勁的功能。接口聲明從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包接口聲明Java不支持多繼承性,即一個(gè)類只能有一個(gè)父類。單繼承性使得Java類層次簡單,易于程序的管理。為了抑制單繼承的缺點(diǎn),Java使用了接口,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。使用關(guān)鍵字interface來定義一個(gè)接口。接口的定義和類的定義很相似,分為接口聲明和接口體兩局部。1、接口聲明我們?cè)褂胏lass關(guān)鍵字來聲明類,接口通過使用關(guān)鍵自interface來聲明.完整的接口定義格式如下:[public]interfaceinterfaceName[extendslistOfSuperInterface]{……}其中public修飾符指明任意類均可以使用這個(gè)接口,缺省情況下,只有與該接口定義在同一個(gè)包中的類才可以訪問這個(gè)接口。extends子句與類聲明中的extends子句根本一樣,不同的是一個(gè)接口可以有多個(gè)父接口,用逗號(hào)隔開,而一個(gè)類只能有一個(gè)父類。子接口繼承父接口中所有的常量和方法。通常接口名稱以able或ible結(jié)尾,說明接口能完成一定的行為,例如Runnable、Serializable。接口聲明Java不支持多繼承性,即一個(gè)類只能有一接口聲明2、接口體接口體中包含常量定義和方法定義兩局部。其中常量定義局部定義的常量均具有public、static和final屬性。其格式如下:returnTypemethodName([paramlist]);接口中只能進(jìn)展方法的聲明,而不提供方法的實(shí)現(xiàn),所以,方法定義沒有方法體,且用分號(hào)(;)結(jié)尾,在接口中聲明的方法具有public和abstract屬性。另外,如果在子接口中定義了和父接口同名的常量,那么父接口中的常量被隱藏。例如:interfaceSummaryable{finalintMAX=50;//MAX具有public、static、final屬性voidprintone(floatx);floatsum(floatx,floaty);}上面這段程序可以以Summaryable.java來保存,也可以寫入其它Java程序中。接口聲明2、接口體接口聲明3、接口的使用一個(gè)類通過使用關(guān)鍵字implements聲明自己使用〔或?qū)崿F(xiàn)〕一個(gè)或多個(gè)接口。如果使用多個(gè)接口,用逗號(hào)隔開接口名。如classCalculateextendsComputerimplementsSummary,Substractable{……}類Calculate使用了Summary和Substractable接口,繼承了Computer類。如果一個(gè)類使用了某個(gè)接口,那么這個(gè)類必須實(shí)現(xiàn)該接口的所有方法,即為這些方法提供方法體。需要注意的如下:1〕在類中實(shí)現(xiàn)接口的方法時(shí),方法的名字,返回類型,參數(shù)個(gè)數(shù)及類型必須與接口中的完全一致。2〕接口中的方法被默認(rèn)是public,所以類在實(shí)現(xiàn)接口方法時(shí),一定要用public來修飾。3〕另外,如果接口的方法的返回類型如果不是void的,那么在類中實(shí)現(xiàn)該接口方法時(shí),方法體至少要有一個(gè)return語句。如果是void型,類體除了兩個(gè)大括號(hào)外,也可以沒有任何語句.接口聲明3、接口的使用使用接口的優(yōu)點(diǎn)【例3-9】
使用多重接口的例子//MultInterfaces.javainterfaceI1{abstractvoidtest(inti);}interfaceI2{abstractvoidtest(Strings);}publicclassMultInterfacesimplementsI1,I2{publicvoidtest(inti){}publicvoidtest(Strings){}publicstaticvoidmain(String[]a){MultInterfacest=newMultInterfaces();t.test(42);t.test("Hello");}}使用接口的優(yōu)點(diǎn)【例3-9】使用多重接口的例子第3章面向?qū)ο蟾呒?jí)程序設(shè)計(jì)3.1繼承3.2多態(tài)性3.3抽象類和抽象方法3.4接口3.5內(nèi)部類和匿名類第3章面向?qū)ο蟾呒?jí)程序設(shè)計(jì)3.1繼承3.5內(nèi)部類和匿名類內(nèi)部類的定義內(nèi)部類特性匿名類3.5內(nèi)部類和匿名類內(nèi)部類的定義內(nèi)部類的定義簡單地說,一個(gè)類被嵌套定義于另一個(gè)類中,稱為嵌套類。在大多數(shù)情況下,嵌套類〔靜態(tài)的嵌套類除外)就是內(nèi)部類〔innerclass〕。包含內(nèi)部類的類稱為外部類。與一般的類一樣,內(nèi)部類具有自己的成員變量和成員方法。通過建立內(nèi)部類的對(duì)象,可以存取其成員變量和調(diào)用其成員方法。例如下面的例子:pubicclassGroupOne{intcount;//外部類的成員變量publicclassStudent{//聲明內(nèi)部類Stringname;//內(nèi)部類的成員變量publicvoidoutput(){//內(nèi)部類的成員方法;}}}內(nèi)部類的定義簡單地說,一個(gè)類被嵌套定義于另一個(gè)類內(nèi)部類的定義實(shí)際上,Java語言標(biāo)準(zhǔn)對(duì)于內(nèi)部類有如下的規(guī)定:在另一個(gè)類或者一個(gè)接口中聲明一個(gè)類。在另一個(gè)接口或者一個(gè)類中聲明一個(gè)接口。在一個(gè)方法中聲明一個(gè)類。類和接口聲明可嵌套任意深度。從上面的規(guī)定中我們可以看出,內(nèi)部類的定義是非常靈活的。內(nèi)部類的定義實(shí)際上,Java語言標(biāo)準(zhǔn)對(duì)于內(nèi)部類內(nèi)部類特性內(nèi)部類有如下特性:一般用在定義它的類或語句塊之內(nèi),在外部引用它時(shí)必須給出完整的名稱。名稱不能與包含它的類名一樣??梢允褂冒耐獠款惖撵o態(tài)成員變量和實(shí)例成員變量,也可以使用它所在方法的局部變量??梢远x為abstract??梢月暶鳛閜rivate或protected。假設(shè)被聲明為static,就變成了頂層類,不能再使用局部變量。假設(shè)想在內(nèi)部類中聲明任何static成員,那么該內(nèi)部類必須聲明為static。Java將內(nèi)部類作為外部類的一個(gè)成員,就如同成員變量和成員方法一樣。因此外部類與內(nèi)部類的訪問原那么是:在外部類中,通過一個(gè)內(nèi)部類的對(duì)象引用內(nèi)部類中的成員;反之,在內(nèi)部類中可以直接引用它的外部類的成員,包括靜態(tài)成員、實(shí)例成員及私有成員。內(nèi)部類特性內(nèi)部類有如下特性:內(nèi)部類特性【例3-10】內(nèi)部類和外部類之間的訪問本例的類GroupTwo中聲明了成員變量count、內(nèi)部類Student、實(shí)例方法output和main方法,在內(nèi)部類Student中聲明了構(gòu)造方法和output方法,構(gòu)造方法存取了外部類GroupTwo的成員變量count。程序運(yùn)行結(jié)果:Johnsoncount=1本例演示嵌套的兩個(gè)類之間的訪問規(guī)那么,即在外部類GroupTwo中,通過一個(gè)內(nèi)部類Student的對(duì)象s1可以引用內(nèi)部類中的成員;反之,在內(nèi)部類Student中可以直接引用它的外部類的成員,如count。本例的外部類GroupTwo中有實(shí)例方法output(),內(nèi)部類Student中也有實(shí)例方法output(),兩者雖然同名,卻表達(dá)不同含義。使用時(shí),外部類GroupTwo的對(duì)象調(diào)用GroupTwo的output,如g2.output(),內(nèi)部類Student的對(duì)象調(diào)用Student的output,如s1.output()。內(nèi)部類特性【例3-10】內(nèi)部類和外部類之間的訪問內(nèi)部類特性publicclassGroupTwo{//例5-10privateintcount;//外部類的私有成員變量
publicclassStudent{//聲明內(nèi)部類
Stringname;publicStudent(Stringn1){name=n1;count++;//存取其外部類的成員變量
}publicvoidoutput(){}}publicvoidoutput(){//外部類的實(shí)例成員方法
Students1=newStudent("Johnson");//建立內(nèi)部類對(duì)象"s1.output();//通過s1調(diào)用內(nèi)部類的成員方法
}publicstaticvoidmain(Stringargs[]){GroupTwog2=newGroupTwo();g2.output();}}內(nèi)部類特性publicclassGroupTwo{內(nèi)部類特性【例3-11】內(nèi)部類訪問外部靜態(tài)變量
GroupThree.java【例3-12】靜態(tài)公用內(nèi)部類
GroupFour.java【例3-13】抽象內(nèi)部類
GroupFive.java【例3-14】內(nèi)部接口
GroupSix.java【例3-15】局部內(nèi)部類
GoogsSeven.java內(nèi)部類特性匿名類匿名類是不能有名稱的類,所以沒方法引用它們。必須在創(chuàng)立時(shí),作為new語句的一局部來聲明它們。要采用另一種形式的new語句,如下所示:
new<類或接口><類的主體>
這種形式的new語句聲明一個(gè)新的匿名類,它對(duì)一個(gè)給定的類進(jìn)展擴(kuò)展,或者實(shí)現(xiàn)一個(gè)給定的接口。它還創(chuàng)立那個(gè)類的一個(gè)新實(shí)例,并把它作為語句的結(jié)果而返回。要擴(kuò)展的類和要實(shí)現(xiàn)的接口是new語句的操作數(shù),后跟匿名類的主體。從技術(shù)上說,匿名類可被視為非靜態(tài)的內(nèi)部類,所以它們具有和方法內(nèi)部聲明的非靜態(tài)內(nèi)部類一樣的權(quán)限和限制。
有關(guān)匿名類的使用詳見本書第12章本分內(nèi)容。內(nèi)部和匿名類是Java為我們提供的兩個(gè)出色的工具。它們提供了更好的封裝,結(jié)果就是使代碼更容易理解和維護(hù),使相關(guān)的類都能存在于同一個(gè)源代碼文件中〔這要?dú)w功于內(nèi)部類〕,并能防止一個(gè)程序產(chǎn)生大量非常小的類〔這要?dú)w功于匿名類〕。匿名類匿名類是不能有名稱的類,所以沒方法引用它們。必須在創(chuàng)立匿名類例子
f=newFrame("Innerclassesexample");
tf=newTextField(30);
}
匿名類例子f=newFrame("InnerpublicvoidlaunchFrame(){
Labellabel=newLabel("Clickanddragthemouse");
f.add(label,BorderLayout.NORTH);
f.add(tf,BorderLayout.SOUTH);
f.addMouseMotionListener(newMouseMotionAdapter(){//匿名類開場
publicvoidmouseDragged(MouseEvente){
Strings="Mousedragging:x="+e.getX()+"Y="+e.getY();
tf.setText(s);}
});//匿名類完畢
f.setSize(300,200);
f.setVisible(true);
}
publicstaticvoidmain(Stringargs[]){
AnonymousClassobj=newAnonymousClass();
obj.launchFrame();
}
}
publicvoidlaunchFrame(){
《類的繼承性》幻燈片本課件PPT僅供大家學(xué)習(xí)使用學(xué)習(xí)完請(qǐng)自行刪除,謝謝!本課件PPT僅供大家學(xué)習(xí)使用學(xué)習(xí)完請(qǐng)自行刪除,謝謝!本課件PPT僅供大家學(xué)習(xí)使用學(xué)習(xí)完請(qǐng)自行刪除,謝謝!本課件PPT僅供大家學(xué)習(xí)使用學(xué)習(xí)完請(qǐng)自行刪除,謝謝!《類的繼承性》幻燈片本課件PPT僅供大家學(xué)習(xí)使用《類的繼承性》教學(xué)課件《類的繼承性》教學(xué)課件《類的繼承性》教學(xué)課件《類的繼承性》教學(xué)課件訪問控制權(quán)限了解
訪問控制權(quán)限了解第3講面向?qū)ο缶幊獭哺呒?jí)篇〕第3講面向?qū)ο缶幊獭哺呒?jí)篇〕面向?qū)ο缶幊獭哺灼持R(shí)回憶面向?qū)ο缶幊獭哺灼持R(shí)回憶主要內(nèi)容3.1繼承性3.2多態(tài)性3.3抽象類3.4接口3.5內(nèi)部類和匿名類3.1繼承的作用3.2子類對(duì)象的創(chuàng)立3.3在子類中訪問父類的成員3.4覆蓋父類的方法主要內(nèi)容3.1繼承性3.1繼承的作用繼承Person-name:String-age:String+getName():String+setName(Stringn):void+getAge():String+setAge(inta):voidStudent-name:String-age:String-school:String+getName():String+setName(Stringn):void+getAge():String+setAge(inta):void+getSchool():String+setSchool(Strings):void為什么引入繼承的特性?模仿人類的思維方式—人類的繼承性繼承Person-name:String+getNamPerson類classPerson{privateStringname;privateintage;publicStringgetName(){returnname;}
publicvoidsetName(Stringn){name=n;}publicintgetAge(){returnage;}publicvoidsetAge(inta){age=a;}}Student類classStudent{privateStringname;privateintage;privateStringschool;publicStringgetName(){returnname;}publicvoidsetName(Stringn){name=n;}publicintgetAge(){returnage;}publicvoidsetAge(inta){age=a;}publicStringgetSchool{returnschool;}publicvoidsetSchool(Strings){school=s;}}Person類Student類繼承為什么引入繼承的特性?模仿人類的思維方式—人類的繼承性2.程序的代碼重用性—少寫代碼繼承為什么引入繼承的特性?模仿人類的思維方式—人類的繼承性2繼承關(guān)系格式:class父類{……}class子類extends
父類{……}試驗(yàn)!eXTdEMO1.JAVAeXTdEMO2.JAVA繼承關(guān)系格式:class父類試驗(yàn)!eXTdEMO1.JAVQQ牧場的設(shè)計(jì)目的:了解在真實(shí)系統(tǒng)中進(jìn)展設(shè)計(jì)時(shí)如何進(jìn)展繼承層次的設(shè)計(jì)?QQ牧場的設(shè)計(jì)目的:了解在真實(shí)系統(tǒng)中進(jìn)展設(shè)計(jì)時(shí)如何進(jìn)展繼承層①找出對(duì)象的共同屬性和行為這個(gè)程序必須能夠在任何時(shí)候參加新類型的動(dòng)物。首先要區(qū)分出所有動(dòng)物都有的、抽象的共同特征,然后以這些共同特征設(shè)計(jì)出能夠讓所有動(dòng)物加以擴(kuò)大的類。考慮:這6種動(dòng)物有什么共同特點(diǎn)?這些類型有什么相關(guān)性?①找出對(duì)象的共同屬性和行為這個(gè)程序必須能夠在任何時(shí)①找出對(duì)象的共同屬性和行為5個(gè)實(shí)例變量: picture:動(dòng)物JPEG圖像的名稱 food:此動(dòng)物所吃的食物(meat/grass) hunger:代表饑餓程度的int值。會(huì)根據(jù)動(dòng)物吃了多少食物而改變。 boundaries:代表動(dòng)物活動(dòng)范圍區(qū)域的長寬。 location:動(dòng)物在活動(dòng)區(qū)域中的位置。4個(gè)實(shí)例方法:
makeNoise():動(dòng)物發(fā)出聲音的行為和程序。 eat():動(dòng)物遇到食物時(shí)的行為程序。 sleep():睡眠的行為程序。 roam():不在進(jìn)食或睡眠時(shí)的行為程序。①找出對(duì)象的共同屬性和行為5個(gè)實(shí)例變量:②設(shè)計(jì)代表共同狀態(tài)與行為的類Animal-Stringpictual-Stringfood-inthunger-Positionboudaries-PositionlocationvoidmakeNoise()voideat()voidsleep()voidroam()LionCatTiggerHippoDogWolf②設(shè)計(jì)代表共同狀態(tài)與行為的類Animal-String③決定子類是否需要讓某項(xiàng)行為有特定的不同的運(yùn)行方式Animal成員變量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggerHippoDogWolf③決定子類是否需要讓某項(xiàng)行為有特定的不同的運(yùn)行方式Anima③決定子類是否需要讓某項(xiàng)行為有特定的不同的運(yùn)行方式Animal成員變量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()③決定子類是否需要讓某項(xiàng)行為有特定的不同的運(yùn)行方式Anima④尋找更多抽象化的時(shí)機(jī)Animal成員變量。。。。。。voidmakeNoise()voideat()voidsleep()voidroam()LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()④尋找更多抽象化的時(shí)機(jī)Animal成員變量voidm⑤完成類的繼承層次Animal。。。。。。。。。。。。LionvoidmakeNoise()voideat()CatvoidmakeNoise()voideat()TiggervoidmakeNoise()voideat()DogvoidmakeNoise()voideat()HippovoidmakeNoise()voideat()WolfvoidmakeNoise()voideat()Feline……roam()Canine……roam()⑤完成類的繼承層次Animal。。。。。。。。。。。。Lio⑤完成類的繼承層次④尋找更多抽象化的時(shí)機(jī)③決定子類是否需要讓某項(xiàng)行為有特定的不同的運(yùn)行方式②設(shè)計(jì)代表共同狀態(tài)與行為的類如何進(jìn)展繼承層次的設(shè)計(jì)--自下而上的設(shè)計(jì)
①找出對(duì)象的共同屬性和行為⑤完成類的繼承層次④尋找更多抽象化的時(shí)機(jī)③決定子類是否需要讓子類對(duì)象調(diào)用成員的原那么AnimalmakeNoise()eat()sleep()roam()WolfvoidmakeNoise()voideat()Canine……roam()創(chuàng)建大野狼對(duì)象Wolfw=newWolf();調(diào)用大野狼的方法w.makeNoise();調(diào)用犬科的方法w.roam();調(diào)用動(dòng)物的方法w.sleep()最低階原那么子類對(duì)象調(diào)用成員的原那么AnimalmakeNoise()W③添加子類的新成員②改造父類的成員①繼承父類的成員父類如何進(jìn)展子類設(shè)計(jì)--自上而下的設(shè)計(jì)
③添加子類的新成員②改造父類的成員①繼承父類的成員父類訪問控制權(quán)限了解
訪問控制權(quán)限了解③添加子類的新成員②改造父類的成員①繼承父類的成員父類如何進(jìn)展子類設(shè)計(jì)--自上而下的設(shè)計(jì)
③添加子類的新成員②改造父類的成員①繼承父類的成員父類子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程二、super的作用子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程子類的創(chuàng)立一、子類對(duì)象的實(shí)例化過程classPerson{ publicPerson()父類構(gòu)造〞);}}classStudent{ publicStudent()子類構(gòu)造〞);}}子類的創(chuàng)立一、子類對(duì)象的實(shí)例化過程子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程publicclassTestDemo11{ publicstaticvoidmain(Stringargs[]){
Studentstu=newStudent(); }}運(yùn)行結(jié)果:
?子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程運(yùn)行結(jié)果:?子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程1、先自動(dòng)調(diào)用父類構(gòu)造函數(shù)〔父類中的無參構(gòu)造函數(shù)〕2、然后調(diào)用子類構(gòu)造函數(shù)注意:如果父類中有多個(gè)構(gòu)造方法時(shí),如何才能調(diào)用父類中某個(gè)特定的構(gòu)造方法呢?其做法是在子類的構(gòu)造方法中通過super〔…〕來調(diào)用父類特定的構(gòu)造方法。子類對(duì)象的創(chuàng)立一、子類對(duì)象的實(shí)例化過程創(chuàng)立子類二、super()、super(……)classPerson{ privateStringname; privateintage; publicPerson() {調(diào)用Person類的無參構(gòu)造方法〞);} publicPeron(Stringname,intage)調(diào)用了Person類的有參構(gòu)造方法〞); =name; this.age=age;} publicvoidshow() {姓名:〞+name+〞年齡:〞+age);} }創(chuàng)立子類二、super()、super(……)子類對(duì)象的創(chuàng)立classStudentextendsPerson{ privateStringdepartment; publicStudent()無參構(gòu)造〞);} publicStudent(Stringname,intage,Stringdep) {super(name,age); department=dep;我是〞+department+〞的學(xué)生〞);有參構(gòu)造〞);}}子類對(duì)象的創(chuàng)立classStudentextendsP子類對(duì)象的創(chuàng)立publicclassTestDemo1{ publicstaticvoidmain(Stringargs[]){ Studentstu1=newStudent(); Studentstu2=newStudent(“李四〞,23,〞計(jì)算機(jī)系〞); stu1.show(); stu2.show(); }}子類對(duì)象的創(chuàng)立publicclassTestDemo1{子類對(duì)象的創(chuàng)立省略紅色字體super(name,age),父類中的構(gòu)造方法哪個(gè)會(huì)被調(diào)用?子類構(gòu)造方法中調(diào)用父類構(gòu)造方法的super語句位置有沒有限制?如果父類中只定義了有參的構(gòu)造方法,而子類的構(gòu)造方法中并沒有顯式的用super〔〕來調(diào)用父類中特定的構(gòu)造方法,程序此時(shí)會(huì)有問題嗎?找出this和super的一樣點(diǎn)和不同點(diǎn)。思考?。?找出繼承中構(gòu)造方法的調(diào)用規(guī)那么子類對(duì)象的創(chuàng)立省略紅色字體super(name,age),父成員變量的隱藏和方法的覆寫〔1〕當(dāng)在子類中定義的成員變量和父類中的成員變量同名時(shí),此時(shí)稱子類的成員變量隱藏了父類的成員變量。改造父類的成員〔2〕當(dāng)子類中定義了一個(gè)方法,并且這個(gè)方法的名字,返回類型,參數(shù)個(gè)數(shù)以及類型和父類的某個(gè)方法完全一樣時(shí),父類的這個(gè)方法將被隱藏,這時(shí)我們說重寫了父類的方法。子類通過成員變量的隱藏和方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。成員變量的隱藏和方法的覆寫〔1〕當(dāng)在子類中定義的成員變量和父成員變量的隱藏和方法的覆寫例如下面的這段程序就是這樣的情況:classSuperClass{//父類
inty;
voidsetY(){y=0;}}classSubClassextendsSuperClass{inty;//父類變量y被隱藏
voidsetY(){//重寫父類的方法setY()y=1;}}publicTestDemo3{publicstaticvoidmain(Stringargs[]){
SubClassss=newSubClass();
ss.setY();}}成員變量的隱藏和方法的覆寫例如下面的這段程序就是這樣的情況:
子類在隱藏了父類的成員變量或重寫了父類的方法后,常常還要用到父類的成員變量,或在重寫的方法中使用父類中被重寫的方法以簡化代碼的編寫,這時(shí)就要訪問父類的成員變量或調(diào)用父類的方法,Java中通過super來實(shí)現(xiàn)對(duì)父類成員的訪問。this用來引用當(dāng)前對(duì)象,與this類似,super用來引用當(dāng)前對(duì)象的父類。super的使用可以分為下面三種情況:
1)用來訪問父類被隱藏的成員變量,如:
super.y2)用來調(diào)用父類中被重寫的方法,如:
super.setY()
3)用來調(diào)用父類的構(gòu)造方法,如:
super([paramlist]);成員變量的隱藏和方法的覆寫思考:方法的重載與覆寫非常類似,找出它們的區(qū)別?。?!子類在隱藏了父類的成員變量或重寫了父類課后討論討論二類的繼承性與多態(tài)性〔1〕主題一:方案設(shè)計(jì)分析主題三:知識(shí)原理掌握—構(gòu)造方法的重載思考:〔1〕找出父類向子類派生時(shí),構(gòu)造方法的調(diào)用規(guī)律〔2〕找出方法的重載與重寫的區(qū)別課后討論討論二類的繼承性與多態(tài)性〔1〕主題一:方案設(shè)計(jì)分析寫出你所能想到的所有二維、三維形狀,并用它們組成一個(gè)形狀層次構(gòu)造。層次構(gòu)造把Shape當(dāng)作超類,并從中派生出TwoDimensionalShape類和ThreeDimensionalShape類。設(shè)計(jì)這個(gè)層次構(gòu)造,并定義它的所有類。畫出相應(yīng)的類層次構(gòu)造圖。接下來考慮如果將Shape類變成abstract超類,TwoDimensionalShape類和hreeDimensionalShape類也是abstract類。進(jìn)展相應(yīng)的派生后,要求在第三層的類中計(jì)算出每個(gè)類對(duì)應(yīng)對(duì)象的面積和體積。主題一:方案設(shè)計(jì)分析寫出你所能想到的所有二維、三維形狀,并用主題三:知識(shí)原理掌握—構(gòu)造方法的重載建立一個(gè)人類〔Person〕和學(xué)生類〔Student〕,功能要求如下:〔1〕Person中包含4個(gè)保護(hù)型的數(shù)據(jù)成員name、addr、sex、age,表示姓名、地址、性別和年齡。用一個(gè)4參構(gòu)造方法、一個(gè)兩參構(gòu)造方法、一個(gè)無參構(gòu)造方法來實(shí)例化對(duì)象,用一個(gè)輸出方法顯示4種屬性?!?〕Student類繼承Person類,并增加輸出成員math、english存放數(shù)學(xué)、英語成績。用一個(gè)6參構(gòu)造方法、一個(gè)兩參構(gòu)造方法、一個(gè)無參構(gòu)造方法來實(shí)例化對(duì)象,另外重寫輸出方法用于顯示6種屬性。主題三:知識(shí)原理掌握—構(gòu)造方法的重載建立一個(gè)人類〔Perso第3章面向?qū)ο蟾呒?jí)程序設(shè)計(jì)3.1繼承3.2多態(tài)性3.3抽象類和抽象方法3.4接口3.5內(nèi)部類和匿名類第3章面向?qū)ο蟾呒?jí)程序設(shè)計(jì)3.1繼承3.2多態(tài)性多態(tài)(Polymorphism)的意思就是用一樣的名字來定義不同的方法。在Java中,普通類型的多態(tài)為重載,這就意味著可以使幾個(gè)不同的方法使用一樣的名字,這些方法以參數(shù)的個(gè)數(shù)不同、參數(shù)的類型不同等方面來進(jìn)展區(qū)分,以使得編譯器能夠進(jìn)展識(shí)別。也可以這樣講,重載是同一個(gè)方法具有不同的版本,每個(gè)版本之間在參數(shù)特征方面有差異。重載是Java實(shí)現(xiàn)多態(tài)性的方式之一。例如:family()方法可以有三個(gè)版本,如下:family(){}family(Stringch){address=ch;}family(Stringch,floatn){address=ch;pay=n;}這些方法并存于程序中,編譯時(shí),編譯器根據(jù)實(shí)參的類型和個(gè)數(shù)來區(qū)分從而調(diào)用那個(gè)方法。如果這些方法作為函數(shù)或過程同時(shí)出現(xiàn)在其它語言的程序中,如C,那將導(dǎo)致災(zāi)難性的錯(cuò)誤。3.2多態(tài)性多態(tài)(Polymorphism3.2多態(tài)性【例3-6】構(gòu)造方法重載的例子classperson{Stringname="Johnson";//姓名
intage=45;//年齡
person(){}
person(Stringa){name=a;}
person(Stringa,intb){name=a;age=b;}name+","+"Age="+age);}}publicclassPoly{publicstaticvoidmain(String[]args){personko1=newperson();personko2=newperson("Mike");personko3=newperson("Willian",50);ko1.display();ko2.display();ko3.display();}}3.2多態(tài)性【例3-6】構(gòu)造方法重載的例子3.2多態(tài)性在Java語言中,多態(tài)性主要表達(dá)在兩個(gè)方面:由方法重載實(shí)現(xiàn)的靜態(tài)多態(tài)性〔編譯時(shí)多態(tài)〕和方法重寫實(shí)現(xiàn)的動(dòng)態(tài)多態(tài)性〔運(yùn)行時(shí)多態(tài)〕,如下:
1〕編譯時(shí)多態(tài)
在編譯階段,具體調(diào)用哪個(gè)被重載的方法,編譯器會(huì)根據(jù)參數(shù)的不同來靜態(tài)確定調(diào)用相應(yīng)的方法。
2〕運(yùn)行時(shí)多態(tài)
由于子類繼承了父類所有的屬性〔私有的除外〕,所以子類對(duì)象可以作為父類對(duì)象使用。程序中但凡使用父類對(duì)象的地方,都可以用子類對(duì)象來代替。一個(gè)對(duì)象可以通過引用子類的實(shí)例來調(diào)用子類的方法。如果子類重寫了父類的方法,那么重寫方法的調(diào)用原那么如下:Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年園藝師土壤污染治理考題試題及答案
- 花藝師考試中使用新興材料的創(chuàng)新嘗試試題及答案
- 2024年園藝師考試學(xué)習(xí)內(nèi)容計(jì)劃試題及答案
- 農(nóng)業(yè)投資回報(bào)的試題及答案
- 園藝師植物應(yīng)用生理學(xué)考核試題及答案
- 現(xiàn)代農(nóng)業(yè)體系的構(gòu)建與實(shí)施試題及答案
- 農(nóng)藝師職業(yè)發(fā)展中的逆境應(yīng)對(duì)試題及答案
- 2024年福建事業(yè)單位考試提升學(xué)習(xí)效率與試題及答案
- 園藝師理論考試要點(diǎn)試題及答案
- 2024年農(nóng)藝師考試常見問題解析試題及答案
- 帶狀皰疹課件
- 高三數(shù)學(xué)二輪復(fù)習(xí)-解三角形課件
- 2024年人力資源社會(huì)保障部所屬事業(yè)單位招聘考試真題
- 2024年山師附小招生簡章
- 食堂7s管理標(biāo)準(zhǔn)
- 2024年河北衡水冀州區(qū)招聘社區(qū)工作者考試真題
- 2025年山西電力職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試題庫含答案
- 2024-2025學(xué)年人教版七下地理第一單元測(cè)驗(yàn)卷
- 稻田畫種植合同5篇
- 共價(jià)鍵+周測(cè)卷 高二下學(xué)期化學(xué)選擇性必修2
- 麻疹知識(shí)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論