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

下載本文檔

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

文檔簡介

會計(jì)學(xué)1第繼承和多態(tài)8.2父類和子類UML圖CircleCircleMethodsCircleData父類繼承CylinderCircleMethodsCylinderMethodsCircleDataCylinderData子類第1頁/共41頁//Cylinder.java:Cylinder類的定義描述publicclassCylinderextendsCircle{privatedoublelength=1;

/**Returnlength*/publicdoublegetLength(){returnlength;}

/**Setlength*/publicvoidsetLength(doublelength){this.length=length;}

/**計(jì)算體積*/publicdoublefindVolume(){returnfindArea()*length;}}supertypesubtypeCylinder是由Circle派生而來第2頁/共41頁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頁/共41頁8.3使用關(guān)鍵字

super調(diào)用父類的構(gòu)造方法調(diào)用父類的方法關(guān)鍵字super指向使用它的類的父類,可以用于2種途徑:注意:調(diào)用父類的構(gòu)造方法必須使用super,并且這個調(diào)用必須放在構(gòu)造方法的第一行。在子類中使用父類的構(gòu)造方法的名字會引起語法錯誤。第4頁/共41頁注意構(gòu)造方法用來構(gòu)造類的實(shí)例。與屬性和方法不同,父類的構(gòu)造方法不直接傳給子類,它們只能從子類的構(gòu)造方法中用關(guān)鍵字super調(diào)用。第5頁/共41頁8.3.2構(gòu)造方法鏈構(gòu)造方法可以調(diào)用重載的構(gòu)造方法或父類的構(gòu)造方法。如果他們沒有被顯示的調(diào)用,編譯器將把super()當(dāng)作構(gòu)造方法的第一條語句。

publicCylinder(){

}

等價于

publicCylinder(){

super();

}

publicA(doubled){

//somestatements

}

等價于

publicA(doubled){

super();

//somestatements

}

第6頁/共41頁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)造一個類的實(shí)例,將會沿著繼承鏈調(diào)用所有父類的構(gòu)造方法,這叫構(gòu)造方法鏈。第7頁/共41頁追蹤執(zhí)行過程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頁/共41頁追蹤執(zhí)行過程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頁/共41頁追蹤執(zhí)行過程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的無參構(gòu)造方法第10頁/共41頁追蹤執(zhí)行過程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頁/共41頁追蹤執(zhí)行過程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頁/共41頁追蹤執(zhí)行過程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頁/共41頁追蹤執(zhí)行過程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頁/共41頁追蹤執(zhí)行過程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頁/共41頁追蹤執(zhí)行過程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頁/共41頁沒有無參構(gòu)造方法的示例publicclassAppleextendsFruit{}

classFruit{publicFruit(Stringname){System.out.println("Fruit'sconstructorisinvoked");}}找出錯誤:

第17頁/共41頁聲明一個子類子類可以擴(kuò)展父類的方法和屬性,所以可以在子類中:添加新的屬性添加新的方法重寫父類的方法第18頁/共41頁8.4方法覆蓋子類從父類中繼承方法。有時,子類必須修改父類中定義的方法,這叫方法覆蓋。//Cylinder.java:cylinder類中覆蓋findArea()publicclassCylinderextendsCircle{

/**Returnthesurfaceareaofthiscylinder.Theformulais*2*circlearea+cylinderbodyarea*/publicdoublefindArea(){return2*super.findArea()+2*getRadius()*Math.PI*length;}//Othermethodsareomitted}第19頁/共41頁注子類定義的方法必須與父類方法具有相同的頭標(biāo)志和相同的返回類型。實(shí)例方法僅當(dāng)可訪問時才能被覆蓋。私有方法不能在定義它的類外訪問,所以不能被覆蓋。如果子類中定義的方法在父類中是私有的,那個這2個方法完全沒有關(guān)系。靜態(tài)方法也可以繼承,但不能被覆蓋。如果靜態(tài)方法被重新定義,則父類的方法將被隱藏。第20頁/共41頁對象類ObjectJava中的每一個類都源于java.lang.Objectclass.如果沒有指定一個類繼承誰,它的父類就是Object.第21頁/共41頁equals()和hashCode()Methodsequals()

