java多態(tài),如何理解父類引用指向子類對(duì)象

要理解多態(tài)性,首先要知道什么是“向上轉(zhuǎn)型”。

轉(zhuǎn)型是在繼承的基礎(chǔ)上而言的,繼承是面向?qū)ο笳Z(yǔ)言中,代碼復(fù)用的一種機(jī)制,通過(guò)繼承,子類可以復(fù)用父類的功能,如果父類不能滿足當(dāng)前子類的需求,則子類可以重寫(xiě)父類中的方法來(lái)加以擴(kuò)展。

向上轉(zhuǎn)型:子類引用的對(duì)象轉(zhuǎn)換為父類類型稱為向上轉(zhuǎn)型。通俗地說(shuō)就是是將子類對(duì)象轉(zhuǎn)為父類對(duì)象。此處父類對(duì)象可以是接口。

我定義了一個(gè)子類Cat,它繼承了Animal類,那么后者就是前者是父類。我可以通過(guò)
Cat c = new Cat(); 實(shí)例化一個(gè)Cat的對(duì)象,這個(gè)不難理解。
但當(dāng)我這樣定義時(shí): Animal a = new Cat();
表示定義了一個(gè)Animal類型的引用,指向新建的Cat類型的對(duì)象。由于Cat是繼承自它的父類Animal,所以Animal類型的引用是可以指向Cat類型的對(duì)象的。

那么這樣做有什么意義呢?因?yàn)樽宇愂菍?duì)父類的一個(gè)改進(jìn)和擴(kuò)充,所以一般子類在功能上較父類更強(qiáng)大,屬性較父類更獨(dú)特, 定義一個(gè)父類類型的引用指向一個(gè)子類的對(duì)象既可以使用子類強(qiáng)大的功能,又可以抽取父類的共性。

所以,父類類型的引用可以調(diào)用父類中定義的所有屬性和方法,而對(duì)于子類中定義而父類中沒(méi)有的方法,它是無(wú)可奈何的; 同時(shí),父類中的一個(gè)方法只有在父類中定義而在子類中沒(méi)有重寫(xiě)的情況下,才可以被父類類型的引用調(diào)用; 對(duì)于父類中定義的方法,如果子類中重寫(xiě)了該方法,那么父類類型的引用將會(huì)調(diào)用子類中的這個(gè)方法,這就是動(dòng)態(tài)連接。也可以叫做動(dòng)態(tài)綁定。

動(dòng)態(tài)綁定是指”在執(zhí)行期間(而非編譯期間)“判斷所引用對(duì)象的實(shí)際類型,根據(jù)實(shí)際的類型調(diào)用其相應(yīng)的方法??慈缦麓a:
那么該程序?qū)?huì)打印出什么樣的結(jié)果呢? 很顯然,應(yīng)該是“CCC”。

在向下轉(zhuǎn)型過(guò)程中,分為兩種情況:
情況一:如果父類引用的對(duì)象如果引用的是指向的子類對(duì)象,那么在向下轉(zhuǎn)型的過(guò)程中是安全的。也就是編譯是不會(huì)出錯(cuò)誤的。
情況二:如果父類引用的對(duì)象是父類本身,那么在向下轉(zhuǎn)型的過(guò)程中是不安全的,編譯不會(huì)出錯(cuò),但是運(yùn)行時(shí)會(huì)出現(xiàn)java.lang.ClassCastException錯(cuò)誤。它可以使用instanceof來(lái)避免出錯(cuò)此類錯(cuò)誤。實(shí)例如下:


對(duì)于多態(tài),可以總結(jié)它為:
1、父類引用可以指向子類對(duì)象,子類引用不能指向父類對(duì)象。
2、把子類對(duì)象直接賦給父類引用叫upcasting向上轉(zhuǎn)型,向上轉(zhuǎn)型不用強(qiáng)制轉(zhuǎn)型。
   如Father father = new Son();
3、把指向子類對(duì)象的父類引用賦給子類引用叫向下轉(zhuǎn)型(downcasting),要強(qiáng)制轉(zhuǎn)型。
   如father就是一個(gè)指向子類對(duì)象的父類引用,把father賦給子類引用son 即Son son =(Son)father;
   其中father前面的(Son)必須添加,進(jìn)行強(qiáng)制轉(zhuǎn)換。
4、upcasting 會(huì)丟失子類特有的方法,但是子類overriding 父類的方法,子類方法有效
5、向上轉(zhuǎn)型的作用,減少重復(fù)代碼,父類為參數(shù),調(diào)有時(shí)用子類作為參數(shù),就是利用了向上轉(zhuǎn)型。這樣使代碼變得簡(jiǎn)潔。體現(xiàn)了JAVA的抽象編程思想。
6、變量不能被重寫(xiě)(覆蓋),”重寫(xiě)“的概念只針對(duì)方法,如果在子類中”重寫(xiě)“了父類中的變量,那么在編譯時(shí)會(huì)報(bào)錯(cuò)。
多態(tài)的3個(gè)必要條件:
1.繼承 2.重寫(xiě) 3.父類引用指向子類對(duì)象。

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

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

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