成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java面向?qū)ο蟆净咎卣髦鄳B(tài)】-創(chuàng)新互聯(lián)

前言

封裝是面向?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)。


多態(tài)分為兩種: 靜態(tài)多態(tài)

在編譯期間就可以確定要執(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)

成都app開(kāi)發(fā)公司
乐业县| 高碑店市| 抚松县| 丰宁| 兰考县| 渭南市| 萨迦县| 西畴县| 玛曲县| 玉田县| 贵德县| 夹江县| 松江区| 巴林左旗| 德化县| 汾阳市| 永年县| 舞阳县| 天台县| 壤塘县| 平远县| 密山市| 亚东县| 郎溪县| 巫山县| 富川| 盐城市| 沙雅县| 巍山| 龙岩市| 东方市| 共和县| 宕昌县| 遵化市| 胶南市| 芜湖市| 缙云县| 内乡县| 安福县| 安溪县| 特克斯县|