Java向上轉(zhuǎn)型和向下轉(zhuǎn)型的區(qū)別說明
向上轉(zhuǎn)型和向下轉(zhuǎn)型的區(qū)別
前言:
- 向上轉(zhuǎn)型:父類引用類型指向了子類的實(shí)例對象,此時無法使用子類里的成員變量以及方法。
- 向下轉(zhuǎn)型:通過引用類型強(qiáng)轉(zhuǎn),恢復(fù)了子類的成員變量以及方法。
1.代碼實(shí)現(xiàn)
可以發(fā)現(xiàn),父類雖然指向了子類的實(shí)例對象,但是并不能調(diào)用子類對象的方法,編譯器報錯。此時我們可以看作被隱藏了,那么怎樣才可以把被隱藏的方法放出來呢?此時就需要向下轉(zhuǎn)型。
2.實(shí)現(xiàn)向下轉(zhuǎn)型
將a強(qiáng)轉(zhuǎn)為Son引用類型。
((Son)a).sleep(); //調(diào)用子類的sleep方法
3.此時執(zhí)行程序
成功向下轉(zhuǎn)型,那么這樣有什么作用呢?
其實(shí),無論是上轉(zhuǎn)還是下轉(zhuǎn)都是為了讓類的使用范圍和適用范圍發(fā)生變化,以便操作不同范圍的變量或者方法。
這樣其實(shí)就是一個java的繼承多態(tài),利于程序擴(kuò)展。
我們需要這種設(shè)計方式,才會寫出更易維護(hù)、簡潔的代碼。
簡單認(rèn)識向上轉(zhuǎn)型和向下轉(zhuǎn)型
向上轉(zhuǎn)型:父類引用指向子類對象
例如:子類student繼承了父類person
Person person = new Student();
向上轉(zhuǎn)型后的變化
關(guān)于方法:person可以調(diào)用子類和父類公用的方法(如果子類重寫了父類的方法,則調(diào)用子類的方法),子類特有的方法無法調(diào)用。
關(guān)于屬性: person可以調(diào)用父類的屬性,不可以調(diào)用子類的屬性。
向上轉(zhuǎn)型的作用
減少一些重復(fù)的代碼
對象實(shí)例化的時候可以根據(jù)不同需求實(shí)例化不同的對象
向下轉(zhuǎn)型:子類引用指向父類對象
Father f=new Son() //先向上轉(zhuǎn)型 Son s=(Son) f;//再進(jìn)行向下轉(zhuǎn)型,進(jìn)行強(qiáng)制轉(zhuǎn)換,子類引用s,父類引用f
向下轉(zhuǎn)型的條件:先向上轉(zhuǎn)型,再向下轉(zhuǎn)型。沒有經(jīng)過向上轉(zhuǎn)型,會提示編譯錯誤。
向下轉(zhuǎn)型后的變化
關(guān)于方法:可以調(diào)用子類的所有方法,和屬性,類型轉(zhuǎn)為子類
關(guān)于屬性:調(diào)用的屬性為子類的屬性。
向下轉(zhuǎn)型的作用:向上轉(zhuǎn)型時 ,會遺失子類對象獨(dú)有的其他方法;可以通過向下轉(zhuǎn)型在重新轉(zhuǎn)回。
這種轉(zhuǎn)型可能存在轉(zhuǎn)型失敗地風(fēng)險,因為父類地范圍更廣,如果不確定父類對象就是該子類的對象,不推薦使用向下轉(zhuǎn)型。
Person person = new Student(); Teacher teacher = (Teacher) person; // 不安全
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java利用線程工廠監(jiān)控線程池的實(shí)現(xiàn)示例
這篇文章主要介紹了Java利用線程工廠監(jiān)控線程池的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04java底層AQS實(shí)現(xiàn)類ReentrantLock鎖的構(gòu)成及源碼解析
本章我們就要來學(xué)習(xí)一下第一個?AQS?的實(shí)現(xiàn)類:ReentrantLock,看看其底層是如何組合?AQS?,實(shí)現(xiàn)了自己的那些功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03java 日期各種格式之間的相互轉(zhuǎn)換實(shí)例代碼
這篇文章主要介紹了java 日期各種格式之間的相互轉(zhuǎn)換實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02spring boot項目同時傳遞參數(shù)和文件的多種方式代碼演示
這篇文章主要介紹了spring boot項目同時傳遞參數(shù)和文件的多種方式,在開發(fā)接口中,遇到了需要同時接收參數(shù)和文件的情況,可以有多種方式實(shí)現(xiàn)文件+參數(shù)的接收,這里基于spring boot 3 + vue 3 + axios,做一個簡單的代碼演示,需要的朋友可以參考下2023-06-06Vue結(jié)合Springboot實(shí)現(xiàn)用戶列表單頁面(前后端分離)
本文主要介紹了Vue結(jié)合Springboot實(shí)現(xiàn)用戶列表單頁面,可以實(shí)現(xiàn)簡單的查詢,刪除,修改,和添加用戶信息功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07如何在Java中獲取當(dāng)前年份(實(shí)例代碼)
在Java語言中獲取當(dāng)前年份有幾種方法:使用java.util包下的Calendar類,使用java.time包下的LocalDate類或者使用java.text包下的SimpleDateFormat類,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-11-11String轉(zhuǎn)BigDecimal,BigDecimal常用操作,以及避免踩坑記錄
這篇文章主要介紹了String轉(zhuǎn)BigDecimal,BigDecimal常用操作,以及避免踩坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07