java課件 第五章_第1頁
java課件 第五章_第2頁
java課件 第五章_第3頁
java課件 第五章_第4頁
java課件 第五章_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

面向?qū)ο蟪绦蛟O(shè)計(jì)Java,ChenzhengMar.2012,第5章超類、子類和繼承性,繼承:類繼承另一個類,這個類除了創(chuàng)建自己的成員外,還能夠繼承或擴(kuò)展另一個類的成員運(yùn)用繼承,你能夠創(chuàng)建一個通用類,它定義了一系列相關(guān)項(xiàng)目的一般特性。該類可以被更具體的類繼承,每個具體的類都增加一些自己特有的東西。被繼承的類叫超類(superclass),繼承超類的類叫子類(subclass),類的繼承,繼承性特性如下:單一繼承性:子類只能有一個超類,而超類可以有多個子類;子類繼承超類的所有成員;子類可以創(chuàng)建自己的成員;子類不能繼承超類的構(gòu)造器,只能在構(gòu)造器中通過super()調(diào)用超類的構(gòu)造器;子類的構(gòu)造器首先要調(diào)用超類的構(gòu)造器;多態(tài)性之一:子類的成員隱藏和覆蓋超類中相同的成員;多態(tài)性之二:超類的對象可以對子類的實(shí)例引用;由abstract和final修飾的類指示類的是否必須或不能被繼承。,類的繼承,創(chuàng)建子類,格式如下:abstract|finalclassSubClsextendsSupClsSubClassBodyabstract是可選項(xiàng),修飾的類叫抽象類,指示其對象引用的必須是其子類實(shí)例;final是可選項(xiàng),修飾的類叫終結(jié)類,指示其不能被繼承,不能有子類;SubCls是創(chuàng)建的類,稱為子類;extends是關(guān)鍵字,指示兩個類存在的繼承關(guān)系;SuperCls是SubCls類的超類。,類的繼承,在創(chuàng)建類時(shí),若缺省extends,則該類就為Object類的直接子類。Object類是Java語言中所有類的直接或間接超類。Object類存放在java.lang包中。子類繼承了超類的所有成員,但是無法訪問某些受限的成員子類中可以訪問從超類繼承下來的三種訪問權(quán)限設(shè)定的成員public;protected;缺省。,類的繼承,類的繼承,父類(超類),子類,classPersonStringname;charsex;Datebirthday;voidsetData(Stringn,chars,Dateb)name=n;sex=s;birthday=b;,classStudentextendsPersonStringstuID;Stringspeciality;voidsetData(Stringn,chars,Dateb,Stringid,Stringspec)setData(n,s,b);stuID=id;speciality=spec;,類Person有成員:成員變量:name、sex、birthday成員方法:setData(String,char,Date)類Student有成員:成員變量:name、sex、birthday、stuID、speciality成員方法:setData(String,char,Date)、setData(String,char,Date,String,String)其中:紅色標(biāo)識的成員是類Student繼承超類Person的成員。,類的繼承,SimpleInheritance.java,雖然子類可以繼承超類所有成員,但是因?yàn)槌愔谐蓡T的訪問控制,子類無法訪問某些受限成員。在超類中,由private修飾的訪問權(quán)限的成員變量和方法,雖然被子類繼承,但是子類不能訪問。,類的繼承,Access.java,一個更實(shí)際的例子:為了新的功能而編寫子類,類的繼承,DemoBoxWeight.java,超類對象可以引用子類實(shí)例,類的繼承,RefDemo.java,第5章超類、子類和繼承性,Java語言中,每個類均有三個量,它們具有特別的含義及用途。nullthissuper,null,this和super,nullnull表示變量的值為“空”,用于表示對象或數(shù)組還沒有相應(yīng)的實(shí)例引用。例如:PointpNull=null;,null,this和super,this表示對類的實(shí)例訪問,它也表示了對象對該實(shí)例引用訪問。;在類中可以來指向成員變量,以示區(qū)別于非成員變量;在構(gòu)造器中,使用this()形式對另一個構(gòu)造器的調(diào)用;在類的創(chuàng)建中,需要表示對自身的實(shí)例訪問時(shí),用this表示。,null,this和super,HSBColor.java,super在子類中,使用super訪問被隱藏的超類變量,被覆蓋的超類方法。使用有三種情況:訪問被隱藏的超類成員變量;例如:super.varName調(diào)用超類中被覆蓋的方法;例如:super.methodName(paramList)調(diào)用超類中的構(gòu)造方法.例如:super(paramList),null,this和super,UseSuper.java,DemoSuper.java,super()總是引用子類最接近的超類的構(gòu)造函數(shù)。在類層次結(jié)構(gòu)中,如果超類構(gòu)造函數(shù)需要參數(shù),那么不論子類它自己需不需要參數(shù),所有子類必須向上傳遞這些參數(shù)。,多級類層次,DemoShipment.java,super()必須是子類構(gòu)造函數(shù)的第一個執(zhí)行語句,無論你用到了super()沒有,這個次序不變。如果super()沒有被用到,每個超類的默認(rèn)的或無參數(shù)的構(gòu)造函數(shù)將執(zhí)行。,何時(shí)調(diào)用構(gòu)造函數(shù),CallingCons.java,第5章超類、子類和繼承性,成員變量的隱藏:在子類的創(chuàng)建中,如果出現(xiàn)了與其超類相同的成員變量,則超類中的成員變量被子類中的成員變量所隱藏。成員方法的覆蓋:在子類的創(chuàng)建中,如果出現(xiàn)與超類中有相同名、同參數(shù)及同返回類型的成員方法,則超類中的成員方法被子類中的成員方法所覆蓋。,類的繼承,TestCovert.java,方法覆蓋:在子類的創(chuàng)建中,具有與超類中有相同的方法名、相同的參數(shù)以及相同的返回?cái)?shù)據(jù)類型。它還具有比超類中被覆蓋方法更大的可訪問性,即權(quán)限限制更寬松。publicprotected缺省private不同于方法過載。方法過載是在一個類中具有相同方法名的方法,它們之間有不同的參數(shù)。,方法覆蓋與運(yùn)行時(shí)的多態(tài),運(yùn)行時(shí)的多態(tài)超類的對象可以引用子類的實(shí)例(上轉(zhuǎn)型)該對象仍然只能夠調(diào)用超類中定義的方法和變量對于覆蓋或繼承的方法,Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例的類型來決定選擇哪個方法調(diào)用。對子類的一個實(shí)例,如果子類覆蓋了超類的方法,則運(yùn)行時(shí)系統(tǒng)調(diào)用子類的方法。如果子類繼承了超類的方法(未覆蓋),則運(yùn)行時(shí)系統(tǒng)調(diào)用超類的方法。,方法覆蓋與運(yùn)行時(shí)的多態(tài),classClassAvoidcallMe()System.out.println(在ClassA中的callMe()方法!);classClassBextendsClassAvoidcallMe()System.out.println(在ClassB中的callMe()方法!);,方法覆蓋與運(yùn)行時(shí)的多態(tài),publicclassTestConvertpublicstaticvoidmain(Stringarg)ClassAvA=newClassB();vA.callMe();程序運(yùn)行輸出的是:在ClassB中的callMe()方法!結(jié)果說明了vA調(diào)用callMe()是子類ClassB中的方法。,方法覆蓋與運(yùn)行時(shí)的多態(tài),當(dāng)超類的對象對子類實(shí)例引用時(shí),這個對象所訪問的成員必須是超類中所具有的。這個對象不能訪問子類自己創(chuàng)建的成員。當(dāng)這個對象訪問的是被覆蓋的方法,則調(diào)用的是子類中覆蓋方法。只有當(dāng)這個對象被強(qiáng)制轉(zhuǎn)換成子類類型時(shí),這個子類的所有成員才有可能被訪問。,方法覆蓋與運(yùn)行時(shí)的多態(tài),Dispatch.java,FindAreas.java,TestMethodHidden.java,TestMethodAndVar.java,第5章超類、子類和繼承性,final關(guān)鍵字“這個東西不能改變”考慮到兩方面的因素:設(shè)計(jì)或效率,final和abstract,final數(shù)據(jù)許多程序設(shè)計(jì)語言都有自己的辦法告訴編譯器某個數(shù)據(jù)是“常數(shù)”。常數(shù)主要應(yīng)用于下述兩個方面:(1)編譯期常數(shù),它永遠(yuǎn)不會改變(2)在運(yùn)行期初始化的一個值,我們不希望它發(fā)生變化對于編譯期的常數(shù),編譯器(程序)可將常數(shù)值“封裝”到需要的計(jì)算過程里。也就是說,計(jì)算可在編譯期間提前執(zhí)行,從而節(jié)省運(yùn)行時(shí)的一些開銷。,final和abstract,FinalData.java,空白final盡管被聲明成final,但卻未得到一個初始值??瞻譮inal必須在實(shí)際使用前得到正確的初始化。空白final具有最大的靈活性:位于類內(nèi)部的一個final字段現(xiàn)在對每個對象都可以有所不同,同時(shí)依然保持其“不變”的本質(zhì)。,final和abstract,BlankFinal.java,final參數(shù)將參數(shù)設(shè)成final屬性,方法是在參數(shù)列表中對它們進(jìn)行適當(dāng)?shù)穆暶?。在一個方法的內(nèi)部,不能改變該final參數(shù)。,final和abstract,FinalArguments.java,final類由final修飾的類稱終結(jié)類,不能被繼承。由于安全性的原因或者是面向?qū)ο笤O(shè)計(jì)的考慮,限定一些類不能被繼承。final類不能被繼承,保證了該類的唯一性。對于一個類的定義已經(jīng)很完善,不需再創(chuàng)建它的子類,也可以將其修飾為final類。格式:finalclassfinalClassName.,final和abstract,Jurassic.java,final方法以final修飾的方法是不能被子類的方法所覆蓋。其格式為:finalreturnTypemethodName(paraList).可有效地“關(guān)閉”動態(tài)綁定,或者告訴編譯器不需要進(jìn)行動態(tài)綁定。編譯器就可為final方法調(diào)用生成效率更高的代碼。,final和abstract,abstract類和方法當(dāng)一個類的定義完全表示抽象概念時(shí),它不能夠被實(shí)例化為一個對象。抽象類本身存在未實(shí)現(xiàn)的方法(abstract方法),這些方法不具備實(shí)際功能,它只能衍生出子類,抽象方法則由衍生子類時(shí)所覆蓋。abstract方法必須是在abstract類中,但是abstract類中也可以有非abstract方法。,final和abstract,abstract類和方法abstract類格式:abstractclassabstractClassName.abstract方法格式為:abstractreturnTypemethodName(paraList);abstract方法是沒有語句實(shí)現(xiàn)部分,直接由;結(jié)束。abstract方法必須是在abstract類中,并由其子類的方法覆蓋。,final和abstract,在創(chuàng)建抽象方法時(shí),要注意有下面三種方法不能作為抽象方法定義:構(gòu)造方法類方法私有方法,final和abstract,TestAbst.java,AbstractAreas.java,第5章超類、子類和繼承性,Object類Object類處于Java開發(fā)環(huán)境的類層次樹的根部,處于Java類層的最高層的一個類,是所有類的超類。其它所有的類都直接或間接地為它的子類。該類定義了一些所有對象的最基本的狀態(tài)和行為,包括與同類對象相比較,轉(zhuǎn)化為字符串等,Object類,Java語言中類的繼承性有什么特點(diǎn)?子類可以繼承超類的什么,不能繼承的如何在子類中訪問?子類對超類的擴(kuò)展表現(xiàn)在哪些方面?舉例說明。方法覆蓋是指什么,它與方法過載有什么不同?舉例說明。在Java中有哪些是多態(tài)性的表現(xiàn)?舉例說明。用final和abstract修飾的類各有什么特點(diǎn)?用final和abstract修飾的方法各有什么特點(diǎn)?舉例說明Object類的方法equals()的使用情況。,思考,有兩個類Person和Student,它們存在繼承關(guān)系。在Person中,有成員變量name,sex,age三個,它們類型分別為String、char、int,有一個帶參數(shù)的構(gòu)造方法Person(String,char,int),用來對成員變量初始化。有成員方法setData(String,char,int)設(shè)置成員變量name,sex,age的值。getData()是不帶參數(shù)且返回值由name、sex和age值構(gòu)成的字符串的成員方法。Student類是Person類的子類,在Student中,有int類型的sID和classNo成員變量用來表示學(xué)生的學(xué)號和班級號。它有帶五個參數(shù)的方法setData()和不帶參數(shù)的方法getData(),setData()方法設(shè)置成員變量的值

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論