面向?qū)ο罄^承和多態(tài)_第1頁
面向?qū)ο罄^承和多態(tài)_第2頁
面向?qū)ο罄^承和多態(tài)_第3頁
面向?qū)ο罄^承和多態(tài)_第4頁
面向?qū)ο罄^承和多態(tài)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

面向?qū)ο罄^承和多態(tài)上一章內(nèi)容回顧5.面向?qū)ο螅簶?gòu)造方法,封裝與隱藏構(gòu)造器理解構(gòu)造器構(gòu)造器的重載封裝理解封裝訪問控制符包(package)包及其作用package和import語句Java的常用包第2頁,共40頁,2024年2月25日,星期天6.面向?qū)ο螅豪^承和多態(tài)6.1類的繼承6.1.1繼承的特點6.1.2重寫父類的方法6.1.3父類實例的super引用6.1.4調(diào)用父類的構(gòu)造器6.2多態(tài)6.2.1多態(tài)性6.2.2引用變量的強制類型轉(zhuǎn)換6.2.3instanceof運算符6.3繼承和組合6.4課后作業(yè)第3頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.1繼承的特點繼承是面向?qū)ο笕筇卣髦?,也是實現(xiàn)軟件復用的重要手段。Java的繼承通過關(guān)鍵字extends來實現(xiàn),實現(xiàn)繼承的類稱為子類,被繼承的類稱為基類、超類、父類。父類與子類的關(guān)系,是一種一般和特殊的關(guān)系。例如水果和蘋果的關(guān)系,蘋果繼承了水果,蘋果是水果的子類,則蘋果是一種特殊的水果。因為子類是一種特殊的父類,因此父類包含的范圍總比子類包含的范圍要大,因此父類是大類,子類是小類。Java的繼承是單繼承,每個類最多只有一個直接父類。第4頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.1繼承的特點Java里子類繼承父類的語法格式如下:[修飾符]classsubclassextendssuperclass{//類定義部分}“extends”的含義是子類擴展了父類,將可以獲得父類的全部屬性和方法,但子類不能獲得父類構(gòu)造方法。以下程序示范了子類繼承父類的特點。第5頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.1繼承的特點程序清單:chapter06\test1\Fruit.java、Apple.javapackagechapter06.test1;public

classFruit{

public

doubleweight;

public

voidinfo(){System.out.println("我是一個水果!重"+weight+"g!");}}packagechapter06.test1;public

classAppleextendsFruit{

public

static

voidmain(String[]args){

//創(chuàng)建Apple的對象Applea=newApple();

//Apple對象本身沒有weight屬性。//因為Apple的父類有weight屬性,也可以訪問Apple對象的屬性

a.weight=56;

//調(diào)用Apple對象的info方法

();}}該程序的輸出結(jié)果為:我是一個水果!重56.0g!第6頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.1繼承的特點第7頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.2

重寫父類的方法子類擴展了父類,子類是一個特殊的父類。大部分時候,子類總是以父類為基礎(chǔ),額外增加新的屬性和方法。但有一種情況例外:子類需要重寫父類的方法。例如,鳥類都包含了飛翔(fly)的方法,其中鴕鳥是一種特殊的鳥類,因此鴕鳥應該是鳥的子類,因此它也將從鳥類獲得飛翔方法,但這個飛翔方法明顯不適合鴕鳥,因此,鴕鳥需要重寫鳥類的方法。下面程序先定義一個Bird類。第8頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.2

重寫父類的方法程序清單:chapter06\test1\Bird.javapackagechapter06.test1;public

classBird{

//Bird類的fly方法

public

voidfly(){System.out.println("我在天空里自由自在地飛翔...");}}第9頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.2

重寫父類的方法下面再定義一個Ostrich類,這個類擴展了Bird類,但重寫了Bird類的fly方法。程序清單:chapter06\test1\Ostrich.javapackagechapter06.test1;public

classOstrichextendsBird{

//重寫B(tài)ird類的fly方法

public

voidfly(){System.out.println("我只能在地上奔跑...");}

public

static

voidmain(String[]args){

//創(chuàng)建Ostrich對象Ostrichos=newOstrich();

//執(zhí)行Ostrich對象的fly方法,將輸出"我只能在地上奔跑..."os.fly();}}該程序的輸出結(jié)果為:我只能在地上奔跑...第10頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.2

重寫父類的方法這種子類包含父類同名方法的現(xiàn)象被稱為方法重寫,也稱為方法覆蓋(Override)??梢哉f子類重寫了父類的方法,也可以說子類覆蓋了父類的方法。方法的重寫要遵循“兩同兩小一大”。兩同:方法名相同;形參列表相同。兩?。鹤宇惙椒ǚ祷刂殿愋蛻雀割惙椒ǚ祷刂殿愋透?即子類)或相同;子類方法聲明拋出的異常應比父類方法聲明拋出的異常類更小或相同。一大:子類方法的訪問控制權(quán)限應比父類方法更大或相等。第11頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.2

重寫父類的方法注意:覆蓋方法和被覆蓋方法要么都是類方法,要么都是實例方法;不能一個是類方法,一個是實例方法,否則編譯出錯。當子類覆蓋了父類方法后,子類的對象將無法直接訪問父類中被覆蓋的方法,如果需要訪問,可以使用super(被覆蓋的是實例方法)或者父類名(被覆蓋的是類方法)作為調(diào)用者來調(diào)用父類被覆蓋的方法。如果父類方法具有private訪問權(quán)限,則該方法對其子類是隱藏的,因此其子類無法訪問該方法,也就無法重寫該方法;如果子類定義了一個與父類private方法具有相同方法名、相同形參列表、相同返回值類型的方法,依然不是重寫,只是在子類中重新定義了一個新方法。第12頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.3

父類實例的super引用(1)通過super引用調(diào)用父類被覆蓋的方法如果需要在子類中調(diào)用父類被覆蓋的實例方法,可以通過關(guān)鍵字super作為調(diào)用者來調(diào)用父類被覆蓋的方法。super是Java提供的一個關(guān)鍵字,它是直接父類的默認引用。例如,為上面的Ostrich類添加callOverridedMethod方法,在其中調(diào)用Bird類被覆蓋的fly方法。完整的Ostrich類代碼如下。程序清單:chapter06\test1\Ostrich.java第13頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.3

父類實例的super引用packagechapter06.test1;public

classOstrichextendsBird{

//重寫B(tài)ird類的fly方法

public

voidfly(){System.out.println("我只能在地上奔跑...");}

public

voidcallOverridedMethod(){

//在子類方法中通過super來顯式調(diào)用父類被覆蓋的方法。

super.fly();}

public

static

voidmain(String[]args){

//創(chuàng)建Ostrich對象Ostrichos=newOstrich();

//執(zhí)行Ostrich對象的fly方法,將輸出"我只能在地上奔跑..."os.fly();os.callOverridedMethod();}}該程序的輸出結(jié)果為:我只能在地上奔跑...我在天空里自由自在地飛翔...第14頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.3

父類實例的super引用第15頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.3

父類實例的super引用第16頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.3

父類實例的super引用(2)通過super引用訪問父類的屬性如果子類定義了和父類同名的屬性,也會發(fā)生子類屬性覆蓋父類屬性的情形。正常情況下,子類里定義的方法訪問該屬性,都是訪問子類屬性,無法訪問到父類被覆蓋的屬性。但在子類定義的實例方法中可以通過super引用來訪問父類被覆蓋的屬性。詳見下面的例子程序清單:chapter06\SubClass.java第17頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.3

父類實例的super引用packagechapter06;classBaseClass{

public

inta=5;}public

classSubClassextendsBaseClass{

public

inta=7;

public

voidaccessOwner(){System.out.println(a);}

public

voidaccessBase(){

//通過super來訪問方法調(diào)用者對應的父類對象

System.out.println(super.a);}

public

static

voidmain(String[]args){SubClasssc=newSubClass();

//直接訪問SubClass對象的a屬性將會輸出7System.out.println(sc.a);sc.accessOwner();

//輸出7sc.accessBase();

//輸出5}}該程序的輸出結(jié)果為:775第18頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.4

調(diào)用父類的構(gòu)造器(1)通過super引用調(diào)用父類的構(gòu)造器在一個構(gòu)造器中調(diào)用另一個重載的構(gòu)造器要使用this引用來調(diào)用。在子類構(gòu)造器中調(diào)用父類構(gòu)造器要使用super引用來調(diào)用。詳見下面的例子。程序清單:chapter06\test1\Sub.java第19頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.4

調(diào)用父類的構(gòu)造器packagechapter06.test1;classBase{

public

doublesize;

publicStringname;

public

Base(doublesize,Stringname){

this.size=size;

this.name=name;}}public

classSubextendsBase{

publicStringcolor;

publicSub(doublesize,Stringname,Stringcolor){

//通過super調(diào)用來調(diào)用父類構(gòu)造器的初始化過程

super(size,name);

this.color=color;}

public

static

voidmain(String[]args){Subs=newSub(5.6,"測試對象","紅色");

//輸出Sub對象的三個屬性System.out.println(s.size+"--"++"--"+s.color);}}該程序的輸出結(jié)果為:5.6--測試對象--紅色第20頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.4

調(diào)用父類的構(gòu)造器(2)構(gòu)造器的調(diào)用順序在調(diào)用子類的構(gòu)造器創(chuàng)建一個子類實例時,父類構(gòu)造器總會在子類構(gòu)造器之前執(zhí)行;不僅如此,執(zhí)行父類構(gòu)造器時,系統(tǒng)會再次上溯執(zhí)行其父類的構(gòu)造器,…;以此類推,創(chuàng)建任何Java對象,最先執(zhí)行的總是java.lang.Object類的構(gòu)造器。詳見下面的例子。程序清單:chapter06\test1\Wolf.java第21頁,共40頁,2024年2月25日,星期天6.1類的繼承

6.1.4

調(diào)用父類的構(gòu)造器packagechapter06.test1;classCreature{

publicCreature(){System.out.println("Creature無參數(shù)的構(gòu)造器");}}classAnimalextendsCreature{publicAnimal(Stringname){

System.out.println("Animal帶一個參數(shù)的構(gòu)造器,該動物的name為"+name);}

publicAnimal(Stringname,intage){

//使用this調(diào)用同一個重載的構(gòu)造器

this(name);System.out.println("Animal帶2個參數(shù)的構(gòu)造器,其age為"+age);}}public

classWolfextendsAnimal{

publicWolf(){

//顯式調(diào)用父類有2個參數(shù)的構(gòu)造器

super("土狼",3);System.out.println("Wolf無參數(shù)的構(gòu)造器");}

public

static

voidmain(String[]args){

newWolf();}}該程序的輸出結(jié)果為:Creature無參數(shù)的構(gòu)造器Animal帶一個參數(shù)的構(gòu)造器,該動物的name為土狼Animal帶2個參數(shù)的構(gòu)造器,其age為3Wolf無參數(shù)的構(gòu)造器第22頁,共40頁,2024年2月25日,星期天6.2多態(tài)Java引用變量有兩個類型:一個是編譯時的類型,一個是運行時的類型,編譯時的類型由聲明該變量時使用的類型決定,運行時的類型由實際賦給該變量的對象決定。如果編譯時類型和運行時的類型不一致,這就有可能出現(xiàn)所謂的多態(tài)(Polymorphism)。第23頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.1多態(tài)性先看以下例子。程序清單:chapter06\test2\SubClass.javapackagechapter06.test2;classBaseClass{

public

intbook=6;

public

voidbase(){System.out.println("父類的普通方法");}

public

voidtest(){System.out.println("父類的被覆蓋的方法");}}public

classSubClassextendsBaseClass{

//重新定義一個book實例屬性覆蓋父類的book實例屬性

publicStringbook="輕量級J2EE企業(yè)應用實戰(zhàn)";

public

voidtest(){System.out.println("子類的覆蓋父類的方法");}

public

voidsub(){System.out.println("子類的普通方法");}

public

static

voidmain(String[]args){//下面編譯時類型和運行時類型完全一樣,因此不存在多態(tài)BaseClassbc=newBaseClass();

//輸出6System.out.println(bc.book);

//下面兩次調(diào)用將執(zhí)行BaseClass的方法bc.base();bc.test();該程序的輸出結(jié)果為:6父類的普通方法父類的被覆蓋的方法輕量級J2EE企業(yè)應用實戰(zhàn)父類的普通方法子類的覆蓋父類的方法子類的普通方法6父類的普通方法子類的覆蓋父類的方法第24頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.1多態(tài)性packagechapter06.test2;classBaseClass{

public

intbook=6;

public

voidbase(){System.out.println("父類的普通方法");}

public

voidtest(){System.out.println("父類的被覆蓋的方法");}}

//下面編譯時類型和運行時類型完全一樣,因此不存在多態(tài)SubClasssc=newSubClass();

//輸出"輕量級J2EE企業(yè)應用實戰(zhàn)"System.out.println(sc.book);

//下面調(diào)用將執(zhí)行從父類繼承到的base方法sc.base();

//下面調(diào)用將執(zhí)行從當前類的test方法sc.test();

//下面調(diào)用將執(zhí)行從當前類的sub方法sc.sub();

//下面編譯時類型和運行時類型不一樣,多態(tài)發(fā)生

BaseClassploymophicBc=newSubClass();

//輸出6——表明訪問的是父類屬性System.out.println(ploymophicBc.book);

//下面調(diào)用將執(zhí)行從父類繼承到的base方法ploymophicBc.base();

//下面調(diào)用將執(zhí)行當前類的test方法ploymophicBc.test();//因為ploymophicBc的編譯類型是BaseClass,BaseClass類沒有

//提供sub方法,所以下面代碼編譯時會出現(xiàn)錯誤。//ploymophicBc.sub();}}該程序的輸出結(jié)果為:6父類的普通方法父類的被覆蓋的方法輕量級J2EE企業(yè)應用實戰(zhàn)父類的普通方法子類的覆蓋父類的方法子類的普通方法6父類的普通方法子類的覆蓋父類的方法第25頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.1多態(tài)性上述例子中,第三個引用變量polymopicBc比較特殊,它的編譯時類型是BaseClass,而運行時類型是SubClass,當調(diào)用該引用變量的test方法(BaseClass類定義了該方法,子類SubClass覆蓋了父類的該方法),實際執(zhí)行的是SubClass類中覆蓋后的test方法,這就是多態(tài)。因為子類其實是一種特殊的父類,因此Java允許把一個子類對象直接賦給一個父類引用變量,無須任何類型轉(zhuǎn)換,或者被稱為向上轉(zhuǎn)型(upcasting)、或上溯。向上轉(zhuǎn)型由系統(tǒng)自動完成?!?/下面編譯時類型和運行時類型不一樣,多態(tài)發(fā)生BaseClassploymophicBc=newSubClass();……第26頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.1多態(tài)性第27頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.1多態(tài)性當把一個子類對象直接賦給父類引用變量,例如上述例子中的語句“BaseClassploymophicBc=newSubClass();”,這個ploymophicBc引用變量的編譯時類型是BaseClass,而運行時類型是SubClass,當運行時調(diào)用該引用變量的方法時,其方法行為總是像子類方法的行為,而不是像父類方法的行為,這將出現(xiàn)相同類型的變量、執(zhí)行同一個方法時呈現(xiàn)出不同的行為特征,這就是多態(tài)。第28頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.2引用變量的強制類型轉(zhuǎn)換C語言里也有強制類型轉(zhuǎn)換。在Java程序里,引用變量只能調(diào)用它編譯時類型的方法,而不能調(diào)用它運行時類型的方法(詳見6.2.1節(jié)中被注釋的代碼),即使它實際所引用對象確實包含該方法。如果需要讓這個引用變量來調(diào)用它運行時類型的方法,則必須把它強制類型轉(zhuǎn)換成運行時類型。強制類型轉(zhuǎn)換運算符是小括號,語法如下:(type)variable;第29頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.2引用變量的強制類型轉(zhuǎn)換Java語言里的強制類型轉(zhuǎn)換運算要注意:基本類型之間的轉(zhuǎn)換只能在數(shù)值類型之間進行,這里所說的數(shù)值類型包括整數(shù)型、字符型和浮點型。但數(shù)值型不能和布爾型之間進行類型轉(zhuǎn)換。引用類型之間的轉(zhuǎn)換只能把一個父類變量轉(zhuǎn)換成子類類型,如果是兩個沒有任何繼承關(guān)系的類型,則無法進行類型轉(zhuǎn)換,否則編譯時就會出現(xiàn)錯誤。如果試圖把一個父類實例轉(zhuǎn)換成子類類型,則這個實例必須實際上是子類實例才行(即編譯時類型為父類類型,而運行時類型是子類類型),否則將會在運行時引發(fā)ClassCastException異常。下面是進行強制類型轉(zhuǎn)換的示范程序,下面程序詳細說明了哪些情況可以進行類型轉(zhuǎn)換,哪些情況不可以進行類型轉(zhuǎn)換。第30頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.2引用變量的強制類型轉(zhuǎn)換程序清單:chapter06\test2\TestConversion.javapackagechapter06.test2;public

classTestConversion{

public

static

voidmain(String[]args){

doubled=13.4;

longl=(long)d;System.out.println(l);

intin=5;

//下面代碼編譯時出錯:試圖把一個數(shù)值型變量轉(zhuǎn)換為boolean型,

//編譯時候會提示:不可轉(zhuǎn)換的類型

//booleanb=(boolean)in;Objectobj="Hello";

//obj變量的編譯類型為Object,是String類型的父類,可以強制類型轉(zhuǎn)換

//而且obj變量實際上類型也是String類型,所以運行時也可通過

StringobjStr=(String)obj;System.out.println(objStr);

//定義一個objPri變量,編譯類型為Object,實際類型為IntegerObjectobjPri=newInteger(5);

//objPri變量的編譯類型為Object,是String類的父類,可以強制轉(zhuǎn)換

//而objPri變量實際上類型是Integer類型,所以下面代碼運行時引發(fā)異常

//Stringstr=(String)objPri;}}該程序的輸出結(jié)果為:13Hello第31頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.2引用變量的強制類型轉(zhuǎn)換考慮到進行強制類型轉(zhuǎn)換時可能會出現(xiàn)異常,因此進行類型轉(zhuǎn)換前應先通過instanceof運算符來判斷是否可以成功轉(zhuǎn)換。例如上面的代碼“Stringstr=(String)objPri;”運行時會引發(fā)ClassCastException異常,這是因為objPri不可轉(zhuǎn)換成String類型,為了讓程序更健壯,可以將代碼修改為:if(objPriinstanceofString){Stringstr=(String)objPri;}在進行強制類型轉(zhuǎn)換前,先用instanceof運算符判斷是否可以成功轉(zhuǎn)換,從而避免出現(xiàn)ClassCastException異常。第32頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.3instanceof運算符instanceof和類型轉(zhuǎn)換運算符一樣,都是Java提供的運算符。其語法格式為:引用變量instanceof類(或接口)instanceof運算符的左操作數(shù)通常是一個引用類型的變量,右操作數(shù)通常是一個類(也可以是接口),它用于判斷左邊的對象是否是右邊類(或者其子類)的實例。如果是返回true,否則返回false。下面的程序示范了instanceof運算符的用法。程序清單:chapter06\test2\TestInstanceof.java第33頁,共40頁,2024年2月25日,星期天6.2多態(tài)

6.2.3instanceof運算符packagechapter06.test2;public

classTestInstanceof{

public

static

voidmain(String[]args){//聲明hello為Object類,則hello的編譯類型是Object,Object是所有類的父類

//但hello變量的實際類型是StringObjecthello="Hello";

//String是Object類的子類,所以返回true。

System.out.println("字符串是否是Object類的實例:"+(helloinstanceofObject));

//返回true。

System.out.println("字符串是否是String類的實例:"+(helloinstanceofString));

//返回false。

System.out.println("字符串是否是Math類的實例:"+(helloinstanceofMath));

//String實現(xiàn)了Comparable接口,所以返回true。

System.out.println("字符串是否是Comparable接口的實例:"+(helloinstanceofComparable));Stringa="Hello";//String類既不是Math類,也不是Math類的父類,所以下面代碼編譯通不過

//System.out.println("字符串是否是Math類的實例:"+(ainstanceofMath));}}該程序的輸出結(jié)果為:字符串是否是Object類的實例:true字符串是否是String類的實例:true字符串是否是Math類的實例:false字符串是否是Comparable接口的實例:true第34頁,共40頁,2024年2月25日,星期天6.3繼承和組合

6.3.1使用繼承的注意事項繼承是實現(xiàn)類重用的重要手段,但繼承也帶來了一個最大的壞處:破壞封裝。組合是實現(xiàn)類重用的另一種方式。下面介紹繼承和組合之間的練習和區(qū)別。子類擴展父類時,子類將可以從父類繼承得到屬性和方法,如果訪問權(quán)限允許,子類將可以直接訪問父類的屬性和方法,相當于子類可以直接復用父類的屬性和方法,確實非常方便。繼承帶來了高度復用的同時,也帶來了一個嚴重的問題:繼承嚴重地破壞了父類的封裝性。前面介紹封裝時提到:每個類都應該封裝它內(nèi)部信息和實現(xiàn)細節(jié),而只暴露必要的方法給其他類使用。但在繼承關(guān)系中,子類可以直接訪問父類的屬性和方法,從而造成子類和父類的嚴重耦合。第35頁,共40頁,2024年2月25日,星期天6.3繼承和組合

6.3.1使用繼承的注意事項為了保證父類良好的封裝性,不會被子類隨意改變,設(shè)計父類通常應該遵循如下規(guī)則:盡量隱藏父類的內(nèi)部數(shù)據(jù)。不要讓子類可以隨意訪問、修改父類方法。盡量不要在父類構(gòu)造器中調(diào)用將要被子類重寫的方法。如果想把某些類設(shè)置成最終類,即不再派生出子類,則可以用final修飾這個類。到底何時需要從父類派生新的子類?不僅需要保證子類是一種特殊的父類,而且還需要具備以下兩個條件之一:子類需要額外增加屬性,而不僅僅是屬性值的改變。子類需要增加自己獨有的行為方式(包括增加新的方法或重寫父類的方法)。第36頁,共40頁,2024年2月25日,星期天6.3繼承和組合

6.3.2利用組合實現(xiàn)復用繼承要表達的是一種“是(is-a)”的關(guān)系,而組合表達的是“有(has-a)”的關(guān)系?!咎釂枴吭噺默F(xiàn)實生活中例舉繼承和組合的例子。假設(shè)有三個類:Animal、Wolf和Bird,它們之間有如下圖所示的繼承樹。第37頁,共40頁,2024年2月25日,星期天6.3繼承和組合

6.3.2利用組合實現(xiàn)復用程序清單:chapter06\test3\TestInherit.javapackagechapter06.test3;classAnimal{

private

voidbeat(){System.out.println("心臟跳動...");}

public

voidbreath(){beat();System.out.println("吸一口氣,吐一口氣,呼吸中...");}}//繼承Animal,直接復用父類的breath方法classBirdextendsAnimal{

public

voidfly(){System.out.println("我在天空自在的飛翔...");}}//繼承Animal,直接復用父類的breath方法classWolfextendsAnimal{

public

voidrun(){System.out.println("我在陸地上的快速奔跑...");}}public

classTestInherit{

public

static

voidmain(Str

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論