Java語(yǔ)言程序設(shè)計(jì)(自考)課件 第六章 繼承與多態(tài)_第1頁(yè)
Java語(yǔ)言程序設(shè)計(jì)(自考)課件 第六章 繼承與多態(tài)_第2頁(yè)
Java語(yǔ)言程序設(shè)計(jì)(自考)課件 第六章 繼承與多態(tài)_第3頁(yè)
Java語(yǔ)言程序設(shè)計(jì)(自考)課件 第六章 繼承與多態(tài)_第4頁(yè)
Java語(yǔ)言程序設(shè)計(jì)(自考)課件 第六章 繼承與多態(tài)_第5頁(yè)
已閱讀5頁(yè),還剩47頁(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)介

第六章繼承與多態(tài)學(xué)習(xí)目標(biāo)能夠使用extends關(guān)鍵字聲明子類,能夠正確進(jìn)行對(duì)象轉(zhuǎn)型能夠區(qū)分方法覆蓋與方法重載,能夠調(diào)用本類及父類中的方法,能夠覆蓋父類中的方法能夠正確使用final及abstract關(guān)鍵字聲明終極成員及抽象成員。能夠正確設(shè)計(jì)接口,讓類實(shí)現(xiàn)接口本章主要內(nèi)容子類12終極類與抽象類3方法覆蓋與多態(tài)接口4第一節(jié)子類Java中的類層次結(jié)構(gòu)為樹狀結(jié)構(gòu),這和自然界中描述一個(gè)事物是類似的isa關(guān)系一般與特殊的關(guān)系isa關(guān)系Manager類和Employee類之間存在重復(fù)部分實(shí)際上,適用于Employee的很多屬性和方法可以不經(jīng)修改就會(huì)被Manager所使用Manager與Employee之間存在“isa”關(guān)系,即Manager“isa”Employee有些對(duì)象之間雖然也是“大”與“小”的關(guān)系,但并不是一般與特殊的關(guān)系例如汽車又包括了車身與發(fā)動(dòng)機(jī),但不能說(shuō)它們之間存在“isa”關(guān)系,它們只能是整體與部分的關(guān)系,一般地稱為“hasa”關(guān)系extends關(guān)鍵字Java提供了派生機(jī)制允許程序員用以前已定義的類來(lái)定義一個(gè)新類新類稱作子類原來(lái)的類稱作父類或基類定義子類的格式修飾符class子類名extends父類名{

類體}如:publicclassAextendsB類A派生于類B,A為子類,B為父類示例可以使用派生機(jī)制來(lái)表示Employee和Manager類子類中只是定義額外的特性,或者進(jìn)行必要的修改Manager類中有Employee類的所有變量和方法所有這些變量和方法都繼承于父類中的定義派生機(jī)制改善了程序的可維護(hù)性,增加了可靠性對(duì)父類Employee所做的修改延伸至子類Manager類中Object類Object類是Java程序中所有類的直接或間接父類,處在類層次的最高點(diǎn)所有其他的類都是從Object類派生而來(lái)的Object類包含了所有Java類的公共屬性O(shè)bject():構(gòu)造方法publicfinalClassgetClass():獲取當(dāng)前對(duì)象所屬的類信息,返回Class對(duì)象publicStringtoString():按字符串對(duì)象返回當(dāng)前對(duì)象本身的有關(guān)信息publicbooleanequals(Objectobj):比較兩個(gè)對(duì)象是否是同一對(duì)象,是則返回true關(guān)于判相等關(guān)于對(duì)象相等的判別,在Java中有兩種方式一種是使用==運(yùn)算符一種是使用equals()方法這兩種方式判定的都是兩個(gè)對(duì)象是否是同一個(gè)對(duì)象(稱為同一)如果兩個(gè)對(duì)象具有相同的類型及相同的屬性值,則稱為相等同一的對(duì)象一定相等,但相等的對(duì)象不一定同一示例程序6.1輸出分別是equals__NO和==__NO,即兩種方式下判斷的都是同一性由于a和b是兩個(gè)獨(dú)立的對(duì)象,故它們不是同一的如果通過(guò)賦值語(yǔ)句b=a來(lái)創(chuàng)建(如程序中注釋掉的語(yǔ)句),再運(yùn)行程序,看看結(jié)果是什么要判斷兩個(gè)對(duì)象各個(gè)屬性域的值是否相同,不能使用從Object類繼承來(lái)的equals方法,而需要在類聲明中對(duì)equals方法進(jìn)行覆蓋,即重新修改這個(gè)方法給BankAccount類添加equals方法如下單重繼承在類的繼承機(jī)制中,它拋棄了多重繼承功能,僅實(shí)現(xiàn)了單重繼承機(jī)制多重繼承是指從多個(gè)類共同派生一個(gè)子類,即一個(gè)類可以有多個(gè)父類下圖中,子類1與子類3的父類都有兩個(gè),兩個(gè)子類都是由多個(gè)父類派生得到的不可克服的問(wèn)題如果子類的多個(gè)父類中有同名的方法和屬性,那么容易造成子類實(shí)例的混亂。這是多重繼承不可克服的缺點(diǎn)在Java中,如果一個(gè)類有父類,則其父類只能有一個(gè),也就是只允許從一個(gè)類中擴(kuò)展類。這條限制叫單重繼承構(gòu)造方法不能繼承雖然一個(gè)子類可以從父類及祖先類中繼承所有能繼承的方法和成員變量,但它不能繼承構(gòu)造方法只有兩種方式能讓一個(gè)類得到構(gòu)造方法一種方式是自己編寫構(gòu)造方法另一種方式是,在用戶沒(méi)有編寫構(gòu)造方法的時(shí)候,由系統(tǒng)為類提供唯一一個(gè)默認(rèn)的構(gòu)造方法使用父類中的成員使用父類成員示例子類不能直接訪問(wèn)其父類中定義的私有屬性及方法,但可以使用父類中定義的公有(及保護(hù))方法訪問(wèn)私有數(shù)據(jù)成員不能直接使用父類中的私有元素對(duì)象轉(zhuǎn)型Java允許使用對(duì)象之父類類型的一個(gè)變量指示該對(duì)象,比如對(duì)于前面定義的Employee和Manager類,可以將子類的對(duì)象賦給父類的變量:Employeee=newManager();//子類Manager的實(shí)例賦給父類變量e這稱為對(duì)象轉(zhuǎn)型(casting)對(duì)象引用的賦值兼容原則允許把子類的實(shí)例賦給父類的引用。但反過(guò)來(lái)是錯(cuò)誤的,不能把父類的實(shí)例賦給子類的引用Managerm=newEmployee(); //錯(cuò)誤類的變量既可以指向本類實(shí)例,又可以指向其子類的實(shí)例,這表現(xiàn)為對(duì)象的多態(tài)性示例在程序中,有時(shí)需要判明一個(gè)引用到底指向哪個(gè)實(shí)例,這可以通過(guò)instanceof運(yùn)算符來(lái)實(shí)現(xiàn)對(duì)象轉(zhuǎn)型示例對(duì)象引用轉(zhuǎn)型的規(guī)則沿類層次向“上”轉(zhuǎn)型總是合法的把Manager引用轉(zhuǎn)型為Employee引用。此種方式下不需要轉(zhuǎn)型運(yùn)算符,只用簡(jiǎn)單的賦值語(yǔ)句就可以完成對(duì)于向“下”轉(zhuǎn)型,只能是祖先類轉(zhuǎn)型到后代類,其他類之間是不允許的把Manager引用轉(zhuǎn)型為Contractor引用是非法的要替換的類(賦值號(hào)右側(cè))必須是當(dāng)前引用類型(賦值號(hào)左側(cè))的父類,且要使用顯式轉(zhuǎn)換第二節(jié)方法覆蓋與多態(tài)使用類的繼承關(guān)系,可以從已有的類產(chǎn)生一個(gè)新類。在原有特性基礎(chǔ)上,增加了新的特性。父類中原有的方法可能不能滿足新的要求,因此需要修改父類中已有的方法。這就是方法覆蓋(Override),也稱為方法重寫或是隱藏子類中定義方法所用的名字、返回類型及參數(shù)列表和父類中方法使用的完全一樣,也就是具有相同的方法簽名。此時(shí),稱子類方法覆蓋(重寫)了父類中的方法,從邏輯上看就是子類中的成員方法將隱藏父類中的同名方法方法覆蓋及其規(guī)則當(dāng)子類重寫父類方法時(shí),子類與父類使用的是相同的方法名及參數(shù)列表,但可以執(zhí)行不同的功能覆蓋的同名方法中,子類方法不能比父類方法的訪問(wèn)權(quán)限更嚴(yán)格例如,如果父類中方法method()的訪問(wèn)權(quán)限是public,則子類中就不能含有private的method()方法重寫示例程序6.2如果子類已經(jīng)重寫了父類中的方法,但在子類中還想使用父類中被隱藏的方法,可以使用super關(guān)鍵字程序6.3應(yīng)用覆蓋的規(guī)則覆蓋方法的允許訪問(wèn)范圍不能低于原方法覆蓋方法所拋出的異常不能比原方法更多classSuperClass{ publicvoidmethod(){/*相關(guān)代碼*/}}classSubClassextendsSuperClass{ privatevoidmethod(){/*相關(guān)代碼*/} //使用private方法覆蓋public方法,錯(cuò)誤}調(diào)用父類的構(gòu)造方法super關(guān)鍵字也可以用在構(gòu)造方法中,其功能為調(diào)用父類的構(gòu)造方法子類不能從父類繼承構(gòu)造方法,在子類的構(gòu)造方法中調(diào)用父類的構(gòu)造方法不失為一種良好的程序設(shè)計(jì)風(fēng)格一般來(lái)講,調(diào)用super()時(shí)參數(shù)的個(gè)數(shù)沒(méi)有限制,只要其參數(shù)列表和父類中的某個(gè)構(gòu)造方法的參數(shù)列表相符即可在通常情況下,沒(méi)有參數(shù)的默認(rèn)構(gòu)造方法常被用來(lái)初始化父類對(duì)象也可以根據(jù)具體情況選擇父類其他的構(gòu)造方法如果要顯式調(diào)用父類的構(gòu)造方法,super()調(diào)用必須放在子類構(gòu)造方法的開頭位置多態(tài)有了多態(tài),能夠允許同一條方法調(diào)用指令在不同的上下文中做不同的事情Manager類與Employee類之間具有“isa”關(guān)系,現(xiàn)在假定聲明了如下兩個(gè)實(shí)例: Employeee=newEmployee(); Managerm=newManager();e.getDetails()與m.getDetails()將執(zhí)行不同的代碼e是Employee對(duì)象,將執(zhí)行Employee類中的方法m是Manager對(duì)象,執(zhí)行的是Manager類中的方法如何處理:Employeee=newManager();Java規(guī)定,對(duì)象要執(zhí)行的方法,是與對(duì)象真正類型(運(yùn)行時(shí)類型)相關(guān)的方法,而不是與引用類型(編譯時(shí)類型)相關(guān)的方法變量的靜態(tài)類型是出現(xiàn)在聲明中的類型變量e的靜態(tài)類型是Employee靜態(tài)類型也稱為引用類型,是在代碼編譯時(shí)確定下來(lái)的運(yùn)行過(guò)程中某一時(shí)刻變量指向的對(duì)象的類型稱為動(dòng)態(tài)類型,這是它此刻的真正類型,變量的動(dòng)態(tài)類型會(huì)隨運(yùn)行進(jìn)程而改變本例中e的動(dòng)態(tài)類型是Manager調(diào)用稍后可能被覆蓋的方法的這種處理方式,稱為動(dòng)態(tài)綁定或后綁定動(dòng)態(tài)綁定一定要到運(yùn)行時(shí)才能確定要執(zhí)行的方法代碼在編譯過(guò)程中能確定調(diào)用方法的處理方式,稱為靜態(tài)綁定或前綁定多態(tài)示例第三節(jié)終極類與抽象類Java中有一個(gè)重要的關(guān)鍵字final,它表示終極,既可以修飾一個(gè)類,也可以修飾類中的成員變量或成員方法如果一個(gè)類被定義為final,則它不能有子類如果一個(gè)方法被定義為final,則不能被覆蓋如果一個(gè)變量被定義為final,則它的值不能被改變與之相對(duì)應(yīng)的是關(guān)鍵字abstract,它可以用于類或是方法,表示抽象使用abstract修飾的方法的方法體為空修飾的類必須被子類繼承終極類定義了一個(gè)final類FinalClass,當(dāng)試圖派生它的子類時(shí),會(huì)導(dǎo)致錯(cuò)誤finalpublicclassFinalClass{ intmemberar; voidmemberMethod(){};}classSubFinalClassextendsFinalClass{ //錯(cuò)誤 intsubmembervar; voidsubMemberMethod(){};}終極方法終極方法不能被覆蓋classFinalMethodClass{ finalvoidfinalMethod(){……} //父類中程序代碼}classOverloadClassextendsFinalMethodClass{ voidfinalMethod(){……} //子類中程序代碼,錯(cuò)誤!}終極變量不能改變終極變量的值classConst{finalfloatPI=3.14f; //終極變量finalStringlanguage="Java";}publicclassUseConst{publicstaticvoidmain(Stringargs[]){Constmyconst=newConst();myconst.PI=3.1415926f; //不能再被重新賦值}}終極引用的使用示例classCar{intnumber=1234;}classFinalVariable{publicstaticvoidmain(Stringargs[]){finalCarmycar=newCar(); //終極變量,引用類型mycar.number=8888; //可以!//修改的是mycar指向的內(nèi)存中的值mycar=newCar();//錯(cuò)誤!不能修改mycar本身的值}}抽象類在程序設(shè)計(jì)過(guò)程中,有時(shí)需要?jiǎng)?chuàng)建某個(gè)類代表一些基本行為,并為其規(guī)范定義一些方法,但是又無(wú)法或不宜在這個(gè)類中就對(duì)這些行為加以具體實(shí)現(xiàn),而希望在其子類中根據(jù)實(shí)際情況再去實(shí)現(xiàn)這些方法定義了方法但沒(méi)有定義具體實(shí)現(xiàn)的類稱為抽象類通過(guò)關(guān)鍵字abstract把一個(gè)類定義為抽象類每一個(gè)未被定義具體實(shí)現(xiàn)的方法也應(yīng)標(biāo)記為abstract,這樣的方法稱為抽象方法在程序中不能用抽象類作為模板來(lái)創(chuàng)建對(duì)象必須生成抽象類的一個(gè)非抽象的子類后才能創(chuàng)建實(shí)例抽象類可以包含常規(guī)類能夠包含的任何成員方法抽象類中也可以包含構(gòu)造方法抽象類與抽象方法抽象類中通常會(huì)包含抽象方法,這種方法只有方法的聲明,而沒(méi)有方法的實(shí)現(xiàn)抽象方法將在抽象類的子類中被實(shí)現(xiàn)除了抽象方法,抽象類中也可以包含非抽象方法,反之,不能在非抽象的類中定義抽象方法只有抽象類才能具有抽象方法抽象類示例抽象類示例例6.16抽象類的子類所繼承的抽象方法同樣還是抽象方法,除非提供了其父類中所有抽象方法的實(shí)現(xiàn)代碼,否則子類還是抽象類抽象類是不能創(chuàng)建對(duì)象的,除非通過(guò)間接的方法來(lái)創(chuàng)建其子類的對(duì)象,但是可以定義一個(gè)抽象類的引用變量第四節(jié)接口接口是體現(xiàn)抽象類功能的另一種方式,可將其想象為一個(gè)“純”的抽象類它允許創(chuàng)建者規(guī)定一個(gè)類的基本形式,包括方法名、參數(shù)列表以及返回值類型,但不規(guī)定方法體在接口中所有的方法都是抽象方法,都沒(méi)有方法體可以把接口看成是特殊的抽象類,接口與抽象類都用來(lái)定義多個(gè)類的共同屬性接口還可以實(shí)現(xiàn)與抽象類不同的功能Java不支持多重繼承的概念,一個(gè)類只能從唯一的一個(gè)類繼承而來(lái)這并不意味著Java不能實(shí)現(xiàn)多重繼承的功能Java允許一個(gè)類實(shí)現(xiàn)多個(gè)接口,從而實(shí)現(xià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)論