摘要:概念所謂多態(tài),就是指一個(gè)引用變量類型在不同的情況下的多種狀態(tài)。需進(jìn)行強(qiáng)制轉(zhuǎn)換有風(fēng)險(xiǎn),最好使用進(jìn)行判斷。繼承在多態(tài)中必須存在有繼承關(guān)系的子類和父類。在中有兩種形式可以實(shí)現(xiàn)多態(tài)繼承和接口。
概念
所謂多態(tài),就是指一個(gè)引用變量(類型)在不同的情況下的多種狀態(tài)。也可以理解為,多態(tài)是指通過指向父類的指針,來調(diào)用在不同子類中實(shí)現(xiàn)的方法。多態(tài)性是對(duì)象多種表現(xiàn)形式的體現(xiàn)
多態(tài)性嚴(yán)格來說有兩種描述形式:
方法的多態(tài)性:
方法的重載
方法的重寫
對(duì)象的多態(tài)性: 指的是發(fā)生在繼承關(guān)系類之中,子類和父類之前的轉(zhuǎn)換問題
向上轉(zhuǎn)型 : 父類 父類對(duì)象 = 子類實(shí)例
向下轉(zhuǎn)型 : 子類 子類對(duì)象 = (子類)父類實(shí)例 。 需進(jìn)行強(qiáng)制轉(zhuǎn)換,有風(fēng)險(xiǎn),最好使用 instanceof 進(jìn)行判斷。
class A { public void fun(){ System.out.println("A "); } } class B extends A{ public void fun(){ //重寫父類方法 System.out.println("B"); } } public class testDemo { public static void main(String[] args) { A a = new B(); //向上轉(zhuǎn)型 B b = (B)a; //向下轉(zhuǎn)型 a.fun(); // a.funb(); //父類中不能調(diào)用子類中擴(kuò)展的方法 b.fun(); System.out.println(a instanceof A); System.out.println(a instanceof B); System.out.println(b instanceof A); System.out.println("**********"); A a2 = new A(); System.out.println(a2 instanceof A); System.out.println(a2 instanceof B); } } 輸出結(jié)果: B B true true true ********** true false
Java實(shí)現(xiàn)多態(tài)有三個(gè)必要條件:繼承、重寫、向上轉(zhuǎn)型。
繼承:在多態(tài)中必須存在有繼承關(guān)系的子類和父類。
重寫:子類對(duì)父類中某些方法進(jìn)行重新定義,在調(diào)用這些方法時(shí)就會(huì)調(diào)用子類的方法。
向上轉(zhuǎn)型:在多態(tài)中需要將子類的引用賦給父類對(duì)象,只有這樣該引用才能夠具備技能調(diào)用父類的方法和子類的方法。
只有滿足了上述三個(gè)條件,我們才能夠在同一個(gè)繼承結(jié)構(gòu)中使用統(tǒng)一的邏輯實(shí)現(xiàn)代碼處理不同的對(duì)象,從而達(dá)到執(zhí)行不同的行為。
對(duì)于Java而言,它多態(tài)的實(shí)現(xiàn)機(jī)制遵循一個(gè)原則:當(dāng)超類對(duì)象引用了子類對(duì)象時(shí),被引用對(duì)象的類型而不是引用變量的類型決定了調(diào)用誰的成員方法,但是這個(gè)被調(diào)用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。
多態(tài)分為編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。其中編輯時(shí)多態(tài)是靜態(tài)的,主要是指方法的重載,它是根據(jù)參數(shù)列表的不同來區(qū)分不同的函數(shù),通過編輯之后會(huì)變成兩個(gè)不同的函數(shù),在運(yùn)行時(shí)談不上多態(tài)。而運(yùn)行時(shí)多態(tài)是動(dòng)態(tài)的,它是通過動(dòng)態(tài)綁定來實(shí)現(xiàn)的,也就是我們所說的多態(tài)性。
在Java中有兩種形式可以實(shí)現(xiàn)多態(tài):繼承和接口。
多態(tài)的優(yōu)點(diǎn)消除類型之間的耦合關(guān)系
可替換性
可擴(kuò)充性
接口性
靈活性
簡(jiǎn)化性
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73555.html
摘要:調(diào)用的是的方法,因?yàn)橄蛏限D(zhuǎn)型為,那么只能調(diào)用類的方法,里參數(shù)有和兩種,所以對(duì)應(yīng)于對(duì)應(yīng)于對(duì)應(yīng)于,由于多態(tài)性,最終調(diào)用的是即由于是的子類,那么可以繼承的所有非方法,當(dāng)然的也在內(nèi),所以,就直接調(diào)用的是即 1.基于繼承覆蓋 子類覆蓋父類的方法,實(shí)現(xiàn)多態(tài) 抽象 子類實(shí)現(xiàn)父類的抽象方法,實(shí)現(xiàn)多態(tài) 2.基于接口 3.案例 摘自http://www.cnblogs.com/chenss... publ...
摘要:多態(tài)性面向?qū)ο笕筇匦苑庋b繼承多態(tài)。面向?qū)ο蠖鄳B(tài)性存在的三個(gè)必要條件繼承重寫父類引用指向子類對(duì)象多態(tài)性的實(shí)現(xiàn)方式重寫與重載靜態(tài)多態(tài)性方法重載方法重載允許類具有多個(gè)相同名稱的方法,但是方法參數(shù)列表不同。 多態(tài)性 面向?qū)ο螅∣OP)三大特性:封裝、繼承、多態(tài)。 多態(tài)性(polymorphism)指同一行為具有多種不同表現(xiàn)形式,在面向?qū)ο蟪绦蛟O(shè)計(jì)中表現(xiàn)為同一消息可以根據(jù)發(fā)送對(duì)象的類型不同,做...
摘要:目錄介紹問題匯總具體問題好消息博客筆記大匯總年月到至今,包括基礎(chǔ)及深入知識(shí)點(diǎn),技術(shù)博客,學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護(hù)并且修正,持續(xù)完善開源的文件是格式的同時(shí)也開源了生活博客,從年 目錄介紹 00.Java問題匯總 01.具體問題 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎(chǔ)及深入知識(shí)點(diǎn),Android技...
摘要:也就是說,一個(gè)實(shí)例變量,在的對(duì)象初始化過程中,最多可以被初始化次。當(dāng)所有必要的類都已經(jīng)裝載結(jié)束,開始執(zhí)行方法體,并用創(chuàng)建對(duì)象。對(duì)子類成員數(shù)據(jù)按照它們聲明的順序初始化,執(zhí)行子類構(gòu)造函數(shù)的其余部分。 類的拷貝和構(gòu)造 C++是默認(rèn)具有拷貝語義的,對(duì)于沒有拷貝運(yùn)算符和拷貝構(gòu)造函數(shù)的類,可以直接進(jìn)行二進(jìn)制拷貝,但是Java并不天生支持深拷貝,它的拷貝只是拷貝在堆上的地址,不同的變量引用的是堆上的...
摘要:具體而言就是高層模塊不依賴于底層模塊,二者都同依賴于抽象抽象不依賴于具體,具體依賴于抽象。 9.接口 9.1 抽象類和抽象方法 抽象類:包含抽象方法的類,自身無法實(shí)例化 抽象方法:僅有聲明,沒有方法體 關(guān)系:抽象方法是抽象類的充分不必要條件,因此抽象類中允許方法實(shí)現(xiàn)和抽象方法同時(shí)存在 語法 // 抽象類 abstract class ClassName{} // 抽象方法 ab...
閱讀 1215·2021-11-10 11:35
閱讀 2953·2021-09-24 10:35
閱讀 2981·2021-09-22 15:38
閱讀 2820·2019-08-30 15:43
閱讀 1355·2019-08-29 18:39
閱讀 2607·2019-08-29 15:22
閱讀 2807·2019-08-28 18:17
閱讀 623·2019-08-26 13:37