第繼承和多態(tài)_第1頁(yè)
第繼承和多態(tài)_第2頁(yè)
第繼承和多態(tài)_第3頁(yè)
第繼承和多態(tài)_第4頁(yè)
第繼承和多態(tài)_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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方法開(kāi)始第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ò)展父類的方法和屬性,所以可以在子類中:添加新的屬性添加新的方法重寫(xiě)父類的方法第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.

通常情況下要重寫(xiě)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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論