JAVA面試題解惑系列(九)——繼承、多態(tài)、重載和重寫.doc_第1頁
JAVA面試題解惑系列(九)——繼承、多態(tài)、重載和重寫.doc_第2頁
JAVA面試題解惑系列(九)——繼承、多態(tài)、重載和重寫.doc_第3頁
JAVA面試題解惑系列(九)——繼承、多態(tài)、重載和重寫.doc_第4頁
JAVA面試題解惑系列(九)——繼承、多態(tài)、重載和重寫.doc_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

JAVA面試題解惑系列(九)繼承、多態(tài)、重載和重寫什么是多態(tài)?它的實現(xiàn)機制是什么呢?重載和重寫的區(qū)別在那里?這就是這一次我們要回顧的四個十分重要的概念:繼承、多態(tài)、重載和重寫。 繼承(inheritance) 簡單的說,繼承就是在一個現(xiàn)有類型的基礎(chǔ)上,通過增加新的方法或者重定義已有方法(下面會講到,這種方式叫重寫)的方式,產(chǎn)生一個新的類型。繼承是面向?qū)ο蟮娜齻€基本特征-封裝、繼承、多態(tài)的其中之一,我們在使用JAVA時編寫的每一個類都是在繼承,因為在JAVA語言中,java.lang.Object類是所有類最根本的基類(或者叫父類、超類),如果我們新定義的一個類沒有明確地指定繼承自哪個基類,那么JAVA就會默認為它是繼承自O(shè)bject類的。 我們可以把JAVA中的類分為以下三種: 1. 類:使用class定義且不含有抽象方法的類。 2. 抽象類:使用abstract class定義的類,它可以含有,也可以不含有抽象方法。 3. 接口:使用interface定義的類。 在這三種類型之間存在下面的繼承規(guī)律: 類可以繼承(extends)類,可以繼承(extends)抽象類,可以繼承(implements)接口。 抽象類可以繼承(extends)類,可以繼承(extends)抽象類,可以繼承(implements)接口。 接口只能繼承(extends)接口。 請注意上面三條規(guī)律中每種繼承情況下使用的不同的關(guān)鍵字extends和implements,它們是不可以隨意替換的。大家知道,一個普通類繼承一個接口后,必須實現(xiàn)這個接口中定義的所有方法,否則就只能被定義為抽象類。我在這里之所以沒有對implements關(guān)鍵字使用“實現(xiàn)”這種說法是因為從概念上來說它也是表示一種繼承關(guān)系,而且對于抽象類implements接口的情況下,它并不是一定要實現(xiàn)這個接口定義的任何方法,因此使用繼承的說法更為合理一些。 以上三條規(guī)律同時遵守下面這些約束: 1. 類和抽象類都只能最多繼承一個類,或者最多繼承一個抽象類,并且這兩種情況是互斥的,也就是說它們要么繼承一個類,要么繼承一個抽象類。 2. 類、抽象類和接口在繼承接口時,不受數(shù)量的約束,理論上可以繼承無限多個接口。當(dāng)然,對于類來說,它必須實現(xiàn)它所繼承的所有接口中定義的全部方法。 3. 抽象類繼承抽象類,或者實現(xiàn)接口時,可以部分、全部或者完全不實現(xiàn)父類抽象類的抽象(abstract)方法,或者父類接口中定義的接口。 4. 類繼承抽象類,或者實現(xiàn)接口時,必須全部實現(xiàn)父類抽象類的全部抽象(abstract)方法,或者父類接口中定義的全部接口。 繼承給我們的編程帶來的好處就是對原有類的復(fù)用(重用)。就像模塊的復(fù)用一樣,類的復(fù)用可以提高我們的開發(fā)效率,實際上,模塊的復(fù)用是大量類的復(fù)用疊加后的效果。除了繼承之外,我們還可以使用組合的方式來復(fù)用類。所謂組合就是把原有類定義為新類的一個屬性,通過在新類中調(diào)用原有類的方法來實現(xiàn)復(fù)用。如果新定義的類型與原有類型之間不存在被包含的關(guān)系,也就是說,從抽象概念上來講,新定義類型所代表的事物并不是原有類型所代表事物的一種,比如黃種人是人類的一種,它們之間存在包含與被包含的關(guān)系,那么這時組合就是實現(xiàn)復(fù)用更好的選擇。下面這個例子就是組合方式的一個簡單示例: Java代碼 1. publicclassSub 2. privateParentp=newParent(); 3. 4. publicvoiddoSomething() 5. /復(fù)用Parent類的方法 6. p.method(); 7. /othercode 8. 9. 10. 11. classParent 12. publicvoidmethod() 13. /dosomethinghere 14. 15. public class Sub private Parent p = new Parent();public void doSomething() / 復(fù)用Parent類的方法p.method();/ other codeclass Parent public void method() / do something here當(dāng)然,為了使代碼更加有效,我們也可以在需要使用到原有類型(比如Parent p)時,才對它進行初始化。 使用繼承和組合復(fù)用原有的類,都是一種增量式的開發(fā)模式,這種方式帶來的好處是不需要修改原有的代碼,因此不會給原有代碼帶來新的BUG,也不用因為對原有代碼的修改而重新進行測試,這對我們的開發(fā)顯然是有益的。因此,如果我們是在維護或者改造一個原有的系統(tǒng)或模塊,尤其是對它們的了解不是很透徹的時候,就可以選擇增量開發(fā)的模式,這不僅可以大大提高我們的開發(fā)效率,也可以規(guī)避由于對原有代碼的修改而帶來的風(fēng)險。 多態(tài)(Polymorphism) 多態(tài)是又一個重要的基本概念,上面說到了,它是面向?qū)ο蟮娜齻€基本特征之一。究竟什么是多態(tài)呢?我們先看看下面的例子,來幫助理解: Java代碼 1. /汽車接口 2. interfaceCar 3. /汽車名稱 4. StringgetName(); 5. 6. /獲得汽車售價 7. intgetPrice(); 8. 9. 10. /寶馬 11. classBMWimplementsCar 12. publicStringgetName() 13. returnBMW; 14. 15. 16. publicintgetPrice() 17. return300000; 18. 19. 20. 21. /奇瑞QQ 22. classCheryQQimplementsCar 23. publicStringgetName() 24. returnCheryQQ; 25. 26. 27. publicintgetPrice() 28. return20000; 29. 30. 31. 32. /汽車出售店 33. publicclassCarShop 34. /售車收入 35. privateintmoney=0; 36. 37. /賣出一部車 38. publicvoidsellCar(Carcar) 39. System.out.println(車型:+car.getName()+單價:+car.getPrice(); 40. /增加賣出車售價的收入 41. money+=car.getPrice(); 42. 43. 44. /售車總收入 45. publicintgetMoney() 46. returnmoney; 47. 48. 49. publicstaticvoidmain(Stringargs) 50. CarShopaShop=newCarShop(); 51. /賣出一輛寶馬 52. aShop.sellCar(newBMW(); 53. /賣出一輛奇瑞QQ 54. aShop.sellCar(newCheryQQ(); 55. System.out.println(總收入:+aShop.getMoney(); 56. 57. /汽車接口interface Car / 汽車名稱String getName();/ 獲得汽車售價int getPrice();/ 寶馬class BMW implements Car public String getName() return BMW;public int getPrice() return 300000;/ 奇瑞QQclass CheryQQ implements Car public String getName() return CheryQQ;public int getPrice() return 20000;/ 汽車出售店public class CarShop / 售車收入private int money = 0;/ 賣出一部車public void sellCar(Car car) System.out.println(車型: + car.getName() + 單價: + car.getPrice();/ 增加賣出車售價的收入money += car.getPrice();/ 售車總收入public int getMoney() return money;public static void main(String args) CarShop aShop = new CarShop();/ 賣出一輛寶馬aShop.sellCar(new BMW();/ 賣出一輛奇瑞QQaShop.sellCar(new CheryQQ();System.out.println(總收入: + aShop.getMoney();運行結(jié)果: 1. 車型:BMW 單價:300000 2. 車型:CheryQQ 單價:20000 3. 總收入:320000 繼承是多態(tài)得以實現(xiàn)的基礎(chǔ)。從字面上理解,多態(tài)就是一種類型(都是Car類型)表現(xiàn)出多種狀態(tài)(寶馬汽車的名稱是BMW,售價是300000;奇瑞汽車的名稱是CheryQQ,售價是2000)。將一個方法調(diào)用同這個方法所屬的主體(也就是對象或類)關(guān)聯(lián)起來叫做綁定,分前期綁定和后期綁定兩種。下面解釋一下它們的定義: 1. 前期綁定:在程序運行之前進行綁定,由編譯器和連接程序?qū)崿F(xiàn),又叫做靜態(tài)綁定。比如static方法和final方法,注意,這里也包括private方法,因為它是隱式final的。 2. 后期綁定:在運行時根據(jù)對象的類型進行綁定,由方法調(diào)用機制實現(xiàn),因此又叫做動態(tài)綁定,或者運行時綁定。除了前期綁定外的所有方法都屬于后期綁定。 多態(tài)就是在后期綁定這種機制上實現(xiàn)的。多態(tài)給我們帶來的好處是消除了類之間的耦合關(guān)系,使程序更容易擴展。比如在上例中,新增加一種類型汽車的銷售,只需要讓新定義的類繼承Car類并實現(xiàn)它的所有方法,而無需對原有代碼做任何修改,CarShop類的sellCar(Car car)方法就可以處理新的車型了。新增代碼如下: Java代碼 1. /桑塔納汽車 2. classSantanaimplementsCar 3. publicStringgetName() 4. returnSantana; 5. 6. 7. publicintgetPrice() 8. return80000; 9. 10. / 桑塔納汽車class Santana implements Car public String getName() return Santana;public int getPrice() return 80000;重載(overloading)和重寫(overriding) 重載和重寫都是針對方法的概念,在弄清楚這兩個概念之前,我們先來了解一下什么叫方法的型構(gòu)(英文名是signature,有的譯作“簽名”,雖然它被使用的較為廣泛,但是這個翻譯不準(zhǔn)確的)。型構(gòu)就是指方法的組成結(jié)構(gòu),具體包括方法的名稱和參數(shù),涵蓋參數(shù)的數(shù)量、類型以及出現(xiàn)的順序,但是不包括方法的返回值類型,訪問權(quán)限修飾符,以及abstract、static、final等修飾符。比如下面兩個就是具有相同型構(gòu)的方法: Java代碼 1. publicvoidmethod(inti,Strings) 2. /dosomething 3. 4. 5. publicStringmethod(inti,Strings) 6. /dosomething 7. public void method(int i, String s) / do somethingpublic String method(int i, String s) / do something而這兩個就是具有不同型構(gòu)的方法: Java代碼 1. publicvoidmethod(inti,Strings) 2. /dosomething 3. 4. 5. publicvoidmethod(Strings,inti) 6. /dosomething 7. public void method(int i, String s) / do somethingpublic void method(String s, int i) / do something了解完型構(gòu)的概念后我們再來看看重載和重寫,請看它們的定義: 重寫,英文名是overriding,是指在繼承情況下

溫馨提示

  • 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

提交評論