Java語言實驗5 多態性與接口_第1頁
Java語言實驗5 多態性與接口_第2頁
Java語言實驗5 多態性與接口_第3頁
Java語言實驗5 多態性與接口_第4頁
Java語言實驗5 多態性與接口_第5頁
已閱讀5頁,還剩11頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

一、實驗目的.深入理解類的繼承的基本概念及實現。.了解Object及對Object類的主要方法equals進行重寫。.掌握super關鍵字的作用。.掌握抽象類與接口的基本概念及實際應用.掌握對象多態性的作用。.掌握接口的基本概念及實際應用。.掌握接口回調的概念及運行機制。二、實驗內容及步驟1、重寫Object類的equals方法□□□:□□□□□Object類的equals方法進行Person對象的比較操作。⑴源代碼如下:classPerson{privateStringname;privateintage;publicPerson(Stringname,intage){=name;this.age=age;}//getter與setter方法略。publicStringtoString(){return"姓名:"++";年齡:"+this.age;}}publicclassPersonDemo{publicstaticvoidmain(Stringargs[]){Personpersonl=newPerson(“李興華”,30);Personperson2=newPerson(“李興華”,30);System.out.println(person1.equals(person2)?"是同一個人。":"□□□□□□□");}}⑵編譯并運行應用程序。運行結果:(3)實驗報告將運行結果寫在實驗報告中。思考:應用程序中personl對象調用的equals方法是從哪個類繼承的,請查看源代碼,說明此equals方法的作用,即比較的內容。答:personl對象調用的equals方法是從Object類繼承的。此equals方法的目的是通過boolean判斷兩對象內存地址是否相同。任務二:修改上述源代碼Person類,使PersonDemo應用程序執行結果為“同一個人”。提示:equals方法的原型是:publicbooleanequals(Objectobj){}源代碼:publicbooleanequals(Objectobj){if(obj==null||!(objinstanceofPerson)){returnfalse;}if(((Person)obj).name==&&((Person)obj).age==this.age){returntrue;}returnfalse;}運行結果:2、對象的上轉型對象任務一:對象的上轉型對象接收任意子類類型的對象(1)使用Object接收一切的引用類型對象。源代碼:classA{publicStringgetInfo(){return“HelloWorld!!!”;}}publicclassADemo{publicstaticvoidmain(Stringargs[]){Objectobj=newA();System.out.println(obj.getInfo());System.out.println(obj.toString());Aa=(A)obj;System.out.println(a.getInfo());System.out.println(a.toString());}}⑵編譯并運行程序。運行結果:⑶實驗報告將運行結果寫在實驗報告中。如果程序編譯為通過,或運行時有錯誤提示,請說明原因,并將錯誤改正。答:錯誤:ThemethodgetInfo()isundefinedforthetypeObjectgetInfoaddcasttoObjSystem.outprintln(((A)obj).getInfo());

addcasttoObj任務二:上轉型實現多態性(1)實例學習令不使用上轉型對象實現多態性源代碼如下:源代碼:packagerenwu3;classA{publicvoidfun1(){System.out.println("A-->publicvoidfun1(){}");publicvoidfun2(){this.fun1();二e…classBextendsA{publicvoidfun1(){System.out.println("B-->publicvoidfun1(){}");}publicvoidfun3(){System.out.println("B-->publicvoidfun3(){}");}};packagerenwu3;classCextendsA{publicvoidfun1(){System.out.println("C-->publicvoidfun1(){}");}publicvoidfun5(){System.out.println("C-->publicvoidfun3(){}");}};packagerenwu3;publicclassPolDemo4{

publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubfun(newB());//傳遞B類實例fun(newC());//傳遞C類實例publicstaticvoidfun(Bb){b.fun1();//統一調用覆寫父類的fun1()方法publicstaticvoidfun(Cc){}}w);運行結果:以上程序雖然實現了基本的要求,但是可以發現:如果按照以上的方式完成程序,則當產生一個A類的子類時,fun()方法就要重載一次,這樣如果功能擴充,則必須要修改類本身,那么如果使用對象多態性完成呢?令使用上轉型對象實現多態性:源代碼:packagerenwu1;classA{publicvoidfun1(){System.out.println("a-->publicvoidfun1(){}");}publicvoidfun2(){this.fun1();}};packagerenwu1;classBextendsA{publicvoidfun1(){System.out.println("B-->publicvoidfun1(){}");publicvoidfun3(){System.out.println("B-->publicvoidfun3(){}");一classCextendsA{publicvoidfun1(){System.out.println("C-->publicvoidfun1(){}");publicvoidfun5(){System.out.println("C-->publicvoidfun3(){}");…e3publicclassPolDemo05{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubfun(newB());//傳遞B類實例,產生向上轉型fun(newC());//傳遞C類實例,產生向上轉型}publicstaticvoidfun(Aa){〃接收父類對象a.fun1();}}運行結果:(2)閱讀上述兩個源代碼,深刻理解使用上轉型對象實現多態性機制。答:上轉型:是子類對象由父類引用。想要上轉型的前提必須是由繼承關系的兩個類,在調用方法的時候,上轉型對象只能調用父類中有的方法,如果調用子類方法則會報錯。3、抽象類與上轉型對象練習任務一:通過對上述實驗內容的實踐與學習,根據要求填寫代碼。⑴要求:有一家公司,有不同類型的員工,包括按年領取薪水,按月領取薪水,按周領取薪水,計算該公司一年需支付的薪水總額令有一個abstract類,類名為Employee;令該類有一個abstract方法:publicabstractdoubleearnings();;令Employee的子類有YearWorker、MontthWorker和WeekWorker。YearWorker對象按年領取薪水,MonthWorker按月領取薪水,WeekWorker按周領取薪水。令子類必須實現父類的earningsO方法,返回各自領取薪水數。令有一個Company類,該類用employee數組作為成員,employee數組的單元可以是YearWorker對象的上轉型對象、MonthWorker對象的上轉型對象或WeekWorker對象的上轉型對象。令程序能輸出Company對象一年需要支付的薪水總額。(2)代碼模板源代碼:packagerenwu2;publicclassCompany{Employee]]employee;doublesalaries=0;Company(Employee[]employee){this.employee=employee;}publicdoublesalariesPay(){salaries=0;for(inti=0;i<employee.length;i++){salaries=salaries+employee[i].earnings();}returnsalaries;}}packagerenwu2;abstractclassEmployee{publicabstractdoubleearnings();packagerenwu2;publicclassWeekWorkerextendsEmployee{publicdoubleearnings(){return52*1000;一publicclassMonthworkerextendsEmployee{publicdoubleearnings(){return12*5000;}}packagerenwu2;publicclassYearWorkerextendsEmployee{publicdoubleearnings(){return120000;}}packagerenwu2;publicclassHardWork{publicstaticvoidmain(String[]args){Employee口employee=newEmployee[20];//公司有20名職員for(inti=0;i<employee.length;i++){if(i%3==0)employee[i]=newWeekWorker();elseif(i%3==1)employee[i]=newMonthWorker();elseif(i%3==2)employee[i]=newYearWorker();}Companycompany=newCompany(employee);System.out.println("公司年工資總額:"+company.salariesPay()+"元");}}運行結果:(3)實驗報告將代碼1-4寫在實驗報告中。在Employee類的子類中合適位置使用super,再運行程序。根據查看的結果,驗證在子類中是否可以調用抽象類父類的構造方法,即抽象類是否有構造方法?答:子類可以調用抽象類父類的構造方法。4、接口案例學習任務一:學習下面實例,定義一個抽象的汽車類car,再將汽油車設計為接口。該程序代碼如下:importjava.awt.Color;//汽車抽象類publicabstractclassCar{〃公用數據字段聲明區publicColorcolor;〃車輛顏色publicintgearNum;〃排檔數publicStringtiretype;〃輪胎型號publicfloatengine;〃引擎排氣量〃公用抽象方法聲明區publicabstractvoidshiftgear();〃換檔publicabstractvoidbrake();〃煞車publicabstractvoidaircon();〃開冷氣publicabstractvoidheadlight();〃開大燈}publicinterfaceGasoline〃汽油車接口{publicstaticfinalStringFUEL="gasoline(汽油)";〃定義一個最終字段publicvoidrefuel();//聲明一個方法}源代碼:packagerenwu3;publicclassGearextendsCar{staticintgearNum=5;//聲明gearNum為類欄publicGcar(){tiretype="BridgeStone185ST”;//輪胎型號engine=1598.5f;//排氣量}publicstaticvoidmain(Stringargs[]){Geargcar=newGcar();//產生實例gcar.equipment();gear.shiftgear();gear.brake();}publicvoidequipment。{//轎車的配置System.out.println("轎車顏色:"+eolor);System.out.println("轎車排擋數:"+gearNum);System.out.println("轎車輪胎型號:"+tiretype);System.out.println("轎車排氣量:"+engine);}publicvoidshiftgear(){System.out.println("轎車換擋方式:自排"+gearNum+"文件");}//換擋publicvoidbrake(){System.out.println("水壓式剎車系統");}//剎車publicvoidaireon(){};//開冷氣publicvoidheadlight(){};//開大燈}任務二:(1)根據以上代碼,定義你自己的車,該車繼承自汽車類car并實現汽油車接口。自己的車屬性為:檔位為5個檔,輪胎型號是BridgeStone185ST,排氣量為1598.5。自己的車的新增的方法有:equipment。:輸出轎車顏色、轎車排檔數、轎車輪胎型號、轎車排氣量和轎車燃料。

源代碼:packagerenwu3;importjava.awt.Color;〃汽車抽象類publicclassMyCarextendsGcar{privateColorcolor;publicMyCar(){color=Color.blue;//設置汽車顏色}publicstaticvoidmain(Stringargs[]){MyCarmycar=newMyCar();mycar.equipment();mycar.shiftgear();mycar.brake();}publicvoidequipment。{System.out.println("我的車排擋數:"+this.gearNum);System.out.println("我的車顏色:"+this.color);System.out.println("我的車輪胎型號:"+this.tiretype);System.out.println("我的車引擎排氣量:"+this.engine);}publicvoidshiftgear(){//換擋-覆蓋的新方式System.out.println("我的車換擋方式:自排"+計15.gearNum+"檔");}?Overridepublicvoidbrake(){//TODOAuto-generatedmethodstub}?Overridepublicvoidaircon(){//TODOAuto-generatedmethodstub}?Overridepublicvoidheadlight(){//TODOAuto-generatedmethodstub}}(2)實驗報告將任務二的代碼寫在實驗報告中。編寫應用程序測試實現類。運行結果:

⑵注意:在實現接口時,要實現所有接口中定義的所有方法,方法的實現可以具有具體的實現內容,也可以是抽象的方法,即只有方法名或參數,沒有變量、沒有具體操作語句,只有一對大括號{}的空方法。5、接口的回調任務一:有一家商店銷售電視、計算機和手機,計算該商店的年銷售總額(1)要求:令有一個ComputeTotalSales接口,該接口中有一個方法:publicdoubletotalSalesByYear();令有三個實現該接口的類:Television,Computer和Mobile。這三個類通過實現接口computeTotalSales給出自己的年銷售額。令有一個Shop類,該類用computeTotalSales數組作為成員,computeTotalSales數組的單元可以存放Television對象的引用或Mobile對象的引用。令編寫應用程序輸出Shop對象的年銷售額。⑵代碼模板源代碼:interfaceComputeTotalSales{publicdoubletotalSalesByYear();}classTelevisionimplementsComputeTotalSales{publicdoubletotalSalesByYear(){//實現totalSalesByYear()方法return60000;}classComputeimplementsComputeTotalSales

publicdoubletotalSalesByYear(){publicdoubletotalSalesByYear(){//實現totalSalesByYear()方法return10000;}classMobileimplementsComputeTotalSales{publicdoubletotalSalesByYear(){//實現totalSalesByYear()方法return50000;}classShop{ComputeTotalSales[]goods;doubletotalSales=0;Shop(ComputeTotalSales[]goods){this.goods=goods;}publicdoublegiveTotalSales(){totalSales=0;for(inti=0;ivgoods.length;i++){//計算totalSalestotalSales=totalSales+goods[i].totalSalesByYear();}returntotalSales;}}publicclassHappySale{publicstaticvoidmain(Stringargs[]){ComputeTotalSales口goods=newComputeTotalSales[3];for(inti=0;i<goods.length;i++){if(i%3==0)goods[i]=newTelevision();elseif(i%3==1)goods[i]=newComputer();elseif(i%3==2)goods[i]=newMobile();}Shopshop=newShop(goods);System.out.println("商店年銷售額:"+shop.giveTotalSales());}}運行結果:*任務二:利用接口回調和反射獨立編程。(1)內容及要求>假定現有兩種工具:Car和Plane,其中Car的平均速度運算公式為:a*b/c;Plane的平均速度運算公式為:a+b+的三個參數的具體值在程序運行時用戶錄入。>編寫ComputeTime類,通過該類計算用戶指定的交通工具運行1000公里所需的時間。參數的具體值在程序運行時用戶錄入。>其運行過程如下,從命令行輸入ComputeTime的四個參數,第一個是交通工具的類型,第二、三、四個參數分別時整數A、B、C,舉例如下:計算Plane的時間:"javaComputeTimePlane203040"。計算Car的時間:"javaComputeTimeCar233445"。>編程要求:在未來如果增加第3種交通工具的時候,只需要編寫新的交通工具的程序。如第3種交通工具為Ship,則只需要編寫Ship.java,運行時輸入:"javaComputeTimeShip223344”。充分利用接口及接口回調的技術。?提示:實例化一個對象的另外一種辦法:Class.forName(str).newInstance();例如需要實例化一個Plane對象:Planeplane=(Plane)Class.forName("Plane").newInstance()(2)實驗報告源代碼:packagerenwu5;importrenwu5.all.Common;importjava.lang.*;publicclassComputeTime{publicstaticvoidmain(Stringargs[]){System.out.println("交通工具:"+args[0]);System.out.println("參數a:"+args[1]);System.out.println("參數b:"+args[2]);System.out.println("參數c:"+args[3]);doublea=Double.parseDo

溫馨提示

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

評論

0/150

提交評論