Java学习之多态
多態(tài)的概念
多態(tài)==晚綁定。
不要把函數(shù)重載理解為多態(tài)。
因?yàn)槎鄳B(tài)是一種運(yùn)行期的行為,不是編譯期的行為。
多態(tài):父類型的引用可以指向子類型的對(duì)象。
比如 Parent p = new Child();
當(dāng)使用多態(tài)方式調(diào)用方法時(shí),首先檢查父類中是否有該方法,如果沒有,則編譯錯(cuò)誤;
如果有,再去調(diào)用子類的該同名方法。
(注意此處,靜態(tài)static方法屬于特殊情況,靜態(tài)方法只能繼承,不能重寫Override,如果子類中定義了同名同形式的靜態(tài)方法,它對(duì)父類方法只起到隱藏的作用。調(diào)用的時(shí)候用誰的引用,則調(diào)用誰的版本。)
(參考學(xué)習(xí)鏈接:http://docs.oracle.com/javase/tutorial/java/IandI/override.html)
如果想要調(diào)用子類中有而父類中沒有的方法,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,如上面的例子中,將p轉(zhuǎn)換為子類Child類型的引用。
因?yàn)楫?dāng)用父類的引用指向子類的對(duì)象,用父類引用調(diào)用方法時(shí),找不到父類中不存在的方法。這時(shí)候需要進(jìn)行向下的類型轉(zhuǎn)換,將父類引用轉(zhuǎn)換為子類引用。?????
?
結(jié)合實(shí)例說明???????????????
下面舉個(gè)例子(有問題的代碼已注釋):
主要講講兩種類型轉(zhuǎn)換和兩種編譯時(shí)候的錯(cuò)誤。
public class PolyTest {public static void main(String[] args){//向上類型轉(zhuǎn)換Cat cat = new Cat();Animal animal = cat;animal.sing();//向下類型轉(zhuǎn)換Animal a = new Cat();Cat c = (Cat)a;c.sing();c.eat();//編譯錯(cuò)誤//用父類引用調(diào)用父類不存在的方法//Animal a1 = new Cat();//a1.eat();//編譯錯(cuò)誤//向下類型轉(zhuǎn)換時(shí)只能轉(zhuǎn)向指向的對(duì)象類型 //Animal a2 = new Cat();//Cat c2 = (Dog)a2; } } class Animal {public void sing(){System.out.println("Animal is singing!");} } class Dog extends Animal {public void sing(){System.out.println("Dog is singing!");} } class Cat extends Animal {public void sing(){System.out.println("Cat is singing!");}public void eat(){System.out.println("Cat is eating!");} }
例子的執(zhí)行結(jié)果:
這段代碼:
?
Cat類中定義了eat()方法,但是Animal類中沒有這個(gè)方法,a1引用是Animal類的,所以找不到,編譯時(shí)出錯(cuò):
?
兩種類型的類型轉(zhuǎn)換
(1)向上類型轉(zhuǎn)換(Upcast):將子類型轉(zhuǎn)換為父類型。
對(duì)于向上的類型轉(zhuǎn)換,不需要顯示指定,即不需要加上前面的小括號(hào)和父類類型名。
?
(2)向下類型轉(zhuǎn)換(Downcast):將父類型轉(zhuǎn)換為子類型。
對(duì)于向下的類型轉(zhuǎn)換,必須要顯式指定,即必須要使用強(qiáng)制類型轉(zhuǎn)換。
?
并且父類型的引用必須指向子類的對(duì)象,即指向誰才能轉(zhuǎn)換成誰。
不然也會(huì)編譯出錯(cuò):
?
?
因?yàn)楦割愐弥赶虻氖荂at類的對(duì)象,而要強(qiáng)制轉(zhuǎn)換成Dog類,這是不可能的。
?
總結(jié)
- 上一篇: 探究PHP底层
- 下一篇: 关于java中多态的理解,涉及到内存空间