欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java多態(tài)-創(chuàng)新互聯(lián)

多態(tài)

多態(tài)相對(duì)于封裝和繼承這兩個(gè)名詞就不是那么生活化了。這個(gè)詞最早是一個(gè)生物的專(zhuān)業(yè)用詞,它的指的是同一個(gè)物種在不同的環(huán)境當(dāng)中可能出現(xiàn)的多樣化表現(xiàn)。那么衍生到了面向?qū)ο缶幊讨校暮x呢,我們用一句經(jīng)典來(lái)話來(lái)描述:相同的行為,不同的實(shí)現(xiàn)。

成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),藤縣網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:藤縣等地區(qū)。藤縣做網(wǎng)站價(jià)格咨詢(xún):18982081108

1、多態(tài)指的是行為的多樣性,沒(méi)有屬性多態(tài)這一說(shuō);

2、相同的行為指的是同名方法,也就是說(shuō)方法名相同,我們就認(rèn)為這是相同的行為。 由此,我們前面學(xué)習(xí)的方法重載和方法重寫(xiě)其實(shí)都是多態(tài)的表現(xiàn)。

最近面試看到的:屬性能不能重寫(xiě)?1、首先這個(gè)說(shuō)法不專(zhuān)業(yè),重寫(xiě)特指的是方法,但是它要描述的意思其實(shí)我們懂,那就是父類(lèi)中定義了一個(gè)屬性,子類(lèi)能不能再定義一個(gè)同名屬性把它給覆蓋掉;

2、在語(yǔ)法上,這是可以的,不會(huì)報(bào)錯(cuò)。但是子類(lèi)定義的屬性是不會(huì)把父類(lèi)定義的屬性給覆蓋掉;而是兩個(gè)屬性同時(shí)存在于對(duì)象身上,父類(lèi)定義的存在于子類(lèi)對(duì)象的父類(lèi)對(duì)象部分(上半截),子類(lèi)定義的存在于子類(lèi)對(duì)象的子類(lèi)特有部分(下半截)。那么,如何區(qū)分呢?用this.訪問(wèn)子類(lèi)定義的該屬性;用super.訪問(wèn)父類(lèi)定義的該屬性。

3、在實(shí)際場(chǎng)景中,這種設(shè)計(jì)是沒(méi)有意義的。因?yàn)楦割?lèi)定義了一個(gè)屬性,子類(lèi)通過(guò)繼承自動(dòng)擁有了這個(gè)屬性,那么子類(lèi)再去定義一個(gè)一摸一樣的屬性是沒(méi)有任何意義的,屬于重復(fù)勞動(dòng)。這是屬于子類(lèi)的設(shè)計(jì)人員沒(méi)有理解父類(lèi)設(shè)計(jì)的意圖。

多態(tài)的意義

封裝是面向?qū)ο蟮幕A(chǔ); 繼承是在封裝的基礎(chǔ)上,實(shí)現(xiàn)代碼的復(fù)用性; 多態(tài)考量的是代碼的豐富度。

多態(tài)分為兩種: 1、靜態(tài)多態(tài);2、動(dòng)態(tài)多態(tài)。

這里的靜態(tài)和我們前面學(xué)習(xí)的static關(guān)鍵字沒(méi)有關(guān)系,它描述的是:在編譯期既能確定某個(gè)多態(tài)方法的具體執(zhí)行效果; 這里的動(dòng)態(tài)多態(tài)是指在運(yùn)行期,根據(jù)綁定對(duì)象的不同,才能確定多態(tài)方法執(zhí)行的效果。

我們?cè)谇懊鎸W(xué)過(guò)的方法的重載和方法的重寫(xiě)都是屬于靜態(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)是由兩個(gè)技術(shù)合并使用才有的效果:動(dòng)態(tài)綁定技術(shù) + 方法的重寫(xiě)。

動(dòng)態(tài)綁定技術(shù)

