要理解多態(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)綁定祭玉。
在向下轉(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ì)象段化。