父類引用指向子類對象
,則稱為向上轉(zhuǎn)型(upcasting)
子類引用指向父類對象
,稱為向下轉(zhuǎn)型(downcasting)
如果這個父類對象是子類向上轉(zhuǎn)型而來,則安全,反之不安全末早,避免不安全向下轉(zhuǎn)型的方法是先用isntanceof
運(yùn)算符判斷向下轉(zhuǎn)型的對象是不是向下轉(zhuǎn)型的目標(biāo)對象烟馅。
個人助記方法: 將父類對象賦值給子類引用,那么是往下走然磷,那么就是向下轉(zhuǎn)型郑趁;那么反之,將子類對象賦值給父類引用姿搜,那么就是向上走寡润,就是向上轉(zhuǎn)型。
向上轉(zhuǎn)型啥時候都可以舅柜,向下轉(zhuǎn)型對象必須是向上轉(zhuǎn)型的產(chǎn)物梭纹,也就是要想先下轉(zhuǎn)型,你得先向上轉(zhuǎn)型致份,否則你的操作是不安全的变抽。
代碼背景:Father是父類,Son是子類
Father f = new Son();//向上轉(zhuǎn)型
Son s = (Son)f;//安全向下轉(zhuǎn)型
Father f = new Father();//聲明父類
Son s = (Son)f;//不安全向下轉(zhuǎn)型氮块,編譯會過绍载,運(yùn)行會錯
Father f = new Father();//聲明父類
if(f instanceof Son){
Son s = (Son)f;//安全向下轉(zhuǎn)型,如果f不是Son的實(shí)例滔蝉,那么就不會發(fā)生轉(zhuǎn)型
}
向上轉(zhuǎn)型
击儡,丟失了子類個性化方法,要注意持有什么類型的引用蝠引,更要注意類型引用的指向的對象代碼實(shí)現(xiàn)阳谍。
其實(shí)類型轉(zhuǎn)換主要是在父類和子類之間進(jìn)行,如果你要把兄弟類
相互轉(zhuǎn)換立肘,那么你也會吃到編譯通過边坤,運(yùn)行報(bào)錯
的結(jié)果。
既然說到了向上與向下轉(zhuǎn)型谅年,那么不得不說他們的應(yīng)用場景茧痒,純屬個人愚見,也有參考這位兄臺的文章融蹂,大家可以去拜讀一番旺订。
首先是向上向下轉(zhuǎn)型的使用場景常見的是在集合類中,比如你有一個父類和N個子類超燃,然后你想把這些子類裝進(jìn)一個集合里面区拳,這個時候你肯定不會為每一個子類都去創(chuàng)建一個集合來分別存儲,畢竟這么干會寫很多重復(fù)的代碼意乓,你肯定會用泛型樱调,自然而然的泛型的類型肯定是用父類的類型,因?yàn)槿魏我粋€子類的類型都不能存儲其他兄弟類型,那么在你將各個子類對象塞進(jìn)集合里的時候笆凌,會發(fā)生一個自動向上轉(zhuǎn)型的過程圣猎,意思就是你塞進(jìn)去的每個對象都會由一個父類的引用指向他們,向上轉(zhuǎn)型就丟失了子類特有的方法乞而,那么當(dāng)你從集合里面拿出你的子類實(shí)例送悔,這個時候你的子類其實(shí)根本無法調(diào)用他們作為子類對象的特有的方法,那么有什么辦法可以讓這些子類找回自己特有的方法呢爪模,那就是向下轉(zhuǎn)型了欠啤,這就是基本的向上向下轉(zhuǎn)型的使用場景。如果你有興趣屋灌,可以去看一看Android里面的findViewById這個方法尋找控件之后為什么還要強(qiáng)行向下轉(zhuǎn)型洁段,亦或者你可以去看一看java里面Object類的clone()方法并重寫這個方法,基本上就是這么多了声滥。