Java程序設(shè)計@第04章-繼承_第1頁
Java程序設(shè)計@第04章-繼承_第2頁
Java程序設(shè)計@第04章-繼承_第3頁
Java程序設(shè)計@第04章-繼承_第4頁
Java程序設(shè)計@第04章-繼承_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Java程序設(shè)計第04章繼承本章內(nèi)容CORE-C04-01類、父類與抽象CORE-C04-02類、子類與繼承

CORE-C04-03根父類:Object類

CORE-C04-04繼承設(shè)計與應(yīng)用本章目標(biāo)1、實現(xiàn)類的繼承。2、能熟練使用Object中方法

第01節(jié)類、父類與抽象知識點預(yù)覽#節(jié)知識點難點重點應(yīng)用1CORE-C04-01類、父類與抽象1、類的共性抽象√√

2、類的層次結(jié)構(gòu)√√

1、類的共性抽象面向?qū)ο蟮囊霑峁┸浖椖繉崿F(xiàn)的穩(wěn)定性,穩(wěn)定性的一個重要方面是軟件項目模塊可復(fù)用與擴展。Java提供繼承的語法機制類實現(xiàn)模塊的復(fù)用與擴展、升級。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é)類、子類與繼承

知識點預(yù)覽#節(jié)知識點難點重點應(yīng)用2CORE-C04-02類、子類與繼承1、類的擴展

√√2、類的繼承語法

√√3、子類對象實例化與構(gòu)造器

√√4、super

√√5、覆蓋與多態(tài)

√√6、覆蓋與修飾符號

√√7、覆蓋與異常轉(zhuǎn)移√√√8、阻止繼承與final修飾符號

√√9、類型轉(zhuǎn)換

√√10、類型裝箱與解箱

√√11、protected修飾符號

