第七章繼承與多態(tài)pptx_第1頁
第七章繼承與多態(tài)pptx_第2頁
第七章繼承與多態(tài)pptx_第3頁
第七章繼承與多態(tài)pptx_第4頁
第七章繼承與多態(tài)pptx_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七組

2015.11.12

第七章繼承與多態(tài)要點繼承和多態(tài)的基本概念派生類的聲明和使用Super關(guān)鍵字構(gòu)造方法的繼承和條用類成員變量的繼承和隱藏類方法的重寫抽象類和抽象方法密封類和密封方法接口的聲明和使用多態(tài)繼承概述繼承:是面向?qū)ο蟪绦蛟O(shè)計的只要特征之一

允許重用現(xiàn)有類(基類(baseclass),亦稱超類(superclass);父類(parentclass))創(chuàng)建新類(子類(subclass),亦稱派生類(derivedclass);孩子類(childclass))的過程。

子類將繼承基類的所有數(shù)據(jù)和行為,還可以定義其他數(shù)據(jù)或行為。繼承的類型:

類繼承和接口繼承繼承的層次關(guān)系:在JAVA中,說有的類都繼承與Object.類的繼承不僅限于一個層次,即基類可以派生出自己的子類,子類又可以派生出自己的子類;如:交通工具可以分為汽車,飛機,火車等;飛機又可分為戰(zhàn)斗機,客運機;火車又可分為動車組,高速列車等;汽車按功能又可分為越野車,旅游車,跑車等。但JAVA中語言的類不支持重繼承,因而,所有類的集合形成如下圖的樹狀繼承層次關(guān)系。繼承概述ObjectCharacterBooleanNumberByteShortIntegerLongFloatDoubleString繼承的層次關(guān)系簡單類型封裝類的繼承層次關(guān)系繼承派生類的聲明Super關(guān)鍵字類成員的繼承構(gòu)造方法的繼承和調(diào)用類成員變量的隱藏類方法的重寫抽象類和抽象方法密封類和密封方法派生類的聲明

在聲明派生類時,可以指定要繼承的類(即基類);如果在類定義中沒有指定基類,則Object是基類,派生類使用關(guān)鍵字extends指定要繼承的基類;派生類聲明的基本形式:[類修飾符]class類名[extends基類]{

類體;}Extends是用來實現(xiàn)繼承JAVA不支持多重繼承,即一個派生類只能繼承于一個基類。classPoint{//基類。等同于classPointextendsObjectintx,y;}classColoredPointextendsPoint{//派生類,從Point派生intcolor;}classColored3dPointextendsColoredPoint{//派生類,從ColoredPoint派生intz;}派生類的聲明Point是ColoredPoint和Colored3dPoint的基類Point是ColoredPoint的直接基類;

ColoredPoint是Colored3dPoint的直接基類;ColoredPoint和Colored3dPoint是Point的派生類;ColoredPoint是Point的直接派生類;Colored3dPoint是ColoredPoint的直接派生類;Super關(guān)鍵字Super關(guān)鍵字:

主要功能是完成子類在覆蓋了父類中的方法后調(diào)用子類所復(fù)制的父類的字段和方法。用于從派生類中訪問基類成員。(1).指定創(chuàng)建派生類實例時調(diào)用的基類構(gòu)造方法;

Super(參數(shù))(2).調(diào)用基類上已被其他方法重寫的方法;

Super.方法(參數(shù))(3).訪問基類的數(shù)據(jù)成員;

Super.字段名注:Super關(guān)鍵字只能在實例構(gòu)造方法,實例方法或?qū)嵗L問器中使用。實例:classPerson{publicStringname;publicintage;publicPerson(Stringname,intege){=name;this.age=age;}publicvoidprint(){System.out.printf("name=%s,age=%d",,this.age);}}classStudentextendsPerson{publicStringstudentID;publicStudent(Stringname,intage,Stringid){super(name,age);this.studentID=id;}publicvoidprint(){super.print();System.out.printf(",studentID=%s,",this.studentID);}}classSuperDemo{publicstaticvoidmain(String[]args){Studentobjstudent=newStudent("張三",25,"2007101001");objstudent.print();}}最后運行結(jié)果:實例:類成員的繼承派生類繼承基類中除構(gòu)造方法以外的成員。即派生類繼承其基類(包括基類的超類)的所有成員(除構(gòu)造方法以外),與基類成員的修飾符無關(guān);基類成員的訪問修飾符僅僅限制該成員的可見范圍。構(gòu)造方法的繼承和調(diào)用

