十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
我們知道,在Java語言中有三種循環(huán),分別是while循環(huán),do…while循環(huán)和for循環(huán)。其實(shí),從JDK1.5開始,又引入了一種增強(qiáng)型for循環(huán),這種新型的for循環(huán)主要是用來遍歷數(shù)組或集合的,它的格式非常簡單,下圖展示了增強(qiáng)型for循環(huán)的基本結(jié)構(gòu):
創(chuàng)新互聯(lián)是專業(yè)的景縣網(wǎng)站建設(shè)公司,景縣接單;提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行景縣網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
增強(qiáng)型for循環(huán)被設(shè)計出來就是為了遍歷數(shù)組或者是集合的,所以在循環(huán)中都會指定一個數(shù)組或者是集合。為了方便程序員編碼,增強(qiáng)型for循環(huán)不再通過”下標(biāo)”的形式訪問數(shù)組或集合中的元素,而是把依次從數(shù)組或集合取出元素,并命名為i,這樣,程序員就可以直接操作元素i,從而大大簡化了代碼。為了方便表述,我們把元素i稱之為“當(dāng)前元素”。下面來看一個簡單例子:
在這個增強(qiáng)型for循環(huán)中,指定的數(shù)組叫做array。每次循環(huán),都從array數(shù)組中取出一個元素并命名為i,之后打印元素i的值。這里特意提醒各位小伙伴一下:循環(huán)中出現(xiàn)的”i”并非數(shù)組的下標(biāo),而是一個數(shù)組元素,也就是我們前面所說的”當(dāng)前元素“。這段程序運(yùn)行結(jié)果是”1 2 3 “。如果使用傳統(tǒng)的for循環(huán)也能達(dá)到同樣的效果,代碼如下:
僅從以上兩段代碼的運(yùn)行結(jié)果來看,似乎增強(qiáng)型for循環(huán)和傳統(tǒng)for循環(huán)沒有什么區(qū)別。但是,如果把以上兩段代碼稍作修改,運(yùn)行結(jié)果就會迥然不同。我們把第一段代碼改為如下形式:
為了表述方便,我們把第一段修改后的代碼稱之為”代碼①”。之后,把原來的第二段代碼修改為以下形式:
同理,我們把修改后的第二段代碼稱為”代碼②”?!贝a①”和”代碼②”都是在它們原來的版本基礎(chǔ)之上添加了一段循環(huán)修改數(shù)組元素值的操作。
但是,再次運(yùn)行程序就會發(fā)現(xiàn),”代碼①”的運(yùn)行結(jié)果仍然是”1 2 3 ”,而”代碼②”的運(yùn)行結(jié)果是”3 4 5 ”,也就是說”代碼①”中修改數(shù)組元素值的操作并沒有起作用。這是為什么呢?就是因?yàn)椋骸贝a①”中所謂的”當(dāng)前元素”i其實(shí)是一個作用域僅限于循環(huán)自身的局部變量,每次循環(huán)開始的時候都要重新定義這個變量,并且重新用數(shù)組元素對變量i進(jìn)行賦值。i的值來源于數(shù)組元素,但i本質(zhì)上并不是數(shù)組元素本身,它只是數(shù)組元素的副本,因此修改i并不能改變數(shù)組元素的值。在”代碼①”的第一個循環(huán)中,修改的就是局部變量i的值,而并非數(shù)組元素本身的值。因此,在”代碼①”的第二個循環(huán)中打印”當(dāng)前元素”,實(shí)際上是再次把數(shù)組元素的值賦值給局部變量i并且打印,既然數(shù)組元素的值并未改變,打印出的結(jié)果當(dāng)然是原數(shù)組中的”1 2 3”。
再來看”代碼②”,”代碼②”中的第一個循環(huán)是通過下標(biāo)的直接找到了真實(shí)的數(shù)組元素并且做了修改,每次操作都修改的是實(shí)實(shí)在在的數(shù)組元素,而不是數(shù)組元素的副本!所以程序運(yùn)行到第二個循環(huán)中,打印的是修改后的數(shù)組元素。
以上講解,就是為了讓小伙伴們明白:增強(qiáng)型for循環(huán)中的那個”當(dāng)前元素i”,其實(shí)是一個臨時的局部變量,它只是數(shù)組元素的副本,而非數(shù)組元素本身。但是,我們所舉的例子中,數(shù)組的類型屬于基礎(chǔ)數(shù)據(jù)類型。那么,如果數(shù)組并非基礎(chǔ)類型,而是引用類型,使用增強(qiáng)型for循環(huán)能否修改數(shù)組元素呢?請看以下代碼:
在這段代碼中,首先定義了一個Num類,在Num類中有一個int型的屬性x,我們通過構(gòu)造方法初始化x的值。代碼的Test類中,在主方法里定義了一個Num類型的數(shù)組array,這個數(shù)組顯然是一個引用類型數(shù)據(jù)的數(shù)組。數(shù)組中的引用分別指向了3個Num類型的對象,這三個對象的x屬性值分別是1,2,3。第一個for循環(huán)修改了數(shù)組中每個Num對象的x屬性值,第二個循環(huán)依次打印出每個Num對象的x屬性值,程序運(yùn)行結(jié)果是在控制臺上輸出了”3 4 5”。這說明增強(qiáng)型for循環(huán)在遍歷引用類型的數(shù)組時,通過”當(dāng)前元素”可以修改數(shù)組中元素的狀態(tài),這又是為什么呢?原因其實(shí)也很簡單,雖然”當(dāng)前元素”n本質(zhì)上也只是一個作用域僅限于循環(huán)內(nèi)部的局部引用,但是,每次循環(huán)過程中,它都實(shí)實(shí)在在的指向了一個真實(shí)的數(shù)組元素,所以這個局部引用作用域雖小,但通過它卻能夠完成修改數(shù)組元素對象屬性值的操作。
另外再強(qiáng)調(diào)一點(diǎn),無論增強(qiáng)型for循環(huán)所遍歷的是基礎(chǔ)數(shù)據(jù)類型的數(shù)組,還是引用類型的數(shù)組(或集合),都要保證”當(dāng)前元素”與數(shù)組中真實(shí)元素的“類型兼容性”,否則程序就會報錯。比如說,我們通過一個增強(qiáng)型for循環(huán)操作一個int型數(shù)組時,可以把”當(dāng)前元素”i設(shè)定為double類型,原因就是數(shù)組中int型的元素可以賦值給double類型的局部變量。但反過來,通過增強(qiáng)型for循環(huán)操作一個double型數(shù)組時,不能把”當(dāng)前元素”i的類型設(shè)定為int類型,就是因?yàn)榘凑認(rèn)ava語法,無法完成由double到int的自動轉(zhuǎn)換。同理,操作一個String型數(shù)組時,可以把”當(dāng)前元素”的類型設(shè)定為Object,反之則無法通過編譯。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。