




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面向?qū)ο罄^承和多態(tài)上一章內(nèi)容回顧5.面向?qū)ο螅簶?gòu)造方法,封裝與隱藏構(gòu)造器理解構(gòu)造器構(gòu)造器的重載封裝理解封裝訪問(wèn)控制符包(package)包及其作用package和import語(yǔ)句Java的常用包第2頁(yè),共40頁(yè),2024年2月25日,星期天6.面向?qū)ο螅豪^承和多態(tài)6.1類的繼承6.1.1繼承的特點(diǎn)6.1.2重寫父類的方法6.1.3父類實(shí)例的super引用6.1.4調(diào)用父類的構(gòu)造器6.2多態(tài)6.2.1多態(tài)性6.2.2引用變量的強(qiáng)制類型轉(zhuǎn)換6.2.3instanceof運(yùn)算符6.3繼承和組合6.4課后作業(yè)第3頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.1繼承的特點(diǎn)繼承是面向?qū)ο笕筇卣髦?,也是?shí)現(xiàn)軟件復(fù)用的重要手段。Java的繼承通過(guò)關(guān)鍵字extends來(lái)實(shí)現(xiàn),實(shí)現(xiàn)繼承的類稱為子類,被繼承的類稱為基類、超類、父類。父類與子類的關(guān)系,是一種一般和特殊的關(guān)系。例如水果和蘋果的關(guān)系,蘋果繼承了水果,蘋果是水果的子類,則蘋果是一種特殊的水果。因?yàn)樽宇愂且环N特殊的父類,因此父類包含的范圍總比子類包含的范圍要大,因此父類是大類,子類是小類。Java的繼承是單繼承,每個(gè)類最多只有一個(gè)直接父類。第4頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.1繼承的特點(diǎn)Java里子類繼承父類的語(yǔ)法格式如下:[修飾符]classsubclassextendssuperclass{//類定義部分}“extends”的含義是子類擴(kuò)展了父類,將可以獲得父類的全部屬性和方法,但子類不能獲得父類構(gòu)造方法。以下程序示范了子類繼承父類的特點(diǎn)。第5頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.1繼承的特點(diǎn)程序清單:chapter06\test1\Fruit.java、Apple.javapackagechapter06.test1;public
classFruit{
public
doubleweight;
public
voidinfo(){System.out.println("我是一個(gè)水果!重"+weight+"g!");}}packagechapter06.test1;public
classAppleextendsFruit{
public
static
voidmain(String[]args){
//創(chuàng)建Apple的對(duì)象Applea=newApple();
//Apple對(duì)象本身沒(méi)有weight屬性。//因?yàn)锳pple的父類有weight屬性,也可以訪問(wèn)Apple對(duì)象的屬性
a.weight=56;
//調(diào)用Apple對(duì)象的info方法
();}}該程序的輸出結(jié)果為:我是一個(gè)水果!重56.0g!第6頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.1繼承的特點(diǎn)第7頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.2
重寫父類的方法子類擴(kuò)展了父類,子類是一個(gè)特殊的父類。大部分時(shí)候,子類總是以父類為基礎(chǔ),額外增加新的屬性和方法。但有一種情況例外:子類需要重寫父類的方法。例如,鳥類都包含了飛翔(fly)的方法,其中鴕鳥是一種特殊的鳥類,因此鴕鳥應(yīng)該是鳥的子類,因此它也將從鳥類獲得飛翔方法,但這個(gè)飛翔方法明顯不適合鴕鳥,因此,鴕鳥需要重寫鳥類的方法。下面程序先定義一個(gè)Bird類。第8頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.2
重寫父類的方法程序清單:chapter06\test1\Bird.javapackagechapter06.test1;public
classBird{
//Bird類的fly方法
public
voidfly(){System.out.println("我在天空里自由自在地飛翔...");}}第9頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.2
重寫父類的方法下面再定義一個(gè)Ostrich類,這個(gè)類擴(kuò)展了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對(duì)象Ostrichos=newOstrich();
//執(zhí)行Ostrich對(duì)象的fly方法,將輸出"我只能在地上奔跑..."os.fly();}}該程序的輸出結(jié)果為:我只能在地上奔跑...第10頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.2
重寫父類的方法這種子類包含父類同名方法的現(xiàn)象被稱為方法重寫,也稱為方法覆蓋(Override)??梢哉f(shuō)子類重寫了父類的方法,也可以說(shuō)子類覆蓋了父類的方法。方法的重寫要遵循“兩同兩小一大”。兩同:方法名相同;形參列表相同。兩小:子類方法返回值類型應(yīng)比父類方法返回值類型更小(即子類)或相同;子類方法聲明拋出的異常應(yīng)比父類方法聲明拋出的異常類更小或相同。一大:子類方法的訪問(wèn)控制權(quán)限應(yīng)比父類方法更大或相等。第11頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.2
重寫父類的方法注意:覆蓋方法和被覆蓋方法要么都是類方法,要么都是實(shí)例方法;不能一個(gè)是類方法,一個(gè)是實(shí)例方法,否則編譯出錯(cuò)。當(dāng)子類覆蓋了父類方法后,子類的對(duì)象將無(wú)法直接訪問(wèn)父類中被覆蓋的方法,如果需要訪問(wèn),可以使用super(被覆蓋的是實(shí)例方法)或者父類名(被覆蓋的是類方法)作為調(diào)用者來(lái)調(diào)用父類被覆蓋的方法。如果父類方法具有private訪問(wèn)權(quán)限,則該方法對(duì)其子類是隱藏的,因此其子類無(wú)法訪問(wèn)該方法,也就無(wú)法重寫該方法;如果子類定義了一個(gè)與父類private方法具有相同方法名、相同形參列表、相同返回值類型的方法,依然不是重寫,只是在子類中重新定義了一個(gè)新方法。第12頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.3
父類實(shí)例的super引用(1)通過(guò)super引用調(diào)用父類被覆蓋的方法如果需要在子類中調(diào)用父類被覆蓋的實(shí)例方法,可以通過(guò)關(guān)鍵字super作為調(diào)用者來(lái)調(diào)用父類被覆蓋的方法。super是Java提供的一個(gè)關(guān)鍵字,它是直接父類的默認(rèn)引用。例如,為上面的Ostrich類添加callOverridedMethod方法,在其中調(diào)用Bird類被覆蓋的fly方法。完整的Ostrich類代碼如下。程序清單:chapter06\test1\Ostrich.java第13頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.3
父類實(shí)例的super引用packagechapter06.test1;public
classOstrichextendsBird{
//重寫B(tài)ird類的fly方法
public
voidfly(){System.out.println("我只能在地上奔跑...");}
public
voidcallOverridedMethod(){
//在子類方法中通過(guò)super來(lái)顯式調(diào)用父類被覆蓋的方法。
super.fly();}
public
static
voidmain(String[]args){
//創(chuàng)建Ostrich對(duì)象Ostrichos=newOstrich();
//執(zhí)行Ostrich對(duì)象的fly方法,將輸出"我只能在地上奔跑..."os.fly();os.callOverridedMethod();}}該程序的輸出結(jié)果為:我只能在地上奔跑...我在天空里自由自在地飛翔...第14頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.3
父類實(shí)例的super引用第15頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.3
父類實(shí)例的super引用第16頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.3
父類實(shí)例的super引用(2)通過(guò)super引用訪問(wèn)父類的屬性如果子類定義了和父類同名的屬性,也會(huì)發(fā)生子類屬性覆蓋父類屬性的情形。正常情況下,子類里定義的方法訪問(wèn)該屬性,都是訪問(wèn)子類屬性,無(wú)法訪問(wèn)到父類被覆蓋的屬性。但在子類定義的實(shí)例方法中可以通過(guò)super引用來(lái)訪問(wèn)父類被覆蓋的屬性。詳見下面的例子程序清單:chapter06\SubClass.java第17頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.3
父類實(shí)例的super引用packagechapter06;classBaseClass{
public
inta=5;}public
classSubClassextendsBaseClass{
public
inta=7;
public
voidaccessOwner(){System.out.println(a);}
public
voidaccessBase(){
//通過(guò)super來(lái)訪問(wèn)方法調(diào)用者對(duì)應(yīng)的父類對(duì)象
System.out.println(super.a);}
public
static
voidmain(String[]args){SubClasssc=newSubClass();
//直接訪問(wèn)SubClass對(duì)象的a屬性將會(huì)輸出7System.out.println(sc.a);sc.accessOwner();
//輸出7sc.accessBase();
//輸出5}}該程序的輸出結(jié)果為:775第18頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.4
調(diào)用父類的構(gòu)造器(1)通過(guò)super引用調(diào)用父類的構(gòu)造器在一個(gè)構(gòu)造器中調(diào)用另一個(gè)重載的構(gòu)造器要使用this引用來(lái)調(diào)用。在子類構(gòu)造器中調(diào)用父類構(gòu)造器要使用super引用來(lái)調(diào)用。詳見下面的例子。程序清單:chapter06\test1\Sub.java第19頁(yè),共40頁(yè),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){
//通過(guò)super調(diào)用來(lái)調(diào)用父類構(gòu)造器的初始化過(guò)程
super(size,name);
this.color=color;}
public
static
voidmain(String[]args){Subs=newSub(5.6,"測(cè)試對(duì)象","紅色");
//輸出Sub對(duì)象的三個(gè)屬性System.out.println(s.size+"--"++"--"+s.color);}}該程序的輸出結(jié)果為:5.6--測(cè)試對(duì)象--紅色第20頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.4
調(diào)用父類的構(gòu)造器(2)構(gòu)造器的調(diào)用順序在調(diào)用子類的構(gòu)造器創(chuàng)建一個(gè)子類實(shí)例時(shí),父類構(gòu)造器總會(huì)在子類構(gòu)造器之前執(zhí)行;不僅如此,執(zhí)行父類構(gòu)造器時(shí),系統(tǒng)會(huì)再次上溯執(zhí)行其父類的構(gòu)造器,…;以此類推,創(chuàng)建任何Java對(duì)象,最先執(zhí)行的總是java.lang.Object類的構(gòu)造器。詳見下面的例子。程序清單:chapter06\test1\Wolf.java第21頁(yè),共40頁(yè),2024年2月25日,星期天6.1類的繼承
6.1.4
調(diào)用父類的構(gòu)造器packagechapter06.test1;classCreature{
publicCreature(){System.out.println("Creature無(wú)參數(shù)的構(gòu)造器");}}classAnimalextendsCreature{publicAnimal(Stringname){
System.out.println("Animal帶一個(gè)參數(shù)的構(gòu)造器,該動(dòng)物的name為"+name);}
publicAnimal(Stringname,intage){
//使用this調(diào)用同一個(gè)重載的構(gòu)造器
this(name);System.out.println("Animal帶2個(gè)參數(shù)的構(gòu)造器,其age為"+age);}}public
classWolfextendsAnimal{
publicWolf(){
//顯式調(diào)用父類有2個(gè)參數(shù)的構(gòu)造器
super("土狼",3);System.out.println("Wolf無(wú)參數(shù)的構(gòu)造器");}
public
static
voidmain(String[]args){
newWolf();}}該程序的輸出結(jié)果為:Creature無(wú)參數(shù)的構(gòu)造器Animal帶一個(gè)參數(shù)的構(gòu)造器,該動(dòng)物的name為土狼Animal帶2個(gè)參數(shù)的構(gòu)造器,其age為3Wolf無(wú)參數(shù)的構(gòu)造器第22頁(yè),共40頁(yè),2024年2月25日,星期天6.2多態(tài)Java引用變量有兩個(gè)類型:一個(gè)是編譯時(shí)的類型,一個(gè)是運(yùn)行時(shí)的類型,編譯時(shí)的類型由聲明該變量時(shí)使用的類型決定,運(yùn)行時(shí)的類型由實(shí)際賦給該變量的對(duì)象決定。如果編譯時(shí)類型和運(yùn)行時(shí)的類型不一致,這就有可能出現(xiàn)所謂的多態(tài)(Polymorphism)。第23頁(yè),共40頁(yè),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{
//重新定義一個(gè)book實(shí)例屬性覆蓋父類的book實(shí)例屬性
publicStringbook="輕量級(jí)J2EE企業(yè)應(yīng)用實(shí)戰(zhàn)";
public
voidtest(){System.out.println("子類的覆蓋父類的方法");}
public
voidsub(){System.out.println("子類的普通方法");}
public
static
voidmain(String[]args){//下面編譯時(shí)類型和運(yùn)行時(shí)類型完全一樣,因此不存在多態(tài)BaseClassbc=newBaseClass();
//輸出6System.out.println(bc.book);
//下面兩次調(diào)用將執(zhí)行BaseClass的方法bc.base();bc.test();該程序的輸出結(jié)果為:6父類的普通方法父類的被覆蓋的方法輕量級(jí)J2EE企業(yè)應(yīng)用實(shí)戰(zhàn)父類的普通方法子類的覆蓋父類的方法子類的普通方法6父類的普通方法子類的覆蓋父類的方法第24頁(yè),共40頁(yè),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("父類的被覆蓋的方法");}}
//下面編譯時(shí)類型和運(yùn)行時(shí)類型完全一樣,因此不存在多態(tài)SubClasssc=newSubClass();
//輸出"輕量級(jí)J2EE企業(yè)應(yīng)用實(shí)戰(zhàn)"System.out.println(sc.book);
//下面調(diào)用將執(zhí)行從父類繼承到的base方法sc.base();
//下面調(diào)用將執(zhí)行從當(dāng)前類的test方法sc.test();
//下面調(diào)用將執(zhí)行從當(dāng)前類的sub方法sc.sub();
//下面編譯時(shí)類型和運(yùn)行時(shí)類型不一樣,多態(tài)發(fā)生
BaseClassploymophicBc=newSubClass();
//輸出6——表明訪問(wèn)的是父類屬性System.out.println(ploymophicBc.book);
//下面調(diào)用將執(zhí)行從父類繼承到的base方法ploymophicBc.base();
//下面調(diào)用將執(zhí)行當(dāng)前類的test方法ploymophicBc.test();//因?yàn)閜loymophicBc的編譯類型是BaseClass,BaseClass類沒(méi)有
//提供sub方法,所以下面代碼編譯時(shí)會(huì)出現(xiàn)錯(cuò)誤。//ploymophicBc.sub();}}該程序的輸出結(jié)果為:6父類的普通方法父類的被覆蓋的方法輕量級(jí)J2EE企業(yè)應(yīng)用實(shí)戰(zhàn)父類的普通方法子類的覆蓋父類的方法子類的普通方法6父類的普通方法子類的覆蓋父類的方法第25頁(yè),共40頁(yè),2024年2月25日,星期天6.2多態(tài)
6.2.1多態(tài)性上述例子中,第三個(gè)引用變量polymopicBc比較特殊,它的編譯時(shí)類型是BaseClass,而運(yùn)行時(shí)類型是SubClass,當(dāng)調(diào)用該引用變量的test方法(BaseClass類定義了該方法,子類SubClass覆蓋了父類的該方法),實(shí)際執(zhí)行的是SubClass類中覆蓋后的test方法,這就是多態(tài)。因?yàn)樽宇惼鋵?shí)是一種特殊的父類,因此Java允許把一個(gè)子類對(duì)象直接賦給一個(gè)父類引用變量,無(wú)須任何類型轉(zhuǎn)換,或者被稱為向上轉(zhuǎn)型(upcasting)、或上溯。向上轉(zhuǎn)型由系統(tǒng)自動(dòng)完成?!?/下面編譯時(shí)類型和運(yùn)行時(shí)類型不一樣,多態(tài)發(fā)生BaseClassploymophicBc=newSubClass();……第26頁(yè),共40頁(yè),2024年2月25日,星期天6.2多態(tài)
6.2.1多態(tài)性第27頁(yè),共40頁(yè),2024年2月25日,星期天6.2多態(tài)
6.2.1多態(tài)性當(dāng)把一個(gè)子類對(duì)象直接賦給父類引用變量,例如上述例子中的語(yǔ)句“BaseClassploymophicBc=newSubClass();”,這個(gè)ploymophicBc引用變量的編譯時(shí)類型是BaseClass,而運(yùn)行時(shí)類型是SubClass,當(dāng)運(yùn)行時(shí)調(diào)用該引用變量的方法時(shí),其方法行為總是像子類方法的行為,而不是像父類方法的行為,這將出現(xiàn)相同類型的變量、執(zhí)行同一個(gè)方法時(shí)呈現(xiàn)出不同的行為特征,這就是多態(tài)。第28頁(yè),共40頁(yè),2024年2月25日,星期天6.2多態(tài)
6.2.2引用變量的強(qiáng)制類型轉(zhuǎn)換C語(yǔ)言里也有強(qiáng)制類型轉(zhuǎn)換。在Java程序里,引用變量只能調(diào)用它編譯時(shí)類型的方法,而不能調(diào)用它運(yùn)行時(shí)類型的方法(詳見6.2.1節(jié)中被注釋的代碼),即使它實(shí)際所引用對(duì)象確實(shí)包含該方法。如果需要讓這個(gè)引用變量來(lái)調(diào)用它運(yùn)行時(shí)類型的方法,則必須把它強(qiáng)制類型轉(zhuǎn)換成運(yùn)行時(shí)類型。強(qiáng)制類型轉(zhuǎn)換運(yùn)算符是小括號(hào),語(yǔ)法如下:(type)variable;第29頁(yè),共40頁(yè),2024年2月25日,星期天6.2多態(tài)
6.2.2引用變量的強(qiáng)制類型轉(zhuǎn)換Java語(yǔ)言里的強(qiáng)制類型轉(zhuǎn)換運(yùn)算要注意:基本類型之間的轉(zhuǎn)換只能在數(shù)值類型之間進(jìn)行,這里所說(shuō)的數(shù)值類型包括整數(shù)型、字符型和浮點(diǎn)型。但數(shù)值型不能和布爾型之間進(jìn)行類型轉(zhuǎn)換。引用類型之間的轉(zhuǎn)換只能把一個(gè)父類變量轉(zhuǎn)換成子類類型,如果是兩個(gè)沒(méi)有任何繼承關(guān)系的類型,則無(wú)法進(jìn)行類型轉(zhuǎn)換,否則編譯時(shí)就會(huì)出現(xiàn)錯(cuò)誤。如果試圖把一個(gè)父類實(shí)例轉(zhuǎn)換成子類類型,則這個(gè)實(shí)例必須實(shí)際上是子類實(shí)例才行(即編譯時(shí)類型為父類類型,而運(yùn)行時(shí)類型是子類類型),否則將會(huì)在運(yùn)行時(shí)引發(fā)ClassCastException異常。下面是進(jìn)行強(qiáng)制類型轉(zhuǎn)換的示范程序,下面程序詳細(xì)說(shuō)明了哪些情況可以進(jìn)行類型轉(zhuǎn)換,哪些情況不可以進(jìn)行類型轉(zhuǎn)換。第30頁(yè),共40頁(yè),2024年2月25日,星期天6.2多態(tài)
6.2.2引用變量的強(qiáng)制類型轉(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í)出錯(cuò):試圖把一個(gè)數(shù)值型變量轉(zhuǎn)換為boolean型,
//編譯時(shí)候會(huì)提示:不可轉(zhuǎn)換的類型
//booleanb=(boolean)in;Objectobj="Hello";
//obj變量的編譯類型為Object,是String類型的父類,可以強(qiáng)制類型轉(zhuǎn)換
//而且obj變量實(shí)際上類型也是String類型,所以運(yùn)行時(shí)也可通過(guò)
StringobjStr=(String)obj;System.out.println(objStr);
//定義一個(gè)objPri變量,編譯類型為Object,實(shí)際類型為IntegerObjectobjPri=newInteger(5);
//objPri變量的編譯類型為Object,是String類的父類,可以強(qiáng)制轉(zhuǎn)換
//而objPri變量實(shí)際上類型是Integer類型,所以下面代碼運(yùn)行時(shí)引發(fā)異常
//Stringstr=(String)objPri;}}該程序的輸出結(jié)果為:13Hello第31頁(yè),共40頁(yè),2024年2月25日,星期天6.2多態(tài)
6.2.2引用變量的強(qiáng)制類型轉(zhuǎn)換考慮到進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí)可能會(huì)出現(xiàn)異常,因此進(jìn)行類型轉(zhuǎn)換前應(yīng)先通過(guò)instanceof運(yùn)算符來(lái)判斷是否可以成功轉(zhuǎn)換。例如上面的代碼“Stringstr=(String)objPri;”運(yùn)行時(shí)會(huì)引發(fā)ClassCastException異常,這是因?yàn)閛bjPri不可轉(zhuǎn)換成String類型,為了讓程序更健壯,可以將代碼修改為:if(objPriinstanceofString){Stringstr=(String)objPri;}在進(jìn)行強(qiáng)制類型轉(zhuǎn)換前,先用instanceof運(yùn)算符判斷是否可以成功轉(zhuǎn)換,從而避免出現(xiàn)ClassCastException異常。第32頁(yè),共40頁(yè),2024年2月25日,星期天6.2多態(tài)
6.2.3instanceof運(yùn)算符instanceof和類型轉(zhuǎn)換運(yùn)算符一樣,都是Java提供的運(yùn)算符。其語(yǔ)法格式為:引用變量instanceof類(或接口)instanceof運(yùn)算符的左操作數(shù)通常是一個(gè)引用類型的變量,右操作數(shù)通常是一個(gè)類(也可以是接口),它用于判斷左邊的對(duì)象是否是右邊類(或者其子類)的實(shí)例。如果是返回true,否則返回false。下面的程序示范了instanceof運(yùn)算符的用法。程序清單:chapter06\test2\TestInstanceof.java第33頁(yè),共40頁(yè),2024年2月25日,星期天6.2多態(tài)
6.2.3instanceof運(yùn)算符packagechapter06.test2;public
classTestInstanceof{
public
static
voidmain(String[]args){//聲明hello為Object類,則hello的編譯類型是Object,Object是所有類的父類
//但hello變量的實(shí)際類型是StringObjecthello="Hello";
//String是Object類的子類,所以返回true。
System.out.println("字符串是否是Object類的實(shí)例:"+(helloinstanceofObject));
//返回true。
System.out.println("字符串是否是String類的實(shí)例:"+(helloinstanceofString));
//返回false。
System.out.println("字符串是否是Math類的實(shí)例:"+(helloinstanceofMath));
//String實(shí)現(xiàn)了Comparable接口,所以返回true。
System.out.println("字符串是否是Comparable接口的實(shí)例:"+(helloinstanceofComparable));Stringa="Hello";//String類既不是Math類,也不是Math類的父類,所以下面代碼編譯通不過(guò)
//System.out.println("字符串是否是Math類的實(shí)例:"+(ainstanceofMath));}}該程序的輸出結(jié)果為:字符串是否是Object類的實(shí)例:true字符串是否是String類的實(shí)例:true字符串是否是Math類的實(shí)例:false字符串是否是Comparable接口的實(shí)例:true第34頁(yè),共40頁(yè),2024年2月25日,星期天6.3繼承和組合
6.3.1使用繼承的注意事項(xiàng)繼承是實(shí)現(xiàn)類重用的重要手段,但繼承也帶來(lái)了一個(gè)最大的壞處:破壞封裝。組合是實(shí)現(xiàn)類重用的另一種方式。下面介紹繼承和組合之間的練習(xí)和區(qū)別。子類擴(kuò)展父類時(shí),子類將可以從父類繼承得到屬性和方法,如果訪問(wèn)權(quán)限允許,子類將可以直接訪問(wèn)父類的屬性和方法,相當(dāng)于子類可以直接復(fù)用父類的屬性和方法,確實(shí)非常方便。繼承帶來(lái)了高度復(fù)用的同時(shí),也帶來(lái)了一個(gè)嚴(yán)重的問(wèn)題:繼承嚴(yán)重地破壞了父類的封裝性。前面介紹封裝時(shí)提到:每個(gè)類都應(yīng)該封裝它內(nèi)部信息和實(shí)現(xiàn)細(xì)節(jié),而只暴露必要的方法給其他類使用。但在繼承關(guān)系中,子類可以直接訪問(wèn)父類的屬性和方法,從而造成子類和父類的嚴(yán)重耦合。第35頁(yè),共40頁(yè),2024年2月25日,星期天6.3繼承和組合
6.3.1使用繼承的注意事項(xiàng)為了保證父類良好的封裝性,不會(huì)被子類隨意改變,設(shè)計(jì)父類通常應(yīng)該遵循如下規(guī)則:盡量隱藏父類的內(nèi)部數(shù)據(jù)。不要讓子類可以隨意訪問(wèn)、修改父類方法。盡量不要在父類構(gòu)造器中調(diào)用將要被子類重寫的方法。如果想把某些類設(shè)置成最終類,即不再派生出子類,則可以用final修飾這個(gè)類。到底何時(shí)需要從父類派生新的子類?不僅需要保證子類是一種特殊的父類,而且還需要具備以下兩個(gè)條件之一:子類需要額外增加屬性,而不僅僅是屬性值的改變。子類需要增加自己獨(dú)有的行為方式(包括增加新的方法或重寫父類的方法)。第36頁(yè),共40頁(yè),2024年2月25日,星期天6.3繼承和組合
6.3.2利用組合實(shí)現(xiàn)復(fù)用繼承要表達(dá)的是一種“是(is-a)”的關(guān)系,而組合表達(dá)的是“有(has-a)”的關(guān)系?!咎釂?wèn)】試從現(xiàn)實(shí)生活中例舉繼承和組合的例子。假設(shè)有三個(gè)類:Animal、Wolf和Bird,它們之間有如下圖所示的繼承樹。第37頁(yè),共40頁(yè),2024年2月25日,星期天6.3繼承和組合
6.3.2利用組合實(shí)現(xiàn)復(fù)用程序清單:chapter06\test3\TestInherit.javapackagechapter06.test3;classAnimal{
private
voidbeat(){System.out.println("心臟跳動(dòng)...");}
public
voidbreath(){beat();System.out.println("吸一口氣,吐一口氣,呼吸中...");}}//繼承Animal,直接復(fù)用父類的breath方法classBirdextendsAnimal{
public
voidfly(){System.out.println("我在天空自在的飛翔...");}}//繼承Animal,直接復(fù)用父類的breath方法classWolfextendsAnimal{
public
voidrun(){System.out.println("我在陸地上的快速奔跑...");}}public
classTestInherit{
public
static
voidmain(Str
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)學(xué)-福建省龍巖市2025年高中畢業(yè)班三月教學(xué)質(zhì)量檢測(cè)(龍巖一檢)試題和答案
- 閥門拆除施工方案
- 石方靜態(tài)爆破施工方案
- 《千米的認(rèn)識(shí)》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年三年級(jí)上冊(cè)數(shù)學(xué)人教版
- 2025年中考物理模擬試卷猜題卷1(含答案)
- 醫(yī)院科室安裝監(jiān)控合同范例
- 合作租房合同范例
- 質(zhì)量控制標(biāo)準(zhǔn)提升計(jì)劃
- 人事部如何構(gòu)建企業(yè)形象計(jì)劃
- 幼兒園作業(yè)與學(xué)習(xí)反饋計(jì)劃
- 2025山東能源集團(tuán)中級(jí)人才庫(kù)選拔高頻重點(diǎn)提升(共500題)附帶答案詳解
- 20S515 鋼筋混凝土及磚砌排水檢查井
- 關(guān)于建設(shè)吉林長(zhǎng)白山人參產(chǎn)業(yè)園的報(bào)告
- 6人小品《沒(méi)有學(xué)習(xí)的人不傷心》臺(tái)詞完整版
- 2022新教科版科學(xué)五下全冊(cè)教案、全冊(cè)教學(xué)反思(表格式)含目錄
- 土力學(xué)-第二章-土的工程性質(zhì)及工程分類
- 小學(xué)體育《陽(yáng)光運(yùn)動(dòng)身體好》課件
- 研究生面試復(fù)試英語(yǔ)+常問(wèn)問(wèn)題
- 數(shù)學(xué)名詞中英文對(duì)照
- 線束加工工時(shí)對(duì)照表
- 一年級(jí)古詩(shī)新唱社團(tuán)計(jì)劃
評(píng)論
0/150
提交評(píng)論