封裝是面向?qū)ο蟮幕A(chǔ); 繼承是在封裝的基礎(chǔ)上,實(shí)現(xiàn)代碼的復(fù)用性;
創(chuàng)新互聯(lián)專注于尤溪企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),商城開(kāi)發(fā)。尤溪網(wǎng)站建設(shè)公司,為尤溪等地區(qū)提供建站服務(wù)。全流程按需求定制設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)而多態(tài)考量的是代碼的豐富度。
多態(tài)的含義:相同的行為,不同的實(shí)現(xiàn)。
(比如:買菜,買青菜買白菜都是買菜行為)
條件:
1.有繼承
2.有同名方法
注意:
1、多態(tài)指的是行為的多樣性,沒(méi)有屬性多態(tài)這一說(shuō);
2、相同的行為指的是同名方法,也就是說(shuō)方法名相同,我們就認(rèn)為這是相同的行為。
由此,我們前面學(xué)習(xí)的方法重載和方法重寫其實(shí)都是(靜態(tài))多態(tài)的表現(xiàn)。
在編譯期間就可以確定要執(zhí)行的是何種類型的對(duì)象以及該對(duì)象的何種行為,運(yùn)行期不會(huì)有改變的情況。
我們?cè)谇懊鎸W(xué)過(guò)的方法的重載和方法的重寫都是屬于靜態(tài)多態(tài)。靜態(tài)多態(tài)雖然有豐富度的體現(xiàn),但是是不夠的,因?yàn)樗诰幾g期就把執(zhí)行效果固定下來(lái)了。而我們以后用得更多的是動(dòng)態(tài)多態(tài)。
動(dòng)態(tài)多態(tài)在運(yùn)行期,根據(jù)綁定對(duì)象的不同,才能確定多態(tài)方法執(zhí)行的效果。
動(dòng)態(tài)多態(tài)是由兩個(gè)技術(shù)合并使用才有的效果:動(dòng)態(tài)綁定技術(shù) + 方法的重寫。 ?
動(dòng)態(tài)綁定技術(shù) 從現(xiàn)象上看效果:本類引用 指向 本類對(duì)象;
父類引用 指向 子類對(duì)象;
在Java當(dāng)中只有這兩種情況,也就是說(shuō)賦值符號(hào)左右兩端如果類型不一致,那么只有后面這種情況。
從內(nèi)存上解釋為什么父類引用可以指向子類對(duì)象呢?
既然是父子關(guān)系,還是在做繼承,那么還是跟內(nèi)存疊加有關(guān)系。
每一個(gè)子類對(duì)象的上半截都是一個(gè)完整的父類對(duì)象部分,當(dāng)父類引用指過(guò)去的時(shí)候,是能夠看到完整的父類對(duì)象信息的。
沒(méi)有繼承關(guān)系的類,不能保證A類引用指到B類對(duì)象,能看到B類對(duì)象中有A類定義的內(nèi)容,所以不允許!
子類引用指向父類對(duì)象的時(shí)候,父類對(duì)象里面沒(méi)有子類特有部分,所以缺失了內(nèi)容,也不允許!
從場(chǎng)景上解釋一個(gè)對(duì)象屬于子類,一定也屬于它的父類。子和父是is-a關(guān)系,這是說(shuō)得通的。
但是一個(gè)對(duì)象屬于父類,你能保證它一定屬于子類嗎?
而沒(méi)有繼承關(guān)系的,那就更說(shuō)不通的了,比如:指鹿為馬。 明明是一個(gè)鹿的對(duì)象,你偏要用馬的引用去指向它,肯定是不對(duì)的。你可以說(shuō)它是動(dòng)物、可以說(shuō)它是寵物、因?yàn)槁筰s-a動(dòng)物;鹿 is-a 寵物;都是可行的,但鹿 is not a 馬。
動(dòng)態(tài)體現(xiàn)在哪兒?如果我們手上現(xiàn)在擁有一個(gè)父類引用,那么我們就不能確定這個(gè)引用到底是指向哪一個(gè)具體的對(duì)象的了。
它既可能指向自己類型的對(duì)象,也可能指向自己的各種子類對(duì)象。
而自己的某個(gè)方法,是可以被子類重寫成不同的實(shí)現(xiàn)效果的。那么用這個(gè)引用執(zhí)行重寫方法,也就不能確定到底重寫前還是重寫后,是A子類重寫后,還是其它子類重寫后的效果了。只有等程序運(yùn)行起來(lái)以后,根據(jù)該引用具體綁定的對(duì)象到底是誰(shuí),才能夠運(yùn)行出具體的效果。--- 這就是動(dòng)態(tài)的體現(xiàn)。
轉(zhuǎn)型技術(shù)賦值符號(hào)左右兩端數(shù)據(jù)類型不一致,就會(huì)發(fā)生數(shù)據(jù)類型轉(zhuǎn)換。
父類引用 = 子類對(duì)象 也是兩端數(shù)據(jù)類型不一致,所以也屬于轉(zhuǎn)型技術(shù)。
基本數(shù)據(jù)類型轉(zhuǎn)型技術(shù)和引用數(shù)據(jù)類型轉(zhuǎn)型技術(shù) 基本數(shù)據(jù)類型轉(zhuǎn)型技術(shù)1、前提:不是所有基本數(shù)據(jù)類型之間都能夠進(jìn)行轉(zhuǎn)型,boolean不參與的;
2、自動(dòng)類型轉(zhuǎn)換 小類型值 賦值給 大類型的變量
強(qiáng)調(diào):這里的大小 是 數(shù)據(jù)類型能表示的范圍的大小,而不是空間的大小。
int num = 'A'; float f = num; double d = 100;
效果:不需要使用任何特殊語(yǔ)法,直接完成類型轉(zhuǎn)換并且賦值成功。
3、強(qiáng)制類型轉(zhuǎn)換 大類型的值 賦值給 小類型的變量
效果:
3-1、直接書寫后,編譯報(bào)錯(cuò);
3-2、使用(目標(biāo)類型)的強(qiáng)轉(zhuǎn)語(yǔ)法,編譯才能夠通過(guò);
3-3、運(yùn)行的效果是有風(fēng)險(xiǎn)性的,精度有可能丟失。
引用數(shù)據(jù)類型轉(zhuǎn)型技術(shù)1、前提:不是所有引用數(shù)據(jù)類型之間都能夠做轉(zhuǎn)型,只有有繼承關(guān)系的類型之間才可以;
2、自動(dòng)類型轉(zhuǎn)換 子類對(duì)象 賦值給 父類引用 子類表示的范圍 是小于 父類表示的范圍,所以仍然是把小的數(shù)據(jù)值交給大的變量。與基本數(shù)據(jù)類型的自動(dòng)轉(zhuǎn)換要求是一摸一樣的。
只是說(shuō)它有另一個(gè)特殊的名字,又叫做“向上轉(zhuǎn)型”而已。因?yàn)樵诶^承樹(shù)上,父類在上,子類在下;
效果:不需要使用任何特殊語(yǔ)法,直接完成類型轉(zhuǎn)換并且賦值成功。
3、強(qiáng)制類型轉(zhuǎn)換 大類型的值 賦值給 小類型的引用? 又被稱為"向下轉(zhuǎn)型".
效果:
1、直接書寫后,編譯報(bào)錯(cuò);
2、使用(目標(biāo)類型)的強(qiáng)轉(zhuǎn)語(yǔ)法,編譯才能夠通過(guò);
3、運(yùn)行的效果是有風(fēng)險(xiǎn)性的,風(fēng)險(xiǎn)性是運(yùn)行時(shí)報(bào)錯(cuò)(ClassCastException),中斷程序的執(zhí)行。
對(duì)風(fēng)險(xiǎn)性探討:
1、我們發(fā)現(xiàn)并不是每次強(qiáng)轉(zhuǎn)都一定成功,那么情況時(shí)如何的呢?
要想強(qiáng)轉(zhuǎn)以后,編譯通過(guò)且運(yùn)行也通過(guò),只有一種情況,那就是:最終的內(nèi)存結(jié)果只能是本類引用指向本類對(duì)象。
2、強(qiáng)轉(zhuǎn)語(yǔ)法只是在編譯期進(jìn)行一個(gè)強(qiáng)制性的語(yǔ)法說(shuō)明,說(shuō)明什么呢?告訴編譯器,我這個(gè)父類引用確實(shí)是指向的某種子類對(duì)象。
3、但是運(yùn)行起來(lái)以后,如果滿足你的強(qiáng)制說(shuō)明,那么沒(méi)有問(wèn)題運(yùn)行成功;如果不滿足你的強(qiáng)制說(shuō)明(欺騙了編譯器),那么就會(huì)運(yùn)行失敗,報(bào)出ClassCastException。
比如:水果類? 香蕉類? 豬肉類? 香蕉類強(qiáng)轉(zhuǎn)水果類? 可以成功? 但是豬肉類和水果類不是is-a關(guān)系,所以豬肉類強(qiáng)轉(zhuǎn) 水果類會(huì)運(yùn)行失敗。
強(qiáng)調(diào):強(qiáng)轉(zhuǎn)語(yǔ)法不是把A類對(duì)象變成B對(duì)象,只是在編譯期達(dá)成的一個(gè)口頭約束而已。
父類引用指向子類對(duì)象,我們能訪問(wèn)什么呢?
1、父類引用只能看到子類對(duì)象從父類繼承而來(lái)的屬性和行為,當(dāng)然要受訪問(wèn)修飾符限制;注意:子類對(duì)象身上是有子類特有屬性和行為的,只是站在父類引用的角度上看不到而已。
2、要想看到,要把引用換成子類引用,這個(gè)時(shí)候要使用強(qiáng)轉(zhuǎn)語(yǔ)法,同時(shí)還必須保證運(yùn)行起來(lái)以后真正給出的對(duì)象是符合強(qiáng)轉(zhuǎn)語(yǔ)法的。
3、特例是在父類中定義,被子類重寫的行為。由于這個(gè)行為是定義在父類中,所以父類引用能看到;而對(duì)象又是子類對(duì)象,所以執(zhí)行的效果是子類重寫后的效果。
練習(xí):書寫一個(gè)寵物類Pet,擁有一個(gè)叫的行為;書寫Pet的兩個(gè)子類Dog和Cat,分別實(shí)現(xiàn)叫的行為。再書寫一個(gè)主人類Master,擁有一個(gè)寵物對(duì)象,主人有一個(gè)行為是喂養(yǎng)feed,在該方法中調(diào)用自己寵物叫的行為。最后,在main方法中測(cè)試。
instanceof在練習(xí)當(dāng)中,我們看到在有的場(chǎng)景里面,確實(shí)會(huì)存在需要強(qiáng)轉(zhuǎn)的情況。但是,強(qiáng)轉(zhuǎn)又有風(fēng)險(xiǎn)度,所以,我們需要先判斷類型是否匹配,這就要用到instanceof了。
instanceof是一個(gè)關(guān)鍵字,也是一個(gè)運(yùn)算符。它是專門用來(lái)判斷一個(gè)對(duì)象是否屬于某個(gè)類型的,運(yùn)算后的結(jié)果是boolean型結(jié)果。
語(yǔ)法: 對(duì)象 instanceof 類型
instanceof是專門用來(lái)規(guī)避強(qiáng)轉(zhuǎn)帶來(lái)的ClassCastException風(fēng)險(xiǎn)的,類似于非空判斷專門用來(lái)解決NullPointerException風(fēng)險(xiǎn)的。
多態(tài)的應(yīng)用多態(tài)參數(shù)
當(dāng)我們?cè)谠O(shè)計(jì)參數(shù)的時(shí)候,把參數(shù)的類型設(shè)計(jì)為父類類型,那么所有的子類對(duì)象都能夠通過(guò)這個(gè)參數(shù),傳遞到這個(gè)方法里面去。
這樣的多態(tài)應(yīng)用帶來(lái)了面向?qū)ο笤O(shè)計(jì)中非常重要的一個(gè)原則:開(kāi)閉原則。
開(kāi)閉原則:Software should be opened for extension, but closed for modification。
軟件對(duì)于擴(kuò)展來(lái)說(shuō)應(yīng)該是開(kāi)放的,對(duì)于修改來(lái)說(shuō)應(yīng)該是關(guān)閉。
也就是說(shuō)好的軟件設(shè)計(jì),應(yīng)該能夠可以隨著業(yè)務(wù)的擴(kuò)展去增加新的功能,但是不應(yīng)該修改已有的功能。
多態(tài)集合
int[] array = new int[10];
Object[] arrayObj = new Object[10];
可以解決數(shù)組只能存放同一數(shù)據(jù)類型元素的問(wèn)題。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
新聞名稱:Java面向?qū)ο蟆净咎卣髦鄳B(tài)】-創(chuàng)新互聯(lián)
本文地址:http://jinyejixie.com/article16/jesdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開(kāi)發(fā)、品牌網(wǎng)站設(shè)計(jì)、營(yíng)銷型網(wǎng)站建設(shè)、外貿(mào)建站、自適應(yīng)網(wǎng)站、全網(wǎng)營(yíng)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容