首先我們從現(xiàn)象上來(lái)看一個(gè)效果: 本類(lèi)引用 指向 本類(lèi)對(duì)象; 父類(lèi)引用 指向 子類(lèi)對(duì)象;

在Java當(dāng)中只有這兩種情況,也就是說(shuō)賦值符號(hào)左右兩端如果類(lèi)型不一致,那么只有后面這種情況。

從內(nèi)存上解釋

為什么父類(lèi)引用可以指向子類(lèi)對(duì)象呢? 既然是父子關(guān)系,還是在做繼承,那么還是跟內(nèi)存疊加有關(guān)系。每一個(gè)子類(lèi)對(duì)象的上半截都是一個(gè)完整的父類(lèi)對(duì)象部分,當(dāng)父類(lèi)引用指過(guò)去的時(shí)候,是能夠看到完整的父類(lèi)對(duì)象信息的。

沒(méi)有繼承關(guān)系的類(lèi),不能保證A類(lèi)引用指到B類(lèi)對(duì)象,能看到B類(lèi)對(duì)象中有A類(lèi)定義的內(nèi)容,所以不允許!

子類(lèi)引用指向父類(lèi)對(duì)象的時(shí)候,父類(lèi)對(duì)象里面沒(méi)有子類(lèi)特有部分,所以缺失了內(nèi)容,也不允許!

從場(chǎng)景上解釋

一個(gè)對(duì)象屬于子類(lèi),一定也屬于它的父類(lèi)。子和父是is-a關(guān)系,這是說(shuō)得通的。

但是一個(gè)對(duì)象屬于父類(lèi),你能保證它一定屬于子類(lèi)嗎?

而沒(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è)父類(lèi)引用,那么我們就不能確定這個(gè)引用到底是指向哪一個(gè)具體的對(duì)象的了。

它既可能指向自己類(lèi)型的對(duì)象,也可能指向自己的各種子類(lèi)對(duì)象。而自己的某個(gè)方法,是可以被子類(lèi)重寫(xiě)成不同的實(shí)現(xiàn)效果的。那么用這個(gè)引用執(zhí)行重寫(xiě)方法,也就不能確定到底重寫(xiě)前還是重寫(xiě)后,是A子類(lèi)重寫(xiě)后,還是其它子類(lèi)重寫(xiě)后的效果了。只有等程序運(yùn)行起來(lái)以后,根據(jù)該引用具體綁定的對(duì)象到底是誰(shuí),才能夠運(yùn)行出具體的效果。--- 這就是動(dòng)態(tài)的體現(xiàn)。

語(yǔ)法細(xì)節(jié)

轉(zhuǎn)型技術(shù)

賦值符號(hào)左右兩端數(shù)據(jù)類(lèi)型不一致,就會(huì)發(fā)生數(shù)據(jù)類(lèi)型轉(zhuǎn)換。 父類(lèi)引用 = 子類(lèi)對(duì)象 也是兩端數(shù)據(jù)類(lèi)型不一致,所以也屬于轉(zhuǎn)型技術(shù)。

我們用我們前面學(xué)習(xí)的基本數(shù)據(jù)類(lèi)型轉(zhuǎn)型技術(shù)去推衍現(xiàn)在的引用數(shù)據(jù)類(lèi)型的轉(zhuǎn)型技術(shù)。

基本數(shù)據(jù)類(lèi)型轉(zhuǎn)型技術(shù)

1、前提:不是所有基本數(shù)據(jù)類(lèi)型之間都能夠進(jìn)行轉(zhuǎn)型,boolean不參與的;

2、自動(dòng)類(lèi)型轉(zhuǎn)換 小類(lèi)型值 賦值給 大類(lèi)型的變量強(qiáng)調(diào):這里的大小 是 數(shù)據(jù)類(lèi)型能表示的范圍的大小,而不是空間的大小。

int num = 'A'; float f = num; double d = 100;

