




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java程序設(shè)計(jì)第04章繼承本章內(nèi)容CORE-C04-01類、父類與抽象CORE-C04-02類、子類與繼承
CORE-C04-03根父類:Object類
CORE-C04-04繼承設(shè)計(jì)與應(yīng)用本章目標(biāo)1、實(shí)現(xiàn)類的繼承。2、能熟練使用Object中方法
第01節(jié)類、父類與抽象知識(shí)點(diǎn)預(yù)覽#節(jié)知識(shí)點(diǎn)難點(diǎn)重點(diǎn)應(yīng)用1CORE-C04-01類、父類與抽象1、類的共性抽象√√
2、類的層次結(jié)構(gòu)√√
1、類的共性抽象面向?qū)ο蟮囊霑?huì)提供軟件項(xiàng)目實(shí)現(xiàn)的穩(wěn)定性,穩(wěn)定性的一個(gè)重要方面是軟件項(xiàng)目模塊可復(fù)用與擴(kuò)展。Java提供繼承的語(yǔ)法機(jī)制類實(shí)現(xiàn)模塊的復(fù)用與擴(kuò)展、升級(jí)。publicclassPerson{privateStringname;privatebyteage;publicvoidprintInfo(){ ……..}}publicclassStudent{privateStringname;privatebyteage;privateStringschool;publicvoidprintInfo(){ ……..}publicvoidstudy(){ ……..}}2、類的層次結(jié)構(gòu)Person-name:String-age:byte+printInfo():voidStudent-school:String+study():voidTeacher-dept:String+teach():void第02節(jié)類、子類與繼承
知識(shí)點(diǎn)預(yù)覽#節(jié)知識(shí)點(diǎn)難點(diǎn)重點(diǎn)應(yīng)用2CORE-C04-02類、子類與繼承1、類的擴(kuò)展
√√2、類的繼承語(yǔ)法
√√3、子類對(duì)象實(shí)例化與構(gòu)造器
√√4、super
√√5、覆蓋與多態(tài)
√√6、覆蓋與修飾符號(hào)
√√7、覆蓋與異常轉(zhuǎn)移√√√8、阻止繼承與final修飾符號(hào)
√√9、類型轉(zhuǎn)換
√√10、類型裝箱與解箱
√√11、protected修飾符號(hào)
√√1、類的擴(kuò)展子類與父類的關(guān)系:子類比起父類就是成員更加豐富:成員變量增加(擴(kuò)展)。處理成員變量的成員方法增加(擴(kuò)展)。class父類{ //成員變量 //成員方法}class子類{ //這樣也可以描述子類 //父類成員變量 //父類成員方法 //擴(kuò)展的成員變量 //擴(kuò)展的成員方法}子類的描述方法明顯兩個(gè)缺點(diǎn):1、描述重復(fù)。2、從代碼無(wú)法反映父子關(guān)系。2、類的繼承語(yǔ)法-1類擴(kuò)展(繼承)的語(yǔ)法機(jī)制class子類extends父類{ //擴(kuò)展的成員變量 //構(gòu)造方法 //擴(kuò)展的成員方法}class父類{ //成員變量 //成員方法}class子類extends父類{ //擴(kuò)展的成員變量 //擴(kuò)展的成員方法}子類的描述方法明顯解決了缺點(diǎn):1、描述不重復(fù)。2、體現(xiàn)父子關(guān)系。2、類的繼承語(yǔ)法-2子類對(duì)象也可以訪問(wèn)父類中的成員。classClsSuper{ publicintm_a=20; publicvoidshow(){ System.out.printf("m_a=%d\n",m_a); }}classClsSubextendsClsSuper{ publicintm_b=30; publicvoidprint(inta){
//使用父類成員變量像自己的成員變量一樣,不需要通過(guò)方法(對(duì)成員方法亦然) System.out.printf(“m_a=%d,m_b=%d,參數(shù)=%d\n”,m_a,m_b,a); }}ClsSubobjsub=newClsSub();System.out.println(objsub.m_a); //訪問(wèn)父類的成員變量System.out.println(objsub.m_b);objsub.show(); //訪問(wèn)父類的成員方法objsub.print(999);2、類的繼承語(yǔ)法-3子類對(duì)象的類型:依據(jù)常規(guī)白馬是馬的邏輯思路,子類對(duì)象肯定是父類型。在Java的語(yǔ)法規(guī)則上:可以把子類類型的對(duì)象賦值給父類類型的對(duì)象。依據(jù)馬不一定是白馬的邏輯思路,父類對(duì)象不一定是子類類型。在Java的語(yǔ)法規(guī)則上:不能把父類對(duì)象賦值給子類對(duì)象。classClsSubextendsClsSuper{ //ClsSuper是ClsSub的子類}
ClsSubsub=null;ClsSupersup=newClsSuper(); sub=sup; //語(yǔ)法錯(cuò)誤sub=newClsSuper(); //語(yǔ)法錯(cuò)誤sup=sub; //語(yǔ)法正確
2、類的繼承語(yǔ)法-4子類對(duì)父類的擴(kuò)展有幾個(gè)重點(diǎn)必須清楚:盡管子類擴(kuò)展父類,但子類與父類屬于不同的類塊,作用域不同,遵循不同作用域規(guī)則。子類的成員變量可以與父類的成員變量重名。子類的成員方法可以與父類的成員方法重名,甚至參數(shù)類型、順序、個(gè)數(shù)都完全相同。classClsSuper{ publicintm_a=20; publicvoidshow(inta){ }}classClsSubextendsClsSuper{ publicintm_a=30; publicvoidshow(inta){ }}成員變量在父子類中重名的解決規(guī)則與成員方法是不同的2、類的繼承語(yǔ)法-4子類的成員變量與父類的成員變量重名的訪問(wèn)規(guī)則:當(dāng)使用對(duì)象訪問(wèn),根據(jù)對(duì)象的申明類型來(lái)確認(rèn):對(duì)象申明為父類型,就訪問(wèn)父類中成員變量,聲明為子類類型就訪問(wèn)子類中成員變量。子類中沒(méi)有,就到父類中查找成員變量并訪問(wèn)。classClsSuper{ publicintm_a=20;}classClsSubextendsClsSuper{ publicintm_a=30;}ClsSupero1=newClsSuper();System.out.println(o1.m_a); //ClsSuper中成員。ClsSupero2=newClsSub();System.out.println(o2.m_a); //ClsSuper中成員。
ClsSubo3=newClsSub();System.out.println(o3.m_a); //ClsSub中成員。
3、子類對(duì)象實(shí)例化與構(gòu)造器-1子類與父類是屬于兩個(gè)不同的塊,也就是屬于兩個(gè)不同的作用域,作用域不同也意味著內(nèi)存存儲(chǔ)區(qū)域的差異。子類對(duì)象的空間分配也是分成兩個(gè)部分:父類內(nèi)存空間,子類內(nèi)存空間。2030m_am_aClsSuperClsSubClsSupero2=newClsSub();System.out.println(o2.m_a); //ClsSuper中成員。
o2對(duì)象實(shí)際是訪問(wèn)位置
對(duì)象決定訪問(wèn)的開(kāi)始位置,
類型決定訪問(wèn)的范圍。3、子類對(duì)象實(shí)例化與構(gòu)造器-2當(dāng)子類擴(kuò)展父類,子類對(duì)象可以訪問(wèn)父類的成員,但其中有一個(gè)必須要注意:父類的構(gòu)造器不能初始化子類成員,子類構(gòu)造器不能初始化父類成員。子類與父類的成員都是由自己的構(gòu)造器完成初始化。子類對(duì)象化的時(shí)候,首先判定是否有父類,沒(méi)有父類就直接調(diào)用構(gòu)造器完成成員變量初始化。有則調(diào)用父類構(gòu)造器完成父類成員變量的初始化,然后調(diào)用子類構(gòu)造器初始化子類成員變量。不管父子類,他們的成員都使用自己的構(gòu)造器來(lái)初始化自己的成員變量。子類的構(gòu)造器不能初始化父類的成員,父類構(gòu)造器不能初始化子類的成員。當(dāng)子類初始化的時(shí)候,會(huì)調(diào)用父類構(gòu)造器,但由于構(gòu)造器重載,Java引入如下語(yǔ)法規(guī)則:當(dāng)子類初始化的時(shí)候,默認(rèn)調(diào)用父類的缺省構(gòu)造器。但也可以指定構(gòu)造器類初始化父類成員變量。3、子類對(duì)象實(shí)例化與構(gòu)造器-3使用super指定父類構(gòu)造器classClsSuper{ privateintm_a=20; publicClsSuper(){ } publicClsSuper(inta){ m_a=a; } }classClsSubextendsClsSuper{ privateintm_b=30; publicClsSub(intb,inta){
super(a); //調(diào)用ClsSuper(inta) m_b=b; } publicClsSub(intb){ //調(diào)用ClsSuper()構(gòu)造器,m_a=20 m_b=b; }}Super必須在構(gòu)造器的第一行。調(diào)用缺省構(gòu)造器3、子類對(duì)象實(shí)例化與構(gòu)造器-4當(dāng)把子類對(duì)象賦值給父類對(duì)象,最后導(dǎo)致真正的類型無(wú)法確認(rèn)。Java提供專門(mén)的語(yǔ)法來(lái)識(shí)別對(duì)象的真正類型。
對(duì)象instanceof類型ClsSupero2=newClsSub();if(o2instanceofClsSub){System.out.println(“o2是ClsSub類型”);}4、super關(guān)鍵字super除了當(dāng)成構(gòu)造器使用外,還可以作為作用域使用:當(dāng)父類成員與子類成員沖突的時(shí)候,使用[super.成員]可以區(qū)分是父類中成員,不加super前綴或者加this前綴表示是當(dāng)前類成員。當(dāng)父類、子類成員不沖突的時(shí)候,不需要super前綴。注意:super作為構(gòu)造器使用,必須放在構(gòu)造器中,而且必須是第一行。super作為作用域使用,可以在構(gòu)造器,也可以在成員方法內(nèi)使用,可以放在任意行。5、覆蓋與多態(tài)-1父類與子類的成員方法重名,沖突分成兩種情況:在類內(nèi)部不通過(guò)對(duì)象使用。可以使用this,super關(guān)鍵字區(qū)分。通過(guò)對(duì)象使用。Java語(yǔ)法的默認(rèn)規(guī)則是:不管對(duì)象是什么類型,調(diào)用的方法都是new后構(gòu)造器所在類的方法。(與對(duì)象的表現(xiàn)類型無(wú)關(guān)),稱為覆蓋(Override)classClsSuper{ publicvoidshow(){ }}classClsSubextendsClsSuper{ publicvoidshow(){ }}ClsSuperobjsuper=newClsSub();objsuper.show();先確認(rèn)對(duì)象的實(shí)際類型。再確認(rèn)類所在的方法,并調(diào)用。5、覆蓋與多態(tài)-2Java提供的Override語(yǔ)法對(duì)程序的穩(wěn)定結(jié)構(gòu)有非常重要的作用。classClsSuper{ publicvoidshow(){ }}classClsSub1extendsClsSuper{ publicvoidshow(){ //實(shí)現(xiàn)1 }}classClsSub2extendsClsSuper{ publicvoidshow(){ //實(shí)現(xiàn)2 }}classMain{ publicstaticvoidmain(String[]args){ ClsSuperobj=newClsSub1(); //表現(xiàn)類型ClsSuper實(shí)際類型ClsSub1 call(obj); //call內(nèi)部的調(diào)用因?qū)ο蟛煌煌?} //稱為多態(tài)(一個(gè)方法多種實(shí)現(xiàn)) publicstaticvoidcall(ClsSuperobj){ obj.show(); }}6、覆蓋與修飾符號(hào)-1為了防止方法被覆蓋,可以使用修飾符final。使用final修飾的方法是不能被覆蓋的。為了防止覆蓋方法因拼寫(xiě)原因,而沒(méi)有覆蓋,可以使用標(biāo)注修飾讓編譯器做語(yǔ)法檢測(cè)。@Override。 //注意區(qū)分大小寫(xiě)。
classClsSuper{ publicvoidshow(){ }}classClsSubextendsClsSuper{ @Override //如果show方法與父類不一樣,會(huì)報(bào)編譯錯(cuò)誤。 publicvoidshow(){ } public@Overridevoidshow(){ //@Override作為修飾符,與其他修飾符不分先后。 }}6、覆蓋與修飾符號(hào)-2在override語(yǔ)法中,子類中的override方法的修飾符功能弱于父類中的方法。修飾符的強(qiáng)弱按照如下順序排列:public
缺省 (什么修飾符都不要)protectedprivate7、覆蓋與異常轉(zhuǎn)移覆蓋的異常列表在設(shè)計(jì)上是希望逐步處理,所以子類的override方法的異常列表中的異常類不能多于父類的異常列表中的異常類型。classClsSuper{ publicvoidshow()throwsException{ }}classClsSubextendsClsSuper{ @Override publicvoidshow(){ //語(yǔ)法合法 }
publicvoidshow()throwIOException{ //語(yǔ)法非法,多于父類的異常列表 }}8、阻止繼承與final修飾符號(hào)除了防止方法被覆蓋,Java還引入了防止繼承的語(yǔ)法機(jī)制:在class前加final修飾符。finalclassClsSuper{ //classClsSuper不能再被繼承。 publicvoidshow(){ }}9、類型轉(zhuǎn)換-1從前面的語(yǔ)法知道,把子類類型的對(duì)象賦值給父類類型的對(duì)象是合法的,類型是自動(dòng)轉(zhuǎn)換的。這種轉(zhuǎn)換是合理的。因?yàn)轭愋娃D(zhuǎn)換實(shí)際的作用是改變了對(duì)象空間的訪問(wèn)范圍。子類對(duì)象的訪問(wèn)范圍大于父類類型的范圍。子類類型的對(duì)象賦值給父類類型的對(duì)象,只是從大的范圍限制在小的范圍。當(dāng)從父類類型的對(duì)象賦值給子類類型的對(duì)象,等同于從小范圍擴(kuò)大訪問(wèn)范圍,擴(kuò)大的部分空間可能是合法,也可能不合法,所以父類對(duì)象賦值給子類對(duì)象是不允許的。但如果程序員確保擴(kuò)大的空間是合法的,想轉(zhuǎn)換對(duì)象的類型,Java也提供語(yǔ)法進(jìn)行把父類類型的對(duì)象轉(zhuǎn)換為子類類型的對(duì)象。
2030m_am_aClsSuperClsSub9、類型轉(zhuǎn)換-2強(qiáng)制類型轉(zhuǎn)換使用強(qiáng)制類型轉(zhuǎn)換,可以把父類類型對(duì)象轉(zhuǎn)換以后賦值給子類類型對(duì)象,但實(shí)際程序運(yùn)行的時(shí)候可能訪問(wèn)不到可能不存在的擴(kuò)展空間,這樣導(dǎo)致錯(cuò)誤。所以建議在對(duì)象強(qiáng)制轉(zhuǎn)換前,先判定他的真正類型后再轉(zhuǎn)換。ClsSupero1=newClsSuper(); //合法
ClsSubo2=newClsSub(); //合法ClsSupero3=newClsSub(); //合法ClsSubo4=newClsSuper(); //非法ClsSubo5=o1; //非法ClsSubo6=(ClsSub)o1; //合法,但實(shí)際對(duì)o1擴(kuò)大訪問(wèn)范圍的空間不存在
if(o1instanceofClsSub){
ClsSubo6=(ClsSub)o1;}else{ System.out.println(“不能轉(zhuǎn)換”);}10、類型裝箱與解箱在JDK1.5以后的版本中,Java語(yǔ)法中還引入了基本類型與Wrap類型之間的裝箱(Box)與解箱(UnBox)的語(yǔ)法。傳統(tǒng)方式裝箱/解箱方式Integeri=newInteger(“2000”);intj=Value();Integeri=2000; //自動(dòng)裝箱
intj=i; //自動(dòng)解箱11、protected修飾符號(hào)修飾符protected是專門(mén)爭(zhēng)對(duì)父子繼承類之間的訪問(wèn)限制的。使用protected修飾的成員,在類塊外,只能由子類訪問(wèn):不管是直接訪問(wèn),還是使用對(duì)象訪問(wèn)。注意:子類包含子類的子類都可以訪問(wèn)。第03節(jié)根父類:Object類
知識(shí)點(diǎn)預(yù)覽#節(jié)知識(shí)點(diǎn)難點(diǎn)重點(diǎn)應(yīng)用3CORE-C04-03根父類:Object類1、認(rèn)識(shí)Object類
√√2、equals方法使用與繼承
√√3、HashCode方法使用與繼承
√√4、toString方法使用與繼承
√√1、認(rèn)識(shí)Object類不管繼承或者不繼承,在Java中所有的類都繼承自O(shè)bject的類。Object類提供一個(gè)缺省構(gòu)造器。提供一組基本方法。classClsSuper{ publicvoidshow(){ }}ClsSuperobj=newClsSuper();System.out.println(obj.toString()); //toString方法來(lái)自O(shè)bject類。protectedObjectclone() //克隆booleanequals(Objectobj) //相等判定protectedvoidfinalize() //析構(gòu)回調(diào)Class<?>getClass() //返回運(yùn)行時(shí)類型inthashCode() //返回對(duì)象的hash碼voidnotify() //喚醒當(dāng)前對(duì)象監(jiān)視的等待線程voidnotifyAll() //喚醒當(dāng)前對(duì)象監(jiān)視的所有的等待線程StringtoString() //把對(duì)象轉(zhuǎn)換為字符串,println打印對(duì)象會(huì)自動(dòng)調(diào)用voidwait() //讓當(dāng)前線程等待voidwait(longtimeout) //讓當(dāng)前線程等待timeout毫秒voidwait(longtimeout,intnanos)//讓當(dāng)前線程等待timeout毫秒+納秒2、equals方法使用與繼承對(duì)象相等的判定使用==只能判定兩個(gè)對(duì)象是否使用同一空間。無(wú)法判定兩個(gè)對(duì)象的內(nèi)容是否相等。Object提供equals方法用來(lái)判定兩個(gè)對(duì)象的內(nèi)容是否相等。equals默認(rèn)的是判定對(duì)象的空間地址相等??梢詏verride該方法來(lái)實(shí)現(xiàn)定制的相等判定規(guī)則。classClsSuper{ privateintm_score=20; booleanequals(Objectobj){ if(objinstanceofClsSuper){ ClsSupero=(ClsSuper)obj; if(o.m_score==this.m_score){//o.m_score可以訪問(wèn)私有成員 returntrue;//對(duì)象的分?jǐn)?shù)相等,則對(duì)象等 } else{ returnfalse;//對(duì)象的分?jǐn)?shù)不等,則對(duì)象不等。 } } else{ returnfalse; //類型不同,直接返回不等 } } }3、hashCode方法使用與繼承hashCode()方法的作用:一般的地方不需要重載hashCode,只有當(dāng)類需要放在HashTable、HashMap、HashSet等等hash結(jié)構(gòu)的集合時(shí)才會(huì)重載hashCode。規(guī)則:如果hashCode在equals方法中不提供比較信息,則最好保持返回值不變。一般不要求hashCode的值是不變的。如果兩個(gè)對(duì)象通過(guò)equals判定相等,則hashCode返回值必須相等。如果兩個(gè)對(duì)象通過(guò)equals判定不相等,而hashCode可以返回相等的值。但equ
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度國(guó)際教育項(xiàng)目全新留學(xué)合同
- 2025年度員工股權(quán)激勵(lì)計(jì)劃實(shí)施協(xié)議書(shū)
- 2025年度文化創(chuàng)意公司兼職聘用員工合同
- 2025年度一手房帶家具家電裝修包購(gòu)服務(wù)協(xié)議
- 2025年度中式餐廳轉(zhuǎn)讓及品牌推廣合同
- 醫(yī)院裝修監(jiān)理合作協(xié)議
- 2025年度出租房屋裝修工程結(jié)算及租賃服務(wù)協(xié)議
- 2025年度安全生產(chǎn)達(dá)標(biāo)廠房租賃服務(wù)合同
- 2025年度健身機(jī)構(gòu)教練職務(wù)聘用協(xié)議
- 2025年度商鋪物業(yè)管理與社區(qū)文化活動(dòng)合作協(xié)議
- 教練技術(shù)一階段講義(共59頁(yè))
- 第3章-系統(tǒng)模型與模型化
- 精品課程建設(shè)驗(yàn)收自評(píng)報(bào)告
- 福建省義務(wù)教育課程設(shè)置及比例(修訂)
- 一年級(jí)上冊(cè)生字卡片帶拼音組詞可打印01637
- 未成年人需辦銀行卡證明(模板)
- 建設(shè)項(xiàng)目職業(yè)病防護(hù)設(shè)施設(shè)計(jì)專篇編制導(dǎo)則
- 員工考勤流程圖
- 出口加工區(qū)外匯管理培訓(xùn)(ppt49)
- 初中學(xué)生綜合素質(zhì)評(píng)價(jià)填寫(xiě)示例
- 國(guó)家開(kāi)放大學(xué)(湖南)
評(píng)論
0/150
提交評(píng)論