前面的文章有時(shí)候會(huì)留一些思考題缕陕,主要是想讓大家多想想文章的內(nèi)容,所以沒(méi)留答案疙挺,評(píng)論區(qū)回復(fù)也是五花八門扛邑。寫(xiě)這篇文章是想再幫大家鞏固一下之前的內(nèi)容,子曾經(jīng)說(shuō)過(guò):“溫故而知新铐然,可以上王者”蔬崩。Java中一共有四類八種基本數(shù)據(jù)類型,看下表:
除掉這四類八種基本類型搀暑,其它的都是對(duì)象沥阳,也就是引用類型,包括數(shù)組自点。
來(lái)看一段示例代碼:
一個(gè)Person類桐罕,提供了一個(gè)構(gòu)造方法,一些get/set方法:
下面是測(cè)試的main方法:
先看第一句代碼:
方法體里聲明的基本數(shù)據(jù)類型在棧內(nèi)存里桂敛,我們畫(huà)一下
繼續(xù)執(zhí)行以下代碼
對(duì)于基本數(shù)據(jù)類型來(lái)說(shuō)功炮,賦值(=號(hào))就相當(dāng)于拷貝了一份值,把int1的值100术唬,拷貝給int2薪伏,繼續(xù)畫(huà)圖
int1=500,直接修改int1的值為500碴开,表現(xiàn)如下圖
分別打印int1毅该,int2的值博秫,相信沒(méi)有人會(huì)答錯(cuò)潦牛,分別是500眶掌,100。
再來(lái)看數(shù)組的初始化
先初始化arr1巴碗,當(dāng)執(zhí)行到new這個(gè)關(guān)鍵字朴爬,會(huì)在堆內(nèi)存分配內(nèi)存空間,并把該內(nèi)存空間的地址賦值給arr1橡淆。
繼續(xù)執(zhí)行以下代碼
這兒arr2初始化時(shí)并沒(méi)有new關(guān)鍵字召噩,并不會(huì)在堆內(nèi)存里新開(kāi)辟一塊空間,而是把a(bǔ)rr1里存的堆內(nèi)存地址直接賦值給了arr2逸爵,對(duì)于引用類型來(lái)說(shuō)具滴,賦值(=號(hào))就相當(dāng)于拷貝了一份內(nèi)存地址,也就是說(shuō)arr1师倔,arr2現(xiàn)在指向了同一塊堆內(nèi)存构韵,表現(xiàn)形勢(shì)如下圖
這時(shí)候執(zhí)行如下代碼
雖然只是修改arr1數(shù)組下標(biāo)位置為3的值
但由于數(shù)組arr1和數(shù)組arr2指向同一塊堆內(nèi)存,打印arr1[3]和arr2[3]的值趋艘,都是8疲恢。你答對(duì)了嗎?
再來(lái)看對(duì)象的初始化
當(dāng)看到這個(gè)new瓷胧,這貨肯定在堆內(nèi)存里開(kāi)辟了一塊內(nèi)存空間显拳,Person里有一個(gè)叫name的String對(duì)象,String這個(gè)對(duì)象有點(diǎn)特殊搓萧,雖然沒(méi)有new這個(gè)關(guān)鍵字杂数,但還是在堆內(nèi)存中開(kāi)辟了一塊空間,在String是一個(gè)很普通的類一文中已經(jīng)講解過(guò)了瘸洛,這里就不再細(xì)講了揍移,String底層是數(shù)組實(shí)現(xiàn)的,數(shù)組也是引用類型货矮,age為基本數(shù)據(jù)類型羊精,表現(xiàn)如下圖
上圖中大框里的內(nèi)容就是整個(gè)Person對(duì)象在堆內(nèi)存中的體現(xiàn),繼續(xù)執(zhí)行以下代碼
沒(méi)有new關(guān)鍵字囚玫,per2不會(huì)在堆內(nèi)存中新開(kāi)辟空間喧锦,和數(shù)組一樣,也是把per1的內(nèi)存地址直接賦值給了per2
當(dāng)我們修改per1的屬性的時(shí)候
如下圖兩個(gè)紅框里的內(nèi)容抓督,給對(duì)象(數(shù)組也是對(duì)象)賦值其實(shí)就是相當(dāng)于引用重新指向一塊堆內(nèi)存燃少,基本數(shù)據(jù)類型是直接修改值,表現(xiàn)如下圖
所以铃在,不管打印per1還是per2的name阵具、age碍遍,打印出來(lái)的結(jié)果都是“李四”、35阳液,這個(gè)你也答對(duì)了嗎怕敬?最后,我們來(lái)驗(yàn)證一下帘皿,結(jié)果是不是和文中說(shuō)的一致东跪。
結(jié)果完全一致,回過(guò)頭來(lái)看看Java里的“==”比較符鹰溜,結(jié)果就不難理解了虽填,代碼如下
結(jié)果分別是false,true曹动,true斋日,當(dāng)==兩邊是基本數(shù)據(jù)類型時(shí),==于比較的是兩邊的兩個(gè)值是否相等墓陈,當(dāng)==兩邊是引用類型時(shí)比較的是兩個(gè)內(nèi)存地址恶守,也可以看成是看這兩個(gè)引用是否指向堆內(nèi)存里的同一塊地址,如下圖
新手在學(xué)習(xí)Java時(shí)跛蛋,在引用類型上可能經(jīng)常容易犯錯(cuò)誤熬的,如本文中所講的arr1,arr2赊级,很多人在寫(xiě)代碼的時(shí)候是想拷貝一份值來(lái)用押框,卻不知道在修改arr1的時(shí)候,arr2的值也變了理逊。
本篇內(nèi)容就講解到這兒橡伞,畫(huà)圖不易,希望大家以后多想想變量在內(nèi)存中的樣子晋被,學(xué)習(xí)起來(lái)可以事半功倍兑徘。四類八種基本數(shù)據(jù)類型,本文只列舉了int類型羡洛,其它的7中基本類型和int的表現(xiàn)形式一致挂脑,這里就不一一舉例了。
轉(zhuǎn)載出自:https://zhuanlan.zhihu.com/p/28654272