效果:不需要使用任何特殊語(yǔ)法,直接完成類(lèi)型轉(zhuǎn)換并且賦值成功。

3、強(qiáng)制類(lèi)型轉(zhuǎn)換 大類(lèi)型的值 賦值給 小類(lèi)型的變量

效果: 3-1、直接書(shū)寫(xiě)后,編譯報(bào)錯(cuò); 3-2、使用(目標(biāo)類(lèi)型)的強(qiáng)轉(zhuǎn)語(yǔ)法,編譯才能夠通過(guò); 3-3、運(yùn)行的效果是有風(fēng)險(xiǎn)性的,精度有可能丟失。

引用數(shù)據(jù)類(lèi)型轉(zhuǎn)型技術(shù)

1、前提:不是所有引用數(shù)據(jù)類(lèi)型之間都能夠做轉(zhuǎn)型,只有有繼承關(guān)系的類(lèi)型之間才可以;

2、自動(dòng)類(lèi)型轉(zhuǎn)換 子類(lèi)對(duì)象 賦值給 父類(lèi)引用 子類(lèi)表示的范圍 是小于 父類(lèi)表示的范圍,所以仍然是把小的數(shù)據(jù)值交給大的變量。與基本數(shù)據(jù)類(lèi)型的自動(dòng)轉(zhuǎn)換要求是一摸一樣的。

只是說(shuō)它有另一個(gè)特殊的名字,又叫做“向上轉(zhuǎn)型”而已。因?yàn)樵诶^承樹(shù)上,父類(lèi)在上,子類(lèi)在下;

效果:不需要使用任何特殊語(yǔ)法,直接完成類(lèi)型轉(zhuǎn)換并且賦值成功。

3、強(qiáng)制類(lèi)型轉(zhuǎn)換 大類(lèi)型的值 賦值給 小類(lèi)型的引用

又被稱(chēng)為"向下轉(zhuǎn)型".

效果: 1、直接書(shū)寫(xiě)后,編譯報(bào)錯(cuò); 2、使用(目標(biāo)類(lèi)型)的強(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é)果只能是本類(lèi)引用指向本類(lèi)對(duì)象。

2、強(qiáng)轉(zhuǎn)語(yǔ)法只是在編譯期進(jìn)行一個(gè)強(qiáng)制性的語(yǔ)法說(shuō)明,說(shuō)明什么呢?告訴編譯器,我這個(gè)父類(lèi)引用確實(shí)是指向的某種子類(lèi)對(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)調(diào):強(qiáng)轉(zhuǎn)語(yǔ)法不是把A類(lèi)對(duì)象變成B對(duì)象,只是在編譯期達(dá)成的一個(gè)口頭約束而已。

父類(lèi)引用指向子類(lèi)對(duì)象,我們能訪問(wèn)什么呢?

1、父類(lèi)引用只能看到子類(lèi)對(duì)象從父類(lèi)繼承而來(lái)的屬性和行為,當(dāng)然要受訪問(wèn)修飾符限制;注意:子類(lèi)對(duì)象身上是有子類(lèi)特有屬性和行為的,只是站在父類(lèi)引用的角度上看不到而已。

2、要想看到,要把引用換成子類(lèi)引用,這個(gè)時(shí)候要使用強(qiáng)轉(zhuǎn)語(yǔ)法,同時(shí)還必須保證運(yùn)行起來(lái)以后真正給出的對(duì)象是符合強(qiáng)轉(zhuǎn)語(yǔ)法的。

3、特例是在父類(lèi)中定義,被子類(lèi)重寫(xiě)的行為。由于這個(gè)行為是定義在父類(lèi)中,所以父類(lèi)引用能看到;而對(duì)象又是子類(lèi)對(duì)象,所以執(zhí)行的效果是子類(lèi)重寫(xiě)后的效果。