√√1、類的擴展子類與父類的關(guān)系:子類比起父類就是成員更加豐富:成員變量增加(擴展)。處理成員變量的成員方法增加(擴展)。class父類{ //成員變量 //成員方法}class子類{ //這樣也可以描述子類 //父類成員變量 //父類成員方法 //擴展的成員變量 //擴展的成員方法}子類的描述方法明顯兩個缺點:1、描述重復(fù)。2、從代碼無法反映父子關(guān)系。2、類的繼承語法-1類擴展(繼承)的語法機制class子類extends父類{ //擴展的成員變量 //構(gòu)造方法 //擴展的成員方法}class父類{ //成員變量 //成員方法}class子類extends父類{ //擴展的成員變量 //擴展的成員方法}子類的描述方法明顯解決了缺點:1、描述不重復(fù)。2、體現(xiàn)父子關(guān)系。2、類的繼承語法-2子類對象也可以訪問父類中的成員。classClsSuper{ publicintm_a=20; publicvoidshow(){ System.out.printf("m_a=%d\n",m_a); }}classClsSubextendsClsSuper{ publicintm_b=30; publicvoidprint(inta){

//使用父類成員變量像自己的成員變量一樣,不需要通過方法(對成員方法亦然) 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); //訪問父類的成員變量System.out.println(objsub.m_b);objsub.show(); //訪問父類的成員方法objsub.print(999);2、類的繼承語法-3子類對象的類型:依據(jù)常規(guī)白馬是馬的邏輯思路,子類對象肯定是父類型。在Java的語法規(guī)則上:可以把子類類型的對象賦值給父類類型的對象。依據(jù)馬不一定是白馬的邏輯思路,父類對象不一定是子類類型。在Java的語法規(guī)則上:不能把父類對象賦值給子類對象。classClsSubextendsClsSuper{ //ClsSuper是ClsSub的子類}

ClsSubsub=null;ClsSupersup=newClsSuper(); sub=sup; //語法錯誤sub=newClsSuper(); //語法錯誤sup=sub; //語法正確

2、類的繼承語法-4子類對父類的擴展有幾個重點必須清楚:盡管子類擴展父類,但子類與父類屬于不同的類塊,作用域不同,遵循不同作用域規(guī)則。子類的成員變量可以與父類的成員變量重名。子類的成員方法可以與父類的成員方法重名,甚至參數(shù)類型、順序、個數(shù)都完全相同。classClsSuper{ publicintm_a=20; publicvoidshow(inta){ }}classClsSubextendsClsSuper{ publicintm_a=30; publicvoidshow(inta){ }}成員變量在父子類中重名的解決規(guī)則與成員方法是不同的2、類的繼承語法-4子類的成員變量與父類的成員變量重名的訪問規(guī)則:當(dāng)使用對象訪問,根據(jù)對象的申明類型來確認:對象申明為父類型,就訪問父類中成員變量,聲明為子類類型就訪問子類中成員變量。子類中沒有,就到父類中查找成員變量并訪問。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、子類對象實例化與構(gòu)造器-1子類與父類是屬于兩個不同的塊,也就是屬于兩個不同的作用域,作用域不同也意味著內(nèi)存存儲區(qū)域的差異。子類對象的空間分配也是分成兩個部分:父類內(nèi)存空間,子類內(nèi)存空間。2030m_am_aClsSuperClsSubClsSupero2=newClsSub();System.out.println(o2.m_a); //ClsSuper中成員。

o2對象實際是訪問位置

對象決定訪問的開始位置,

類型決定訪問的范圍。3、子類對象實例化與構(gòu)造器-2當(dāng)子類擴展父類,子類對象可以訪問父類的成員,但其中有一個必須要注意:父類的構(gòu)造器不能初始化子類成員,子類構(gòu)造器不能初始化父類成員。子類與父類的成員都是由自己的構(gòu)造器完成初始化。子類對象化的時候,首先判定是否有父類,沒有父類就直接調(diào)用構(gòu)造器完成成員變量初始化。有則調(diào)用父類構(gòu)造器完成父類成員變量的初始化,然后調(diào)用子類構(gòu)造器初始化子類成員變量。不管父子類,他們的成員都使用自己的構(gòu)造器來初始化自己的成員變量。子類的構(gòu)造器不能初始化父類的成員,父類構(gòu)造器不能初始化子類的成員。當(dāng)子類初始化的時候,會調(diào)用父類構(gòu)造器,但由于構(gòu)造器重載,Java引入如下語法規(guī)則:當(dāng)子類初始化的時候,默認調(diào)用父類的缺省構(gòu)造器。但也可以指定構(gòu)造器類初始化父類成員變量。3、子類對象實例化與構(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、子類對象實例化與構(gòu)造器-4當(dāng)把子類對象賦值給父類對象,最后導(dǎo)致真正的類型無法確認。Java提供專門的語法來識別對象的真正類型。

對象instanceof類型ClsSupero2=newClsSub();if(o2instanceofClsSub){System.out.println(“o2是ClsSub類型”);}4、super關(guān)鍵字super除了當(dāng)成構(gòu)造器使用外,還可以作為作用域使用:當(dāng)父類成員與子類成員沖突的時候,使用[super.成員]可以區(qū)分是父類中成員,不加super前綴或者加this前綴表示是當(dāng)前類成員。當(dāng)父類、子類成員不沖突的時候,不需要super前綴。注意:super作為構(gòu)造器使用,必須放在構(gòu)造器中,而且必須是第一行。super作為作用域使用,可以在構(gòu)造器,也可以在成員方法內(nèi)使用,可以放在任意行。5、覆蓋與多態(tài)-1父類與子類的成員方法重名,沖突分成兩種情況:在類內(nèi)部不通過對象使用??梢允褂胻his,super關(guān)鍵字區(qū)分。通過對象使用。Java語法的默認規(guī)則是:不管對象是什么類型,調(diào)用的方法都是new后構(gòu)造器所在類的方法。(與對象的表現(xiàn)類型無關(guān)),稱為覆蓋(Override)classClsSuper{ publicvoidshow(){ }}classClsSubextendsClsSuper{ publicvoidshow(){ }}ClsSuperobjsuper=newClsSub();objsuper.show();先確認對象的實際類型。再確認類所在的方法,并調(diào)用。5、覆蓋與多態(tài)-2Java提供的Override語法對程序的穩(wěn)定結(jié)構(gòu)有非常重要的作用。classClsSuper{ publicvoidshow(){ }}classClsSub1extendsClsSuper{ publicvoidshow(){ //實現(xiàn)1 }}classClsSub2extendsClsSuper{ publicvoidshow(){ //實現(xiàn)2 }}classMain{ publicstaticvoidmain(String[]args){ ClsSuperobj=newClsSub1(); //表現(xiàn)類型ClsSuper實際類型ClsSub1 call(obj); //call內(nèi)部的調(diào)用因?qū)ο蟛煌煌?} //稱為多態(tài)(一個方法多種實現(xiàn)) publicstaticvoidcall(ClsSuperobj){ obj.show(); }}6、覆蓋與修飾符號-1為了防止方法被覆蓋,可以使用修飾符final。使用final修飾的方法是不能被覆蓋的。為了防止覆蓋方法因拼寫原因,而沒有覆蓋,可以使用標(biāo)注修飾讓編譯器做語法檢測。@Override。 //注意區(qū)分大小寫。

classClsSuper{ publicvoidshow(){ }}classClsSubextendsClsSuper{ @Override //如果show方法與父類不一樣,會報編譯錯誤。 publicvoidshow(){ } public@Overridevoidshow(){ //@Override作為修飾符,與其他修飾符不分先后。 }}6、覆蓋與修飾符號-2在override語法中,子類中的override方法的修飾符功能弱于父類中的方法。修飾符的強弱按照如下順序排列:public

缺省 (什么修飾符都不要)protectedprivate7、覆蓋與異常轉(zhuǎn)移覆蓋的異常列表在設(shè)計上是希望逐步處理,所以子類的override方法的異常列表中的異常類不能多于父類的異常列表中的異常類型。classClsSuper{ publicvoidshow()throwsException{ }}classClsSubextendsClsSuper{ @Override publicvoidshow(){ //語法合法 }

publicvoidshow()throwIOException{ //語法非法,多于父類的異常列表 }}8、阻止繼承與final修飾符號除了防止方法被覆蓋,Java還引入了防止繼承的語法機制:在class前加final修飾符。finalclassClsSuper{ //classClsSuper不能再被繼承。 publicvoidshow(){ }}9、類型轉(zhuǎn)換-1從前面的語法知道,把子類類型的對象賦值給父類類型的對象是合法的,類型是自動轉(zhuǎn)換的。這種轉(zhuǎn)換是合理的。因為類型轉(zhuǎn)換實際的作用是改變了對象空間的訪問范圍。子類對象的訪問范圍大于父類類型的范圍。子類類型的對象賦值給父類類型的對象,只是從大的范圍限制在小的范圍。當(dāng)從父類類型的對象賦值給子類類型的對象,等同于從小范圍擴大訪問范圍,擴大的部分空間可能是合法,也可能不合法,所以父類對象賦值給子類對象是不允許的。但如果程序員確保擴大的空間是合法的,想轉(zhuǎn)換對象的類型,Java也提供語法進行把父類類型的對象轉(zhuǎn)換為子類類型的對象。

2030m_am_aClsSuperClsSub9、類型轉(zhuǎn)換-2強制類型轉(zhuǎn)換使用強制類型轉(zhuǎn)換,可以把父類類型對象轉(zhuǎn)換以后賦值給子類類型對象,但實際程序運行的時候可能訪問不到可能不存在的擴展空間,這樣導(dǎo)致錯誤。所以建議在對象強制轉(zhuǎn)換前,先判定他的真正類型后再轉(zhuǎn)換。ClsSupero1=newClsSuper(); //合法

ClsSubo2=newClsSub(); //合法ClsSupero3=newClsSub(); //合法ClsSubo4=newClsSuper(); //非法ClsSubo5=o1; //非法ClsSubo6=(ClsSub)o1; //合法,但實際對o1擴大訪問范圍的空間不存在

if(o1instanceofClsSub){

ClsSubo6=(ClsSub)o1;}else{ System.out.println(“不能轉(zhuǎn)換”);}10、類型裝箱與解箱在JDK1.5以后的版本中,Java語法中還引入了基本類型與Wrap類型之間的裝箱(Box)與解箱(UnBox)的語法。傳統(tǒng)方式裝箱/解箱方式Integeri=newInteger(“2000”);intj=Value();Integeri=2000; //自動裝箱

intj=i; //自動解箱11、protected修飾符號修飾符protected是專門爭對父子繼承類之間的訪問限制的。使用protected修飾的成員,在類塊外,只能由子類訪問:不管是直接訪問,還是使用對象訪問。注意:子類包含子類的子類都可以訪問。第03節(jié)根父類:Object類

知識點預(yù)覽#節(jié)知識點難點重點應(yīng)用3CORE-C04-03根父類:Object類1、認識Object類

√√2、equals方法使用與繼承

√√3、HashCode方法使用與繼承

√√4、toString方法使用與繼承

√√1、認識Object類不管繼承或者不繼承,在Java中所有的類都繼承自O(shè)bject的類。Object類提供一個缺省構(gòu)造器。提供一組基本方法。classClsSuper{ publicvoidshow(){ }}ClsSuperobj=newClsSuper();System.out.println(obj.toString()); //toString方法來自O(shè)bject類。protectedObjectclone() //克隆booleanequals(Objectobj) //相等判定protectedvoidfinalize() //析構(gòu)回調(diào)Class<?>getClass() //返回運行時類型inthashCode() //返回對象的hash碼voidnotify() //喚醒當(dāng)前對象監(jiān)視的等待線程voidnotifyAll() //喚醒當(dāng)前對象監(jiān)視的所有的等待線程StringtoString() //把對象轉(zhuǎn)換為字符串,println打印對象會自動調(diào)用voidwait() //讓當(dāng)前線程等待voidwait(longtimeout) //讓當(dāng)前線程等待timeout毫秒voidwait(longtimeout,intnanos)//讓當(dāng)前線程等待timeout毫秒+納秒2、equals方法使用與繼承對象相等的判定使用==只能判定兩個對象是否使用同一空間。無法判定兩個對象的內(nèi)容是否相等。Object提供equals方法用來判定兩個對象的內(nèi)容是否相等。equals默認的是判定對象的空間地址相等。可以override該方法來實現(xiàn)定制的相等判定規(guī)則。classClsSuper{ privateintm_score=20; booleanequals(Objectobj){ if(objinstanceofClsSuper){ ClsSupero=(ClsSuper)obj; if(o.m_score==this.m_score){//o.m_score可以訪問私有成員 returntrue;//對象的分數(shù)相等,則對象等 } else{ returnfalse;//對象的分數(shù)不等,則對象不等。 } } else{ returnfalse; //類型不同,直接返回不等 } } }3、hashCode方法使用與繼承hashCode()方法的作用:一般的地方不需要重載hashCode,只有當(dāng)類需要放在HashTable、HashMap、HashSet等等hash結(jié)構(gòu)的集合時才會重載hashCode。規(guī)則:如果hashCode在equals方法中不提供比較信息,則最好保持返回值不變。一般不要求hashCode的值是不變的。如果兩個對象通過equals判定相等,則hashCode返回值必須相等。如果兩個對象通過equals判定不相等,而hashCode可以返回相等的值。但equ

溫馨提示

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

最新文檔

評論

0/150

提交評論