構(gòu)造方法不能被繼承,也不能被覆蓋,因為構(gòu)造方法的名稱與類名相同。通過關(guān)鍵字new創(chuàng)建對象實例,會根據(jù)傳入的參數(shù)調(diào)用相匹配的構(gòu)造方法,在調(diào)用構(gòu)造方法前,需要先調(diào)用其基類的構(gòu)造方法。三個如果:如果使用派生類的默認(rèn)構(gòu)造方法構(gòu)造對象實例,則會自動調(diào)其基類的默認(rèn)構(gòu)造方法;如果基類沒有默認(rèn)的構(gòu)造方法,則會導(dǎo)致編譯錯誤。如果使用派生類的其他構(gòu)造方法(帶參數(shù))構(gòu)造對象實例,則必須在派生類的構(gòu)造方法的第一條語句中,顯式地使用Super關(guān)鍵字調(diào)用其基類的構(gòu)造方法,否則會產(chǎn)生編譯錯誤。類成員變量的隱藏成員變量的隱藏:

派生類繼承基類中的所有成員變量。如果在派生類中聲明了與繼承的成員變量同名的成員變量,則該重名成員變量將隱藏從基類繼承的同名成員變量稱為成員變量的隱藏。注:在派生類中引用該成員變量時,實際上引用的是派生類中聲明的成員變量。如果需要引用從基類中繼承的同名成員變量,可使用Super關(guān)鍵字:

Super.變量名隱藏示例:classParent{publicStringname;publicStringsex;publicvoidsetName(Stringname){=name;}}classChildextendsParent{publicStringname;publicChild(Stringname,Stringsex){=name;this.sex=sex;=name+"'sparent";}publicvoidprint(){System.out.println(name+""+sex+""+);}}publicclassHiddenFieldDemo{publicstaticvoidmain(String[]args){Childobj1=newChild("Mary","E");obj1.print();Childobj2=newChild("Jack","E");="Jackie";obj2.sex="M";obj2.print();}}隱藏示例:運行結(jié)果如下所示:類方法的重寫

派生類繼承基類中的所有成員方法,同時也可以在派生類中定義新方法。1.全新方法:

方法的簽名唯一,即與從基類繼承的所有的方法簽名均不相同。全新方法是派生類定義的新方法,即是對基類功能的一種擴展。

2.重載方法:方法名與從基類繼承的方法重名,但二者的方法簽名不同。

重載方法也是派生類定義的新方法,即是對基類功能的一種擴展。3.重寫方法:方法簽名與從基類繼承的方法簽名相同。重寫方法隱藏從基類繼承的相同簽名的方法,重寫方法提供該方法的新實現(xiàn)。抽象類和抽象方法

抽象類(abstractclass)

將關(guān)鍵字abstract置于關(guān)鍵字class的前面可以將類聲明為抽象類。抽象類不能實例化。抽象類一般用于提供多個派生類可共享的級類的公共定義。例如:類庫可以定義一個包含基本功能的抽象類,并要求程序員在使用該類庫時,通過創(chuàng)建派生類來提供自己的類實現(xiàn)。

抽象類與非抽象類相比,具有下列特征:抽象類與非抽象類相比,具有下列特征:

(1)抽象類不能直接實例化,對抽象類使用new運算符號會導(dǎo)致編譯錯誤??梢远x抽象類型的變量,但其值必須為null,或者是其派生的非抽象類的實例的應(yīng)用。(2)抽象類不能被密封。(3)允許(但不要求)抽象類包含抽象成員。(4)當(dāng)從抽象類派生非抽象類時,這些非抽象必須實現(xiàn)所繼承的所有抽象成員,從而重寫那些抽象成員。

例如:

AbstractclassAbstractClass{//聲明類成員}抽象類和抽象方法抽象方法:在抽象類中通過將關(guān)鍵字abstract添加到實例方法的返回類型的前面定義抽象方法。抽象方法聲明引入一個新的虛方法,但不提供該方法的任何實際實現(xiàn),所以抽象方法的方法體只由一個分號去組成,而不是常規(guī)的方法塊。注:除了構(gòu)造方法,靜態(tài)方法和私有方法不能聲明為抽象方法外。其他任何方法均可聲明為抽象方法密封類和密封方法密封類(finalclass):

通過將關(guān)鍵字final置于關(guān)鍵字class的前面,可以將類聲明為最終類或密封類。注:密封類不能作為基類;也不能是抽象類。密封類主要用于防止非有意所的派生。密封類和密封方法FinalFinal修飾符主要用于防止非有意的派生,還能促使某些運行時的優(yōu)化。FinalclassAbstractClass{//聲明類成員}FinalabstractclassFinalAbstractClass{//編譯錯誤,類不能同時為Fiinal和abstract//聲明類成員}密封類和密封方法密封方法(finalmethod):當(dāng)實例方法包含final修飾符時,稱該方法為最終方法,也稱為密封方法。使用final修飾符可以防止派生類進一步重寫該方法。二.接口接口的聲明一個接口定義一個協(xié)定。接口本身不提供它所定義的成員的實現(xiàn),只指定實現(xiàn)該接口的類必須提供的成員,繼承接口的任何非抽象類型都必須實現(xiàn)接口的所有成員。

接口類似抽象基類,不能被實例化。接口中聲明的所有成員方法隱式的為public和abstract.接口可以包含抽象方法和靜態(tài)常量字段。接口聲明的基本形式如下:[接口修飾符]interface

接口名[extends

基接口列表]{接口體}[;]

接口的成員接口通常是公共契約,故一個接口中可以聲明零個或者多個成員,但只能包含其他的簽名,接口的成員包括從基接口繼承的成員和由接口本身聲明的成員,接口成員只能包含抽象方法和靜態(tài)常量字段。

接口的成員變量默認(rèn)為靜態(tài)常量字段(publicstaticfinal),但接口的成員變量不能帶除publicstaticfinal以外的任何修飾符。

接口的成員方法默認(rèn)為公共抽象方法(publicabstract),但接口的成員方法不能帶除publicabstract以外的任何修飾符,應(yīng)為默認(rèn)為公共抽象方法(publicabstract),所以建議不要帶任何修飾符。接口的實現(xiàn)接口的實現(xiàn)可以由類來實現(xiàn)。為了指示類實現(xiàn)了某種接口,在該類或結(jié)構(gòu)的基類列表中應(yīng)該包含該接口的標(biāo)識符。派生類使用關(guān)鍵字implements指定要實現(xiàn)的基接口列表。派生類實現(xiàn)接口的聲明的基本形式如下:[類修飾符]class類名[implements基接口列表]{

類體;}

在實現(xiàn)接口的非抽象中,必須實現(xiàn)從基接口中繼承的所有抽象成員,從而重寫這些抽象成員。類中的對應(yīng)重寫成員方法必須是公共的、非靜態(tài)的,并且與接口成員方法具有相同的簽名。

interfaceIDimensions{floatgetLength();floatgetwidth();}classBoximplementsIDimensions{floatlength;floatwidth;Box(floatlength,floatwidth){this.length=length;this.width=width;}publicfloatgetLengtf(){returnwidth;}}publicclassInterfaceDemo{publicstaticvoidmain(String[]arge){Boxbox1=newBox(30.0f,20.0f);System.out.printf("Length:%9.2f,Width:%9.2f",box1.getLength(),box1.getWidth());}}接口實現(xiàn)案例接口的繼承接口可以從零個或多個接口繼承,被繼承的接口稱為該接口的基接口。

接口使用關(guān)鍵字extends指定要繼承的接口,接口繼承聲明基本形式如下:

[接口修飾符]intenface接口名[extends基接口列表]{類體;

}

接口成員包括從基接口繼承的成員和由接口本身聲明的成員,故實現(xiàn)該接口的類必須實現(xiàn)接口本身聲明的成員以及該接口繼承的成員。

三.多態(tài)多態(tài)的概念通過繼承實現(xiàn)多態(tài)通過方法重載實踐多態(tài)性通過方法重寫實現(xiàn)多態(tài)性多態(tài)性綜合舉例多態(tài)多態(tài)的概念

在面向過程的程序設(shè)計中,函數(shù)不能重名,否則會產(chǎn)生歧義,從而導(dǎo)致編譯錯誤;而在面向?qū)ο笤O(shè)計中,有時需要利用“重名”來提高程序的抽象度和簡潔性。派生類對象可以表示多個類型的能力,成為多態(tài)性。多態(tài)的概念類方法多態(tài)性的實現(xiàn)的兩種方式:(1).方法重載:可以聲明多個同名但參數(shù)的個數(shù),類型和順序不同的方法。編譯時根據(jù)參數(shù)(個數(shù),類型和順序)判定采用的方法。這種編譯時確定的模式,又稱為“靜態(tài)綁定”。(2).方法重寫:派生類聲明與從基類繼承的方法簽名一致

溫馨提示

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

評論

0/150

提交評論