在Java當(dāng)中父類和子類之間的強制轉(zhuǎn)換

1.從對象的內(nèi)存角度來理解.
假設(shè)現(xiàn)在有一個父類Father,它里面的變量需要占用1M內(nèi)存.有一個它的子類Son,里面的變量需要占用0.5M內(nèi)存.
現(xiàn)在通過代碼來看看內(nèi)存的分配情況:
2.f = new Father();//系統(tǒng)將分配1M內(nèi)存.
Son s = new Son();//系統(tǒng)將分配1.5M內(nèi)存!因為子類中有一個隱藏的引用super會指向父類實例,所以在實例化子類之前會先實例化一個父類,也就是說會先執(zhí)行父類的構(gòu)造函數(shù).由于s中包含了父類的實例,所以s可以調(diào)用父類的方法.
3.Son s1 = s;//s1指向那1.5M的內(nèi)存.
Father f1 = (Father)s;//這時f1會指向那1.5M內(nèi)存中的1M內(nèi)存,即是說,f1只是指向了s中實例的父類實例對象,所以f1只能調(diào)用父類的方法(存儲在1M內(nèi)存中),而不能調(diào)用子類的方法(存儲在0.5M內(nèi)存中).
Son s2 = (Son)f;//這句代碼運行時會報ClassCastException.因為f中只有1M內(nèi)存,而子類的引用都必須要有1.5M的內(nèi)存,所以無法轉(zhuǎn)換.
Son s3 = (Son)f1;//這句可以通過運行,這時s3指向那1.5M的內(nèi)存.由于f1是由s轉(zhuǎn)換過來的,所以它是有1.5M的內(nèi)存的,只是它指向的只有1M內(nèi)存.

然后是我自己讀完的想法:

1, 這句話挺重要的:在子類的構(gòu)造函數(shù)中,子類會隱藏的引用super指向父類實例,所以在實例化子類之前,會先執(zhí)行父類的構(gòu)造函數(shù)。子類對象包含了父類的實例。

2, 在強制轉(zhuǎn)化時,子類可以向父類轉(zhuǎn)化,因為可以忽略一些,然而父類卻不能向子類轉(zhuǎn)化,你不能一句強制轉(zhuǎn)化就讓它憑空增加一些內(nèi)存。通俗的說是一個父親, 永遠不可能去裝兒子的(只有我們的父類對象本身就是用子類new出來的時候, 才可以在將來被強制轉(zhuǎn)換為子類對象.)
Father father= new Son();
Son son = (Son) father;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容