方法檢查2個對象是否.equals()和==比較hashCode()

返回該對象的哈希碼,返回對象在計(jì)算機(jī)內(nèi)部存儲的十六進(jìn)制內(nèi)存地址.第22頁/共41頁toString()方法toString()

方法返回一個代表該對象的字符串:類名+@+哈希碼.

CylindermyCylinder=newCylinder(5.0,2.0);System.out.println(myCylinder.toString());

顯示結(jié)果類似:Cylinder@15037e5.

通常情況下要重寫toString()方法。

第23頁/共41頁多態(tài)性、動態(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ù),所以可以用任何對象。同名的不同方法可以在程序中共存,稱為多態(tài),以覆蓋和重載2種形式體現(xiàn)。GraduateStudent,Student,Person,andObject

每個類都有自己的toString()方法,采用哪一種實(shí)現(xiàn)有JVM在運(yùn)行時動態(tài)決定,這種能力成為動態(tài)綁定。第24頁/共41頁一般程序設(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)性一般允許方法使用范圍更廣的對象參數(shù),這稱為一般程序設(shè)計(jì)。如果一個方法的參數(shù)類型是父類,可以向該方法傳遞這個參數(shù)子類的任何對象。第25頁/共41頁8.7對象類型轉(zhuǎn)換語句m(newStudent());將對象newStudent()傳遞給了Object類型參數(shù).該語句等價于:Objecto=newStudent();//Implicitcastingm(o);隱式類型轉(zhuǎn)換第26頁/共41頁為什要轉(zhuǎn)換假設(shè):Studentb=o;

因?yàn)镾tudent對象的總是Object對象的實(shí)例,但是Object對象的實(shí)例不一定是Student對象的實(shí)例。使用顯示類型轉(zhuǎn)換:Studentb=(Student)o;//Explicitcasting錯誤?第27頁/共41頁父類和子類之間的轉(zhuǎn)換將一個子類的實(shí)例轉(zhuǎn)換為一個父類的變量總是可行的,稱為向上轉(zhuǎn)換;將一個父類的實(shí)例轉(zhuǎn)換為一個子類的變量稱為向下轉(zhuǎn)換;向下轉(zhuǎn)換不一定總能成功。???CylindermyCylinder=(Cylinder)myCircle;Applex=(Apple)fruit;Orangex=(Orange)fruit;第28頁/共41頁instanceof

運(yùn)算符為確保轉(zhuǎn)換的對象是子類的一個實(shí)例,使用instanceof運(yùn)算符:CirclemyCircle=newCircle();if(myCircleinstanceofCylinder){CylindermyCylinder=(Cylinder)myCircle;...}第29頁/共41頁Example8.1

演示多態(tài)和對象轉(zhuǎn)換創(chuàng)建2個對象,一個圓和一個圓柱,并調(diào)用displayObject方法顯示它們。TestPolymorphismCastingRun第30頁/共41頁8.8隱藏?cái)?shù)據(jù)可以覆蓋一個實(shí)例方法,但是不能覆蓋一個數(shù)據(jù)域(實(shí)例或靜態(tài)的)或靜態(tài)方法。如果在子類中聲明的數(shù)據(jù)域或靜態(tài)方法與父類中的名字相同,父類中的將被隱藏,但是它依舊存在。在子類中可以使用super關(guān)鍵字調(diào)用隱藏的數(shù)據(jù)域或靜態(tài)方法。第31頁/共41頁protected

數(shù)據(jù)和方法protected

修飾符可以應(yīng)用于類中的數(shù)據(jù)和方法。公用類中保護(hù)的數(shù)據(jù)或方法可以被它的子類或同一包中的任何類訪問,即使子類在不同的包中也可以。

溫馨提示

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

評論

0/150

提交評論