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