練習(xí):書(shū)寫(xiě)一個(gè)寵物類(lèi)Pet,擁有一個(gè)叫的行為;書(shū)寫(xiě)Pet的兩個(gè)子類(lèi)Dog和Cat,分別實(shí)現(xiàn)叫的行為。再書(shū)寫(xiě)一個(gè)主人類(lèi)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)度,所以,我們需要先判斷類(lèi)型是否匹配,這就要用到instanceof了。

instanceof是一個(gè)關(guān)鍵字,也是一個(gè)運(yùn)算符。它是專(zhuān)門(mén)用來(lái)判斷一個(gè)對(duì)象是否屬于某個(gè)類(lèi)型的,運(yùn)算后的結(jié)果是boolean型結(jié)果。

語(yǔ)法: 對(duì)象 instanceof 類(lèi)型

instanceof是專(zhuān)門(mén)用來(lái)規(guī)避強(qiáng)轉(zhuǎn)帶來(lái)的ClassCastException風(fēng)險(xiǎn)的,類(lèi)似于非空判斷專(zhuān)門(mén)用來(lái)解決NullPointerException風(fēng)險(xiǎn)的。

多態(tài)的應(yīng)用

多態(tài)參數(shù)

當(dāng)我們?cè)谠O(shè)計(jì)參數(shù)的時(shí)候,把參數(shù)的類(lèi)型設(shè)計(jì)為父類(lèi)類(lèi)型,那么所有的子類(lèi)對(duì)象都能夠通過(guò)這個(gè)參數(shù),傳遞到這個(gè)方法里面去。

?
public void cure(角色 r){
?
 ? ?if(r instanceof 士兵){
 ? ?
 ?  }else if(.....){
 ? ?
 ?  }
?
}
?

這樣的多態(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ù)類(lèi)型元素的問(wèn)題。

補(bǔ)一下 switch的新語(yǔ)法 var關(guān)鍵字

Java語(yǔ)言和JavaScript語(yǔ)言有一個(gè)很重要的區(qū)別: Java語(yǔ)言是強(qiáng)類(lèi)型的編程語(yǔ)言;而JS是弱類(lèi)型的。

int num = 10;
String msg = "hello";
var num = 10;
var name = "zhang3";
var pi = 3.14;
?
num = "hello";
?

在15年左右的時(shí)候,Java想去學(xué)習(xí)JS的這種聲明變量的簡(jiǎn)便性,所以它也引入了var關(guān)鍵字來(lái)聲明變量。

但問(wèn)題是,Java本身是強(qiáng)類(lèi)型的,引入了以后又不能改變它的強(qiáng)類(lèi)型本質(zhì),所以導(dǎo)致這個(gè)關(guān)鍵字不倫不類(lèi)有很多限制。

1、必須要對(duì)var聲明的變量馬上賦值,因?yàn)榫幾g器是根據(jù)這個(gè)賦的值的類(lèi)型才能判定這個(gè)變量是什么數(shù)據(jù)類(lèi)型的;

2、一旦賦值成功后,這個(gè)變量的類(lèi)型就被確定了,后面也不能更改,也不能存放其它類(lèi)型的數(shù)據(jù)值;

3、var聲明的變量只能是局部變量,不能聲明為屬性的類(lèi)型,也不能聲明為參數(shù)的類(lèi)型。

4、所以在java中這個(gè)var變量的使用就沒(méi)有啥意義了。 唯一的意義可能僅僅在于如果一個(gè)局部變量的類(lèi)型名很長(zhǎng)的時(shí)候,可以幫助我們少寫(xiě)點(diǎ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)查看詳情吧

文章名稱(chēng):Java多態(tài)-創(chuàng)新互聯(lián)
文章出自:http://www.chinadenli.net/article24/jgpje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作品牌網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)網(wǎng)站改版網(wǎng)頁(yè)設(shè)計(jì)公司企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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)

外貿(mào)網(wǎng)站制作