




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
會(huì)計(jì)學(xué)1第繼承和多態(tài)8.2父類和子類UML圖CircleCircleMethodsCircleData父類繼承CylinderCircleMethodsCylinderMethodsCircleDataCylinderData子類第1頁(yè)/共41頁(yè)//Cylinder.java:Cylinder類的定義描述publicclassCylinderextendsCircle{privatedoublelength=1;
/**Returnlength*/publicdoublegetLength(){returnlength;}
/**Setlength*/publicvoidsetLength(doublelength){this.length=length;}
/**計(jì)算體積*/publicdoublefindVolume(){returnfindArea()*length;}}supertypesubtypeCylinder是由Circle派生而來(lái)第2頁(yè)/共41頁(yè)Cylindercylinder=newCylinder();System.out.println("Thelengthis"+cylinder.getLength());System.out.println("Theradiusis"+cylinder.getRadius());System.out.println("Thevolumeofthecylinderis"+cylinder.findVolume());System.out.println("Theareaofthecircleis"+cylinder.findArea());
Thelengthis1.0Theradiusis1.0Thevolumeofthecylinderis3.14159Theareaofthecircleis3.14159
輸出結(jié)果是:
第3頁(yè)/共41頁(yè)8.3使用關(guān)鍵字
super調(diào)用父類的構(gòu)造方法調(diào)用父類的方法關(guān)鍵字super指向使用它的類的父類,可以用于2種途徑:注意:調(diào)用父類的構(gòu)造方法必須使用super,并且這個(gè)調(diào)用必須放在構(gòu)造方法的第一行。在子類中使用父類的構(gòu)造方法的名字會(huì)引起語(yǔ)法錯(cuò)誤。第4頁(yè)/共41頁(yè)注意構(gòu)造方法用來(lái)構(gòu)造類的實(shí)例。與屬性和方法不同,父類的構(gòu)造方法不直接傳給子類,它們只能從子類的構(gòu)造方法中用關(guān)鍵字super調(diào)用。第5頁(yè)/共41頁(yè)8.3.2構(gòu)造方法鏈構(gòu)造方法可以調(diào)用重載的構(gòu)造方法或父類的構(gòu)造方法。如果他們沒(méi)有被顯示的調(diào)用,編譯器將把super()當(dāng)作構(gòu)造方法的第一條語(yǔ)句。
publicCylinder(){
}
等價(jià)于
publicCylinder(){
super();
}
publicA(doubled){
//somestatements
}
等價(jià)于
publicA(doubled){
super();
//somestatements
}
第6頁(yè)/共41頁(yè)8.3.2構(gòu)造方法鏈publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}
classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}publicEmployee(Strings){System.out.println(s);}}
classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}在任何情況下,構(gòu)造一個(gè)類的實(shí)例,將會(huì)沿著繼承鏈調(diào)用所有父類的構(gòu)造方法,這叫構(gòu)造方法鏈。第7頁(yè)/共41頁(yè)追蹤執(zhí)行過(guò)程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}
publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}
classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}
publicEmployee(Strings){System.out.println(s);}}
classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}1.從main方法開始第8頁(yè)/共41頁(yè)追蹤執(zhí)行過(guò)程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}
publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}
classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}
publicEmployee(Strings){System.out.println(s);}}
classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}2.調(diào)用Faculty構(gòu)造方法第9頁(yè)/共41頁(yè)追蹤執(zhí)行過(guò)程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}
publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}
classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}
publicEmployee(Strings){System.out.println(s);}}
classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}3.調(diào)用Employee的無(wú)參構(gòu)造方法第10頁(yè)/共41頁(yè)追蹤執(zhí)行過(guò)程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}
publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}
classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}
publicEmployee(Strings){System.out.println(s);}}
classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}4.調(diào)用Employee(String)構(gòu)造方法第11頁(yè)/共41頁(yè)追蹤執(zhí)行過(guò)程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}
publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}
classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}
publicEmployee(Strings){System.out.println(s);}}
classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}5.調(diào)用Person()構(gòu)造方法第12頁(yè)/共41頁(yè)追蹤執(zhí)行過(guò)程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}
publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}
classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}
publicEmployee(Strings){System.out.println(s);}}
classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}6.執(zhí)行println第13頁(yè)/共41頁(yè)追蹤執(zhí)行過(guò)程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}
publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}
classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}
publicEmployee(Strings){System.out.println(s);}}
classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}7.執(zhí)行println第14頁(yè)/共41頁(yè)追蹤執(zhí)行過(guò)程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}
publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}
classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}
publicEmployee(Strings){System.out.println(s);}}
classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}8.執(zhí)行println第15頁(yè)/共41頁(yè)追蹤執(zhí)行過(guò)程publicclassFacultyextendsEmployee{publicstaticvoidmain(String[]args){newFaculty();}
publicFaculty(){System.out.println("(4)Faculty'sno-argconstructorisinvoked");}}
classEmployeeextendsPerson{publicEmployee(){this("(2)InvokeEmployee’soverloadedconstructor");System.out.println("(3)Employee'sno-argconstructorisinvoked");}
publicEmployee(Strings){System.out.println(s);}}
classPerson{publicPerson(){System.out.println("(1)Person'sno-argconstructorisinvoked");}}9.執(zhí)行println第16頁(yè)/共41頁(yè)沒(méi)有無(wú)參構(gòu)造方法的示例publicclassAppleextendsFruit{}
classFruit{publicFruit(Stringname){System.out.println("Fruit'sconstructorisinvoked");}}找出錯(cuò)誤:
第17頁(yè)/共41頁(yè)聲明一個(gè)子類子類可以擴(kuò)展父類的方法和屬性,所以可以在子類中:添加新的屬性添加新的方法重寫父類的方法第18頁(yè)/共41頁(yè)8.4方法覆蓋子類從父類中繼承方法。有時(shí),子類必須修改父類中定義的方法,這叫方法覆蓋。//Cylinder.java:cylinder類中覆蓋findArea()publicclassCylinderextendsCircle{
/**Returnthesurfaceareaofthiscylinder.Theformulais*2*circlearea+cylinderbodyarea*/publicdoublefindArea(){return2*super.findArea()+2*getRadius()*Math.PI*length;}//Othermethodsareomitted}第19頁(yè)/共41頁(yè)注子類定義的方法必須與父類方法具有相同的頭標(biāo)志和相同的返回類型。實(shí)例方法僅當(dāng)可訪問(wèn)時(shí)才能被覆蓋。私有方法不能在定義它的類外訪問(wèn),所以不能被覆蓋。如果子類中定義的方法在父類中是私有的,那個(gè)這2個(gè)方法完全沒(méi)有關(guān)系。靜態(tài)方法也可以繼承,但不能被覆蓋。如果靜態(tài)方法被重新定義,則父類的方法將被隱藏。第20頁(yè)/共41頁(yè)對(duì)象類ObjectJava中的每一個(gè)類都源于java.lang.Objectclass.如果沒(méi)有指定一個(gè)類繼承誰(shuí),它的父類就是Object.第21頁(yè)/共41頁(yè)equals()和hashCode()Methodsequals()
方法檢查2個(gè)對(duì)象是否.equals()和==比較hashCode()
返回該對(duì)象的哈希碼,返回對(duì)象在計(jì)算機(jī)內(nèi)部存儲(chǔ)的十六進(jìn)制內(nèi)存地址.第22頁(yè)/共41頁(yè)toString()方法toString()
方法返回一個(gè)代表該對(duì)象的字符串:類名+@+哈希碼.
CylindermyCylinder=newCylinder(5.0,2.0);System.out.println(myCylinder.toString());
顯示結(jié)果類似:Cylinder@15037e5.
通常情況下要重寫toString()方法。
第23頁(yè)/共41頁(yè)多態(tài)性、動(dòng)態(tài)綁定和一般程序設(shè)計(jì)publicclassTest{publicstaticvoidmain(String[]args){m(newGraduateStudent());m(newStudent());m(newPerson());m(newObject());}
publicstaticvoidm(Objectx){System.out.println(x.toString());}}
classGraduateStudentextendsStudent{}
classStudentextendsPerson{publicStringtoString(){return"Student";}}
classPersonextendsObject{publicStringtoString(){return"Person";}}方法m()采用Object型參數(shù),所以可以用任何對(duì)象。同名的不同方法可以在程序中共存,稱為多態(tài),以覆蓋和重載2種形式體現(xiàn)。GraduateStudent,Student,Person,andObject
每個(gè)類都有自己的toString()方法,采用哪一種實(shí)現(xiàn)有JVM在運(yùn)行時(shí)動(dòng)態(tài)決定,這種能力成為動(dòng)態(tài)綁定。第24頁(yè)/共41頁(yè)一般程序設(shè)計(jì)publicclassTest{publicstaticvoidmain(String[]args){m(newGraduateStudent());m(newStudent());m(newPerson());m(newObject());}
publicstaticvoidm(Objectx){System.out.println(x.toString());}}
classGraduateStudentextendsStudent{}
classStudentextendsPerson{publicStringtoString(){return"Student";}}
classPersonextendsObject{publicStringtoString(){return"Person";}}多態(tài)性一般允許方法使用范圍更廣的對(duì)象參數(shù),這稱為一般程序設(shè)計(jì)。如果一個(gè)方法的參數(shù)類型是父類,可以向該方法傳遞這個(gè)參數(shù)子類的任何對(duì)象。第25頁(yè)/共41頁(yè)8.7對(duì)象類型轉(zhuǎn)換語(yǔ)句m(newStudent());將對(duì)象newStudent()傳遞給了Object類型參數(shù).該語(yǔ)句等價(jià)于:Objecto=newStudent();//Implicitcastingm(o);隱式類型轉(zhuǎn)換第26頁(yè)/共41頁(yè)為什要轉(zhuǎn)換假設(shè):Studentb=o;
因?yàn)镾tudent對(duì)象的總是Object對(duì)象的實(shí)例,但是Object對(duì)象的實(shí)例不一定是Student對(duì)象的實(shí)例。使用顯示類型轉(zhuǎn)換:Studentb=(Student)o;//Explicitcasting錯(cuò)誤?第27頁(yè)/共41頁(yè)父類和子類之間的轉(zhuǎn)換將一個(gè)子類的實(shí)例轉(zhuǎn)換為一個(gè)父類的變量總是可行的,稱為向上轉(zhuǎn)換;將一個(gè)父類的實(shí)例轉(zhuǎn)換為一個(gè)子類的變量稱為向下轉(zhuǎn)換;向下轉(zhuǎn)換不一定總能成功。???CylindermyCylinder=(Cylinder)myCircle;Applex=(Apple)fruit;Orangex=(Orange)fruit;第28頁(yè)/共41頁(yè)instanceof
運(yùn)算符為確保轉(zhuǎn)換的對(duì)象是子類的一個(gè)實(shí)例,使用instanceof運(yùn)算符:CirclemyCircle=newCircle();if(myCircleinstanceofCylinder){CylindermyCylinder=(Cylinder)myCircle;...}第29頁(yè)/共41頁(yè)Example8.1
演示多態(tài)和對(duì)象轉(zhuǎn)換創(chuàng)建2個(gè)對(duì)象,一個(gè)圓和一個(gè)圓柱,并調(diào)用displayObject方法顯示它們。TestPolymorphismCastingRun第30頁(yè)/共41頁(yè)8.8隱藏?cái)?shù)據(jù)可以覆蓋一個(gè)實(shí)例方法,但是不能覆蓋一個(gè)數(shù)據(jù)域(實(shí)例或靜態(tài)的)或靜態(tài)方法。如果在子類中聲明的數(shù)據(jù)域或靜態(tài)方法與父類中的名字相同,父類中的將被隱藏,但是它依舊存在。在子類中可以使用super關(guān)鍵字調(diào)用隱藏的數(shù)據(jù)域或靜態(tài)方法。第31頁(yè)/共41頁(yè)protected
數(shù)據(jù)和方法protected
修飾符可以應(yīng)用于類中的數(shù)據(jù)和方法。公用類中保護(hù)的數(shù)據(jù)或方法可以被它的子類或同一包中的任何類訪問(wèn),即使子類在不同的包中也可以。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)在市場(chǎng)競(jìng)爭(zhēng)中的公平性與法律風(fēng)險(xiǎn)
- 山西省臨汾市2025屆高三下學(xué)期考前適應(yīng)性訓(xùn)練考試(三)英語(yǔ) 含答案
- 高中生物光合作用與呼吸作用綜合應(yīng)用卷:2025年真題演練
- 出版產(chǎn)業(yè)鏈中的數(shù)據(jù)共享與合作創(chuàng)新
- 牦牛產(chǎn)品市場(chǎng)化與品牌建設(shè)路徑
- 民俗體驗(yàn)中的非物質(zhì)文化遺產(chǎn)保護(hù)策略
- 應(yīng)急救護(hù)知識(shí)進(jìn)校園的面臨的問(wèn)題、機(jī)遇與挑戰(zhàn)
- 服裝業(yè)時(shí)尚趨勢(shì)解碼
- 春節(jié)財(cái)務(wù)規(guī)劃解析
- 廚藝革新之路
- 農(nóng)場(chǎng)轉(zhuǎn)讓合同協(xié)議書模板
- 2025-2030中國(guó)共享單車服務(wù)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025年貴州省糧食儲(chǔ)備集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 【MOOC】跨文化思想交流英語(yǔ)-南京理工大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 【MOOC】光學(xué)發(fā)展與人類文明-華南師范大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 國(guó)際私法(華東政法大學(xué))智慧樹知到期末考試答案章節(jié)答案2024年華東政法大學(xué)
- 脫產(chǎn)學(xué)習(xí)證明
- 結(jié)節(jié)病ppt課件
- 《南京市幸福河湖評(píng)價(jià)規(guī)范(試行)》
- 讀唐詩(shī)學(xué)日語(yǔ)漢字
- 阻塞性睡眠呼吸暫停綜合征PPT課件
評(píng)論
0/150
提交評(píng)論