java向上轉(zhuǎn)型與向下轉(zhuǎn)型.doc_第1頁
java向上轉(zhuǎn)型與向下轉(zhuǎn)型.doc_第2頁
java向上轉(zhuǎn)型與向下轉(zhuǎn)型.doc_第3頁
java向上轉(zhuǎn)型與向下轉(zhuǎn)型.doc_第4頁
java向上轉(zhuǎn)型與向下轉(zhuǎn)型.doc_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

java向上轉(zhuǎn)型與向下轉(zhuǎn)型java 轉(zhuǎn)型問題其實并不復雜,只要記住一句話:父類引用指向子類對象。什么叫父類引用指向子類對象,且聽我慢慢道來.從2個名詞開始說起:向上轉(zhuǎn)型(upcasting) 、向下轉(zhuǎn)型(downcasting).舉個例子:有2個類,F(xiàn)ather是父類,Son類繼承自Father。Father f1 = new Son();/ 這就叫 upcasting (向上轉(zhuǎn)型)/ 現(xiàn)在f1引用指向一個Son對象Son s1 = (Son)f1;/ 這就叫 downcasting (向下轉(zhuǎn)型)/ 現(xiàn)在f1還是指向Son對象第2個例子:Father f2 = new Father();Son s2 = (Son)f2;/出錯,子類引用不能指向父類對象你或許會問,第1個例子中:Son s1 = (Son)f1;問什么 是正確的呢。很簡單因為f1指向一個子類對象,F(xiàn)ather f1 = new Son(); 子類s1引用當然可以指向子類對象了。而f2 被傳給了一個Father對象,F(xiàn)ather f2 = new Father();子類s1引用不能指向父類對象??偨Y(jié):1。父類引用指向子類對象,而子類引用不能指向父類對象。2。把子類對象直接賦給父類引用叫upcasting向上轉(zhuǎn)型,向上轉(zhuǎn)型不用強制轉(zhuǎn)換。如:Father f1 = new Son();3。把指向子類對象的父類引用賦給子類引用叫向下轉(zhuǎn)型(downcasting),要強制轉(zhuǎn)換。如:f1 就是一個指向子類對象的父類引用。把f1賦給子類引用s1即 Son s1 = (Son)f1;其中f1前面的(Son)必須加上,進行強制轉(zhuǎn)換。一、向上轉(zhuǎn)型。通俗地講即是將子類對象轉(zhuǎn)為父類對象。此處父類對象可以是接口。1,向上轉(zhuǎn)型中的方法調(diào)用。看下面代碼:javaview plaincopyprint?1. packagecom.wensefu.others;2. publicclassAnimal3. 4. publicvoideat()5. System.out.println(animaleatting.);6. 7. 8. classBirdextendsAnimal9. 10. publicvoideat()11. System.out.println(birdeatting.);12. 13. 14. publicvoidfly()15. 16. System.out.println(birdflying.);17. 18. 19. classMain20. 21. publicstaticvoidmain(Stringargs)22. 23. Animalb=newBird();/向上轉(zhuǎn)型24. b.eat();25. /!error:b.fly();b雖指向子類對象,但此時丟失fly()方法26. dosleep(newMale();27. dosleep(newFemale();28. 29. 30. publicstaticvoiddosleep(Humanh)31. h.sleep();32. 33. 34. packagecom.wensefu.others;1. publicclassHuman2. publicvoidsleep()3. System.out.println(Humansleep.);4. 5. 6. classMaleextendsHuman7. Override8. publicvoidsleep()9. System.out.println(Malesleep.);10. 11. 12. classFemaleextendsHuman13. Override14. publicvoidsleep()15. System.out.println(Femalesleep.);16. 17. 18. 注意這里的向上轉(zhuǎn)型:Animal b=new Bird(); /向上轉(zhuǎn)型b.eat();此處將調(diào)用子類的eat()方法。原因:b實際指向的是Bird子類,故調(diào)用時會調(diào)用子類本身的方法。需要注意的是向上轉(zhuǎn)型時b會遺失除與父類對象共有的其他方法。如本例中的fly方法不再為b所有。2,向上轉(zhuǎn)型的好處??瓷厦娴拇a,public static void dosleep(Human h) h.sleep();這里以父類為參數(shù),調(diào)有時用子類作為參數(shù),就是利用了向上轉(zhuǎn)型。這樣使代碼變得簡潔。不然的話,如果dosleep以子類對象為參數(shù),則有多少個子類就需要寫多少個函數(shù)。這也體現(xiàn)了JAVA的抽象編程思想。二、向下轉(zhuǎn)型。與向上轉(zhuǎn)型相反,即是把父類對象轉(zhuǎn)為子類對象。看下面代碼:packagecom.wensefu.other1;1. publicclassGirl2. publicvoidsmile()3. System.out.println(girlsmile().);4. 5. 6. classMMGirlextendsGirl7. 8. Override9. publicvoidsmile()10. 11. System.out.println(MMirlsmilesoundssweet.);12. 13. publicvoidc()14. System.out.println(MMirlc().);15. 16. 17. classMain18. 19. publicstaticvoidmain(Stringargs)20. 21. Girlg1=newMMGirl();/向上轉(zhuǎn)型22. g1.smile();23. 24. MMGirlmmg=(MMGirl)g1;/向下轉(zhuǎn)型,編譯和運行皆不會出錯25. mmg.smile();26. mmg.c();27. 28. 29. Girlg2=newGirl();30. /MMGirlmmg1=(MMGirl)g2;/不安全的向下轉(zhuǎn)型,編譯無錯但會運行會出錯31. /mmg1.smile();32. /mmg1.c();33. 34. if(g2instanceofMMGirl)35. MMGirlmmg1=(MMGirl)g2;36. mmg1.smile();37. mmg1.c();38. 39. 40. 41. Girl g1=new MMGirl(); /向上轉(zhuǎn)型g1.smile();MMGirl mmg=(MMGirl)g1; /向下轉(zhuǎn)型,編譯和運行皆不會出錯這里的向下轉(zhuǎn)型是安全的。因為g1指向的是子類對象。而Girl g2=new Girl();MMGirl mmg1=(MMGirl)g2; /不安全的向下轉(zhuǎn)型,編譯無錯但會運行會出錯運行出錯:Excep

溫馨提示

  • 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

提交評論