多態(tài)的基礎(chǔ)語(yǔ)法
3.1、向上轉(zhuǎn)型和向下轉(zhuǎn)型的概念。
向上轉(zhuǎn)型:子--->父 (upcasting)
又被稱(chēng)為自動(dòng)類(lèi)型轉(zhuǎn)換:Animal a = new Cat();
向下轉(zhuǎn)型:父--->子 (downcasting)
又被稱(chēng)為強(qiáng)制類(lèi)型轉(zhuǎn)換:Cat c = (Cat)a; 需要添加強(qiáng)制類(lèi)型轉(zhuǎn)換符。
什么時(shí)候需要向下轉(zhuǎn)型?
需要調(diào)用或者執(zhí)行子類(lèi)對(duì)象中特有的方法。
必須進(jìn)行向下轉(zhuǎn)型,才可以調(diào)用。
向下轉(zhuǎn)型有風(fēng)險(xiǎn)嗎?
容易出現(xiàn)ClassCastException(類(lèi)型轉(zhuǎn)換異常)
怎么避免這個(gè)風(fēng)險(xiǎn)?
instanceof運(yùn)算符,可以在程序運(yùn)行階段動(dòng)態(tài)的判斷某個(gè)引用指向的對(duì)象
是否為某一種類(lèi)型。
養(yǎng)成好習(xí)慣,向下轉(zhuǎn)型之前一定要使用instanceof運(yùn)算符進(jìn)行判斷。
不管是向上轉(zhuǎn)型還是向下轉(zhuǎn)型,首先他們之間必須有繼承關(guān)系,這樣編譯器就不會(huì)報(bào)錯(cuò)。
3.2、什么是多態(tài)。
多種形態(tài),多種狀態(tài),編譯和運(yùn)行有兩個(gè)不同的狀態(tài)。
編譯期叫做靜態(tài)綁定。
運(yùn)行期叫做動(dòng)態(tài)綁定。
Animal a = new Cat();
// 編譯的時(shí)候編譯器發(fā)現(xiàn)a的類(lèi)型是Animal,所以編譯器會(huì)去Animal類(lèi)中找move()方法
// 找到了,綁定,編譯通過(guò)。但是運(yùn)行的時(shí)候和底層堆內(nèi)存當(dāng)中的實(shí)際對(duì)象有關(guān)
// 真正執(zhí)行的時(shí)候會(huì)自動(dòng)調(diào)用“堆內(nèi)存中真實(shí)對(duì)象”的相關(guān)方法。
a.move();
多態(tài)的典型代碼:父類(lèi)型的引用指向子類(lèi)型的對(duì)象。(java中允許這樣寫(xiě)代碼!?。。?/p>
3.3、什么時(shí)候必須進(jìn)行向下轉(zhuǎn)型?
調(diào)用子類(lèi)對(duì)象上特有的方法時(shí)。