第繼承和多態_第1頁
第繼承和多態_第2頁
第繼承和多態_第3頁
第繼承和多態_第4頁
第繼承和多態_第5頁
已閱讀5頁,還剩36頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

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

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

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

/**計算體積*/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

輸出結果是:

第3頁/共41頁8.3使用關鍵字

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

publicCylinder(){

}

等價于

publicCylinder(){

super();

}

publicA(doubled){

//somestatements

}

等價于

publicA(doubled){

super();

//somestatements

}

第6頁/共41頁8.3.2構造方法鏈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頁/共41頁追蹤執行過程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頁追蹤執行過程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.調用Faculty構造方法第9頁/共41頁追蹤執行過程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.調用Employee的無參構造方法第10頁/共41頁追蹤執行過程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.調用Employee(String)構造方法第11頁/共41頁追蹤執行過程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.調用Person()構造方法第12頁/共41頁追蹤執行過程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.執行println第13頁/共41頁追蹤執行過程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.執行println第14頁/共41頁追蹤執行過程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.執行println第15頁/共41頁追蹤執行過程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.執行println第16頁/共41頁沒有無參構造方法的示例publicclassAppleextendsFruit{}

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

第17頁/共41頁聲明一個子類子類可以擴展父類的方法和屬性,所以可以在子類中:添加新的屬性添加新的方法重寫父類的方法第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頁注子類定義的方法必須與父類方法具有相同的頭標志和相同的返回類型。實例方法僅當可訪問時才能被覆蓋。私有方法不能在定義它的類外訪問,所以不能被覆蓋。如果子類中定義的方法在父類中是私有的,那個這2個方法完全沒有關系。靜態方法也可以繼承,但不能被覆蓋。如果靜態方法被重新定義,則父類的方法將被隱藏。第20頁/共41頁對象類ObjectJava中的每一個類都源于java.lang.Objectclass.如果沒有指定一個類繼承誰,它的父類就是Object.第21頁/共41頁equals()和hashCode()Methodsequals()

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

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

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

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

顯示結果類似:Cylinder@15037e5.

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

第23頁/共41頁多態性、動態綁定和一般程序設計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型參數,所以可以用任何對象。同名的不同方法可以在程序中共存,稱為多態,以覆蓋和重載2種形式體現。GraduateStudent,Student,Person,andObject

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

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

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

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

數據和方法protected

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

溫馨提示

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

評論

0/150

提交評論