多態(tài)

多態(tài)簡(jiǎn)介

多態(tài)就是事物存在的多種形態(tài),比如你在大街上看見一只藏獒,你可以說這只藏獒真兇猛蹋嵌,也可以說這只狗真兇猛,還可以說這個(gè)動(dòng)物真兇猛葫隙,以上三種說法其實(shí)都是指的這只藏獒栽烂。

在Java里面,也是存在多態(tài)的,只要全部符合下面這三種情況腺办,就是多態(tài)

????????有繼承

????????有方法重寫

????????有父類引用指向子類對(duì)象

例如下面代碼就構(gòu)成多態(tài)焰手、


定義一個(gè)Animal類

public class Animal{

? ? int num = 10;

? ? publicvoideat(){

? ? ? ? System.out.println("動(dòng)物在吃!");

? ? }

}


定義一個(gè)Cat類繼承Animal

public class Cat extends Animal{

? ? int num = 20;

? ? //重寫? ? publicvoideat(){

? ? ? ? System.out.println("貓吃貓糧");

? ? }

? ? //Cat特有的方法.? ??

????public void move(){

? ? ? ? System.out.println("貓走路很輕盈怀喉!");

? ? }

}

定義一個(gè)Dog類繼承Animal

public class ????DogextendsAnimal{

? ? //重寫? ??

public void eat(){

? ? ? ? System.out.println("狗啃骨頭书妻!");

? ? }

}

上面的三個(gè)類里面已經(jīng)有繼承和方法重寫了,那么父類引用指向子類對(duì)象是什么磺送?請(qǐng)看下面這段代碼:

定義一個(gè)測(cè)試類

