版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第六章
Java的繼承
繼承的概念
繼承的實現(xiàn)變量隱藏與方法覆蓋super關鍵字子類的構造順序
final關鍵字
回憶:為什么要使用封裝下面代碼有什么問題?如何解決上面設計的缺陷?Dogd=newDog();d.age=1000;不合理的賦值
使用封裝
回憶:什么是封裝面向對象三大特征之一——封裝封裝的概念封裝的好處封裝:將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現(xiàn)對隱藏信息的操作和訪問
隱藏類的實現(xiàn)細節(jié)只能通過規(guī)定方法訪問數(shù)據(jù)方便參加控制語句方便修改實現(xiàn)回憶及提問構造方法的語法要求是什么?static和final的含義是什么?請畫出下面Dog類的類圖?;貞洠侯悎D使用類圖描述類用于分析和設計“類”直觀、容易理解-name:String-health:int-love:int+strain:StringDog+print():void“+”:public“-”:private“#”:protected·類名返回值類型類型屬性名參數(shù):名字:類型,名字:類型方法名為什么使用繼承?這兩個類圖有什么問題?-name:String-health:int-love:int-strain:StringDog+print():void+getName():String+getHealth
():int+getLove():int+getStrain:String+Dog()-name:String-health:int-love:int-sex:StringPenguin+print():void+getName():String+getHealth
():int+getLove():int+getSex():String+Penguin()使用繼承優(yōu)化設計將重復代碼抽取到父類中為什么使用繼承?使用繼承優(yōu)化后:子類與父類是is-a關系,即小類是大類中的一種是繼承的根底減少代碼量方便修改代碼
現(xiàn)欲定義人(Person)類和學生(Student)類,擬設立如下的屬性、方法:Person-name:String-age:int-sex:String+setName(String):void+getName():String+setAge(int):void+getAge():int+setSex(String):void+getSex():String+toString():StringStudent-name:String-age:int-sex:String-school:String//新增,下同+setName(String):void+getName():String+setAge(int):void+getAge():int+setSex(String):void+getSex():String+toString():String//功能要增強+setSchool(String):void+getSchool():String 問題:Student類的很多屬性、方法與Person類相同,新增的局部較少。在已聲明Person類的情況下,定義Student類時是否需要將其所有屬性、方法寫一次?有無簡便方法可用? 答復是肯定的,我們可以讓Student類繼承Person類。這樣,Student類就可以利用Person已有屬性、方法,定義時只要增加新的屬性與方法即可。Person-name:String-age:int-sex:String+setName(String):void+getName():String+setAge(int):void+getAge():int+setSex(String):void+getSex():String+toString():StringStudent-school:String//新增,下同+toString():String//功能要增強+setSchool(String):void+getSchool():String
從上可知,引入“繼承”機制后,可以充分利用已有的“舊類”的屬性、方法,簡化“新類”的設計。繼承繼承的概念:概念:是指在已存在的類的根底上擴展產生新的類。 已存在的類稱為父類(或基類、超類),新產生的類稱為子類(或派生類)。上面提到的Person類就是父類,Student類是子類。 子類繼承了父類,它擁有父類的所有特性(除構造方法不被繼承外),當然也可以向子類添加新的屬性、方法,或改寫父類原有方法,這些新變化的內容僅僅屬于子類所有。意義:繼承是面向對象程序設計最重要的特征之一,是實現(xiàn)代碼重用、擴展軟件功能的重要手段。 父類:更一般、更泛化 子類:更具體、更細化類的層次性: 下面以Java類庫中的一些類繼承關系說明如下:繼承關系 一個類的子類可以是另一個類的父類,由繼承關系可以形成類的層次性。繼承的實現(xiàn)類的繼承格式: class子類名extends
父類名{
//新增屬性、方法,或改寫父類原有方法 }例如:classBextendsA{ …… }又如:classStudentextendsPerson{ …… }
父類(或基類、超類)子類(或派生類)說明:如果沒有用extends指明父類,那么默認繼承Object根類,Object類是所有類的直接父類或間接父類,有關Object類的內容稍后介紹;Java只支持單一繼承,不允許多重繼承,即:一個子類只能有一個父類一個父類可以派生出多個子類PersonStudentSoldierOfficerGraduate采用繼承機制后,簡化了類的設計:只要寫子類中不同父類的內容(即新增屬性、方法,或改寫父類原有方法)//B類繼承A類classA{ //父類 intx=10; publicvoidsetX(intx){ this.x=x; } publicintgetX(){ returnx; } publicStringtoString(){ Stringinformation=""; information=information+"x="+x+"\n"; returninformation; } }classBextendsA{ //子類繼承父類 inty=100; //子類新增屬性 publicvoidsetY(inty){ //子類新增方法 this.y=y; } publicintgetY(){ //子類新增方法 returny; } publicStringtoString(){ //子類改寫父類方法
Stringinformation=""; information=information+"x="+x+"\n";
information=information+"y="+y+"\n"; returninformation; } }publicclassInheritTest{ publicstaticvoidmain(Stringargs[]){ Aa=newA(); Bb=newB(); System.out.println(a.toString()); System.out.println(b.toString()); }}程序運行結果:x=10x=10y=100變量隱藏與方法覆蓋 通過前面的介紹,我們已經知道:子類繼承了父類的所有成員(變量和方法,除構造方法外)(注意:由于訪問權限的限制,并不意味著父類的所有變量、方法都可以在子類中直接使用);子類還可以根據(jù)需要,增加自己的變量和方法; 除此之外,我們還可以對父類已有變量、方法進行隱藏、覆蓋。Java允許在子類定義與父類同名(類型可以不同)的變量,在子類中直接使用這一變量名時,訪問的是子類定義的變量,而父類同名的變量那么被隱藏起來,這稱為變量的隱藏。Java還允許在子類中對父類原有的方法進行重寫,以實現(xiàn)新的功能。 所謂方法覆蓋,是指在子類中重新定義一個方法的內容,該方法與父類的某一方法在方法名、參數(shù)(包括類型、個數(shù)、次序)、返回值類型
完全相同。 當子類對象中調用這一方法時,調用的是子類改寫過的方法,而父類中的原有方法被覆蓋。
方法重寫必須滿足如下要求:重寫方法和被重寫方法必須具有相同的方法名;重寫方法和被重寫方法必須具有相同的參數(shù)列表;重寫方法的返回值類型必須和被重寫方法的返回值類型相同或者是其子類;重寫方法的不能縮小被重寫方法的訪問權限。子類方法不能拋出比父類方法更多的異常。例如:在前面的B類中已改寫了toString()方法的內容(即方法覆蓋),使之能夠輸出y的值?,F(xiàn)在,在B類中再增加一個double型的變量x,這樣父類中的整型變量x就被隱藏,在toString()訪問的是子類的值。 主要代碼如下:publicclassCircleextendsPoint{publicintx,y,radius;
publicStringtoString(){…}
publicStringtoString(intx,inty,intradius){…}}publicclassPoint{ publicintx,y; publicStringtoString(){…} }變量的隱藏方法的覆蓋方法的重載下面的例子演示了變量隱藏與方法覆蓋的使用方式。//B類繼承A類classA{ //父類 intx=10;//被隱藏的變量 publicvoidsetX(intx){ this.x=x; } publicintgetX(){ returnx; } publicStringtoString(){//被覆蓋的方法 Stringinformation=""; information=information+"x="+x+"\n"; returninformation; } }//父類代碼與前面相同,這里省略不寫classBextendsA{ //子類繼承父類
doublex=-12.345 //變量隱藏
inty=100; //子類新增屬性 publicvoidsetY(inty){ //子類新增方法 this.y=y; } publicintgetY(){ //子類新增方法 returny; }
publicStringtoString(){ //子類改寫父類方法,即方法覆蓋 Stringinformation=""; information=information+"x="+x+"\n";
information=information+"y="+y+"\n"; returninformation; } }publicclassInheritTest{ publicstaticvoidmain(Stringargs[]){ Aa=newA(); Bb=newB(); System.out.println(a.toString()); System.out.println(b.toString()); }}程序運行結果:x=10x=-12.345y=100 變量隱藏容易引用變量的使用混亂,不贊成使用,而方法覆蓋那么是大量使用,應掌握其內容。(問題:方法覆蓋與方法重載區(qū)別是什么?)方法覆蓋與方法重載的異同相同點:都要求方法同名都可以于于抽象方法和非抽象方法之間不同點:方法覆蓋要求參數(shù)簽名必須一致,而方法重載要求參數(shù)簽名必須不一致。方法覆蓋要求返回類型必須一致,而方法重載不做限制。方法覆蓋只能用于子類覆蓋父類的方法,方法重載用于同一個類的所有方法〔包括從父類中繼承而來的方法〕。方法覆蓋對方法的訪問權限和拋出的異常有特殊的要求,而方法重載沒有限制。父類的一個方法只能被子類覆蓋一次,而一個方法所在的類中可以被屢次重載super關鍵字
如果要訪問父類的隱藏變量、覆蓋方法(需要有相應的訪問權限),這該怎樣辦呢? 答案是使用super關鍵字,下面介紹該關鍵字的用法:Super可用來引用父類的成分,它有兩種主要用法:引用父類的成員(需要相應的訪問權限):
super.變量或 super.方法([參數(shù)列])在子類構造方法中調用父類的構造方法:
super([…]);//與this用法類似,應放在構造方法的第一行位置上。 還是以前面的B類繼承A類為例說明如下:子類的構造順序
下面通過一個例子來說明子類的構造順序:classA{ publicA(){ System.out.println("調用了A類的構造方法"); }
}classBextendsA{
publicB(){ System.out.println("調用了B類的構造方法"); } }publicclassCextendsB{
publicC(){ System.out.println("調用了C類的構造方法"); } publicstaticvoidmain(Stringargs[]){ Cc=newC(); }}程序運行結果:調用了A類的構造方法調用了B類的構造方法調用了C類的構造方法 從上可以看出:在構造子類的對象時,編譯器會一直上溯到最初類,執(zhí)行該類構造方法,然后依次執(zhí)行各子類構造函數(shù),即以:A->B->C順序來初始化子對象各局部。子類的構造方法:作用:用來完成對該類中的所有變量(即屬性)進行初始化,子類中的變量包含從父類繼承下來的變量和自己新增加的變量;分工:各類只負責在該中新增變量的初始化工作,職責清楚,不可助“類”為樂”,也即說:父類構造方法負責父類中增加變量的初紿化工作,子類構造方法負責子類中新增變量的初紿化工作;父類變量的初始化工作子類新增變量的初始化工作父類的構造方法子類的構造方法內容:在子類的構造方法中可以用super關鍵字來調用父類的構造方法,格式如下: 如果在子類中未顯式調用父類構造方法,那么編譯器會自動調用父類的默認構造方法,假假設父類沒有提供默認構造方法,編譯時將出錯。子類構造方法([參數(shù)表]){super([父類構造方法參數(shù)]);//調用父類構造方法 其它;//對本類新增變量進行初始化或進行其它處理}執(zhí)行順序:先執(zhí)行父類構造方法,再執(zhí)行子類構造方法。在多層繼承層時,編譯器會一直上溯到最初類,再從“上”到“下”依次執(zhí)行。教師演示:constructortest.java繼承條件下構造方法的調用規(guī)那么如下:
如果子類的構造方法中沒有通過super顯式調用父類的有參構造方法,也沒有通過this顯式調用自身的其他構造方法,那么系統(tǒng)會默認先調用父類的無參構造方法。在這種情況下,寫不寫“super();”語句,效果是一樣的。如果子類的構造方法中通過super顯式調用父類的有參構造方法,那將執(zhí)行父類相應構造方法,而不執(zhí)行父類無參構造方法。如果子類的構造方法中通過this顯式調用自身的其他構造方法,在相應構造方法中應用以上兩條規(guī)那么。特別注意的是,如果存在多級繼承關系,在創(chuàng)立一個子類對象時,以上規(guī)那么會屢次向更高一級父類應用,一直到執(zhí)行頂級父類Object類的無參構造方法為止。訪問權限 通過繼承,子類能夠獲得父類中除構造方法以外的所有變量和方法,但并不意味著子類可以調用父類的這些變量、方法,這要受到訪問權限的限制。//private權限類classPerson{
privateStringname=""; //私有訪問權限
privateintage=0; publicPerson(Stringname,intage){ =name; this.age=age; } publicStringgetName(){ returnname; } publicintgetAge(){ returnage; }}classStudentextendsPerson{ publicStudent(Stringname,intage){ super(name,age); } publicStringtoString(){ Stringstr=""; str=str+"姓名:"+name; str=str+",年齡:"+age; returnstr; }}publicclassPrivateTest{ publicstaticvoidmain(Stringargs[]){ Studentwang=newStudent("王小麗",20); System.out.println(wang.toString()); }}22:name可以在Person中訪問privatestr=str+"姓名:"+name;^F:\javaI__2006\ppt\15\code\private權限\PrivateTest.java:23:age可以在Person中訪問privatestr=str+",年齡:"+age;^2錯誤 這是因為name、age兩個變量是private權限,不允許子類直接訪問。假設調用public權限的getName()、getAge(),那么問題可以迎刃而解。訪問權限 Java中控制變量、方法的訪問權限有四種:public:公有權限,這是訪問限制最寬的修飾符,所修飾的成員可被所有類訪問,實現(xiàn)跨類、跨包訪問目的,類的成員方法一般都設置為public權限; private:私有權限,這是訪問限制最嚴的修飾符,所修飾的成員只能在同一類中訪問,不允許被其它任何類(包括子類)訪問,類的成員變量一般都設置為private權限;protected:受保護權限,這是一種權限介于public、private之間的修飾符,它允許被同一包中的類和該類的子類(可位于不同包中)訪問,不要誤認為這一權限的保護就很嚴格,實際上,完全可以通過子類來到達訪問父類成員的目的。較少使用。Friendly:包權限如果不加任何權限修飾符,就認為是包權限,也稱為默認(缺省)或友好權限,它允許被同一包中的類訪問,不允許被其它包的類訪問。 根據(jù)是否在同一類、是否為子類、是否在同一個包中,可以劃分為五種類型歸納如下:publicprotectedfriendly默認private同一類中是否可見是是是是對同一包中的子類是否可見是是是否對同一包中的非子類是否可見是是是否對不同包中的子類是否可見是是否否對不同包中的非子類是否可見是否否否 訪問權限從高到低排序:public、protected、包的(即默認的)、private例子:Myclass:父類DerivedSamePackage:同一包中子類UnrelatedSamePackage:同一包中非子類DerivedDifferentPackage:不同包中的子類UnrelatedDifferentSamePackage:不同包中的非子類MainPack1:使用同一包中的類MainPack2:使用不同包中的類 具體代碼見訪問權限例子對象的類型轉換對象類型的轉換與根本數(shù)據(jù)類型相似,有兩種方式:子類轉換成父類:稱為向上轉型,即: 父類對象句柄=子類對象 這種轉換是允許的,且自動進行。 在前面的Person、Student類的根底上,有: Personman=newStudent(“張一山”,14); 這容易理解,由于繼承的子類和父類關系是“is-a”關系,也即是說,子類是父類中的一種(一個學生也是一個人)。 由于Object類是所有類的直接或間接父類,故有: Object對象名=任何類的對象對象新增的變量新增的方法繼承或隱蔽的變量繼承或覆蓋的方法對象的上轉型對象 說明:向上轉型對象不能操作子類新的成員變量(失掉一局部屬性),也不能使用子類新增的成員方法(失掉一局部功能)。父類轉換成子類: 子類對象句柄=父類對象; //這是錯誤的寫法,因為這種轉換不會自動進行,
如果一定要將父類轉換成子類,那么要強制轉換,即:子類對象句柄=(子類名)父類對象; 當然這種轉換要有意義,不能僅僅是為了騙守編譯器,而實際讀寫內容錯誤。 例如:
Personman=newStudent(“張一山”,14); Studentst1=man; //錯誤
Studentst2=(Student)man; //正確final關鍵字阻止類的繼承阻止方法的重寫創(chuàng)立常量final關鍵字的用法
類不希望再被其他類繼承?使用final類方法不希望被重寫?使用final方法屬性值不希望被修改?使用final方法publicfinalclassPenguinextendsPet{//…}最終版的類publicfinalvoidprint(){//…}最終版的方法publicclassPenguin{finalStringhome="南極";//居住地
publicvoidsetHome(Stringname){this.home=home;//錯誤,home不可以再次賦值}}最終版的屬性值本講小結繼承的概念:引例
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度專業(yè)牧場代牧服務標準合同4篇
- 2025年度臨時停車場帳篷搭建施工合同范本3篇
- 2024物流包裝與裝卸合同
- 2025年度智慧家居產品研發(fā)承包經營合同書范文4篇
- 2025年度桉樹種植與生物質能利用技術研發(fā)合同3篇
- 2025年個人汽車抵押貸款抵押權設立及轉讓合同4篇
- 2025年度住宅小區(qū)地下車庫車位使用權購買合同范本4篇
- 2025年度文化產業(yè)園開發(fā)承包合同股東內部合作協(xié)議4篇
- 2024年甲乙雙方石材供需合同
- 2025年度新能源項目地質鉆孔工程承包協(xié)議4篇
- 有效排痰的護理ppt(完整版)
- 魯教版七年級數(shù)學下冊(五四制)全冊完整課件
- 英語六級詞匯(全)
- 算法向善與個性化推薦發(fā)展研究報告
- 聚合物的流變性詳解演示文稿
- 電氣設備預防性試驗安全技術措施
- 醫(yī)院出入口安檢工作記錄表范本
- 內科學教學課件:免疫性血小板減少癥(ITP)
- 中華人民共和國文物保護單位登記表
- 《生物制品學》課程教學大綱
- 硅基負極材料項目可行性研究報告_范文參考
評論
0/150
提交評論