public class AnimalTest01{

? ? publicstaticvoidmain(String[] args){

? ? ? ? Cat c1 = new Cat();

? ? ? ? c1.eat();

? ? ? ? Animal a1 = new Cat();//父類引用指向子類對(duì)象? ? ? ??

????????a1.eat();

? ? ? ? System.out.println(a1.num);//因?yàn)槌蓡T變量不存在重寫驻子,所以結(jié)果是10? ? }

}

靜態(tài)綁定和動(dòng)態(tài)綁定

上面代碼中,a1是Animal類型的一個(gè)引用估灿,指向的是其子類Cat的對(duì)象崇呵,這個(gè)就叫做父類引用指向子類對(duì)象。程序在編譯的時(shí)候a1被看做Animal類型馅袁,所以a1.eat()綁定的是Animal類中的eat()方法域慷,這叫做靜態(tài)綁定,程序運(yùn)行時(shí)汗销,a1指向的是堆中的Cat對(duì)象犹褒,而在Cat中對(duì)eat()方法進(jìn)行了重寫,所以在運(yùn)行階段綁定的是Cat中的eat()方法弛针,這叫做動(dòng)態(tài)綁定叠骑。

強(qiáng)制類型轉(zhuǎn)換

上面代碼中子類向父類型進(jìn)行轉(zhuǎn)換,是自動(dòng)類型轉(zhuǎn)換削茁,也叫做向上轉(zhuǎn)型宙枷。還有一種情況是父類向子類型轉(zhuǎn)換,是強(qiáng)制類型轉(zhuǎn)換茧跋,也叫向下轉(zhuǎn)型慰丛。下面的代碼演示了強(qiáng)制類型轉(zhuǎn)換

public class AnimalTest01{

? ? publicstaticvoidmain(String[] args){

? ? ? ? Animal a1 = new Cat();//父類引用指向子類對(duì)象? ? ? ??

//如果要是想執(zhí)行Cat里面的move方法該怎么辦?? ? ??

? //只能強(qiáng)制類型轉(zhuǎn)換,需要加強(qiáng)制類型轉(zhuǎn)換符? ? ? ?

?????Cat c1 = (Cat)a1;

? ? ? ? c1.move();

? ? ? ? Animal a2 = new Dog(); //向上轉(zhuǎn)型.? ? ??

? //強(qiáng)制類型轉(zhuǎn)換? ? ? ??

//Cat c2 = (Cat)a2; //會(huì)報(bào)錯(cuò) java.lang.ClassCastException? ?

?}

}


instanceof關(guān)鍵字

上面的代碼里面將一個(gè)指向Dog對(duì)象的Animal引用a2進(jìn)行強(qiáng)制轉(zhuǎn)換成Cat類型時(shí)報(bào)出了ClassCastException類轉(zhuǎn)型錯(cuò)誤瘾杭,開發(fā)中要是想避免這種錯(cuò)誤需要使用instanceof來判斷一下诅病。

public classAnimalTest01{

? ? publicstaticvoidmain(String[] args){

? ? ? ? Animal a1 = new Cat();//父類引用指向子類對(duì)象? ? ? ??

//如果要是想執(zhí)行Cat里面的move方法該怎么辦?? ? ? ??

//只能強(qiáng)制類型轉(zhuǎn)換,需要加強(qiáng)制類型轉(zhuǎn)換符? ? ? ? Cat c1 = (Cat)a1;

? ? ? ? c1.move();

? ? ? ? Animal a2 = new Dog(); //向上轉(zhuǎn)型.? ? ? ??

//進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí)粥烁,需要先使用instanceof進(jìn)行判斷贤笆,避免ClassCastException? ? ? ??

if(a2 instanceof Cat){

? ? ? ? ? ? //強(qiáng)制類型轉(zhuǎn)換? ? ? ? ? ??

????????????Cat c2 = (Cat)a2;

? ? ? ? }

? ? }? ?

}


多態(tài)的優(yōu)點(diǎn)

????????提高了程序的擴(kuò)展性

????????降低了代碼之間的耦合

請(qǐng)看下面示例:

新建一個(gè)Car類

class Car{

? ? publicvoidrun(){

? ? ? ? System.out.println("汽車在跑");

? ? }

}


創(chuàng)建一個(gè)Benz類繼承Car

classBenzextendsCar{

? ? publicvoidrun(){

? ? ? ? System.out.println("奔馳汽車在跑");

? ? }

}


創(chuàng)建一個(gè)BMW類繼承Car

classBMWextendsCar{

? ? publicvoidrun(){

? ? ? ? System.out.println("寶馬汽車在跑");

? ? }

}

創(chuàng)建一個(gè)Person類用來開車

class Person {

? ? /*

? ? public void drive(Benz bc){

? ? ? ? bc.run();

? ? }

? ? 奔馳汽車壞了,再重新創(chuàng)建一個(gè)開寶馬汽車的方法

? ? public void drive(BMW bm){

? ? ? ? bm.run();

? ? }

? ? */? ??

//上面代碼擴(kuò)展性太差页徐,每新增加一種品牌的汽車就需要再寫一個(gè)方法? ? //將參數(shù)修改為Car類型苏潜,這樣不論增加什么樣的品牌汽車,都可以調(diào)用這個(gè)方法? ?

?publicvoiddrive(Car c){

? ? ? ? c.run();

? ? }

}


創(chuàng)建一個(gè)測(cè)試類

public class Test01 {

? ? publicstaticvoidmain(String[] args){

? ? ? ? Person james = new Person();

? ? ? ? Benz bc = new Benz();

? ? ? ? james.drive(bc);

? ? ? ? BMW bm = new BMW();? ?

? ? ? ? james.drive(bm);

? ? }

}


在工作當(dāng)中盡量面向抽象編程变勇,不要面向具體編程恤左。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贴唇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子飞袋,更是在濱河造成了極大的恐慌戳气,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巧鸭,死亡現(xiàn)場(chǎng)離奇詭異瓶您,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纲仍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門呀袱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人郑叠,你說我怎么就攤上這事夜赵。” “怎么了乡革?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵寇僧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我沸版,道長(zhǎng)嘁傀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任视粮,我火速辦了婚禮细办,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蕾殴。我一直安慰自己蟹腾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布区宇。 她就那樣靜靜地躺著,像睡著了一般值戳。 火紅的嫁衣襯著肌膚如雪议谷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天堕虹,我揣著相機(jī)與錄音卧晓,去河邊找鬼。 笑死赴捞,一個(gè)胖子當(dāng)著我的面吹牛逼裆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赦政,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胜宇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼耀怜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桐愉,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤财破,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后从诲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體左痢,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年系洛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俊性。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡描扯,死狀恐怖定页,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荆烈,我是刑警寧澤拯勉,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站憔购,受9級(jí)特大地震影響宫峦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玫鸟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一导绷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屎飘,春花似錦妥曲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至押桃,卻和暖如春葵萎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唱凯。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工羡忘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磕昼。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓卷雕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親票从。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漫雕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容