本文漏的圖片已經補上,請放心閱讀。數組
前面的文章有時候會留一些思考題,主要是想讓你們多想一想文章的內容,因此沒留答案,評論區回覆也是五花八門。寫這篇文章是想再幫你們鞏固一下以前的內容,子曾經說過:「溫故而知新,能夠上王者」。Java中一共有四類八種基本數據類型,看下錶:post
除掉這四類八種基本類型,其它的都是對象,也就是引用類型,包括數組。學習
來看一段示例代碼:測試
一個Person類,提供了一個構造方法,一些get/set方法:3d
下面是測試的main方法:cdn
先看第一句代碼:對象
方法體裏聲明的基本數據類型在棧內存裏,咱們畫一下blog
繼續執行如下代碼圖片
對於基本數據類型來講,賦值(=號)就至關於拷貝了一份值,把int1的值100,拷貝給int2,繼續畫圖內存
int1=500,直接修改int1的值爲500,表現以下圖
分別打印int1,int2的值,相信沒有人會答錯,分別是500,100。
再來看數組的初始化
先初始化arr1,當執行到new這個關鍵字,會在堆內存分配內存空間,並把該內存空間的地址賦值給arr1。
繼續執行如下代碼
這兒arr2初始化時並無new關鍵字,並不會在堆內存裏新開闢一塊空間,而是把arr1裏存的堆內存地址直接賦值給了arr2,對於引用類型來講,賦值(=號)就至關於拷貝了一分內存地址,也就是說arr1,arr2如今指向了同一塊堆內存,表現形勢以下圖
這時候執行以下代碼
雖然只是修改arr1數組下標位置爲3的值
但因爲數組arr1和數組arr2指向同一塊堆內存,打印arr1[3]和arr2[3]的值,都是8。你答對了嗎?
再來看對象的初始化
當看到這個new,這貨確定在堆內存裏開闢了一塊內存空間,Person裏有一個叫name的String對象,String這個對象有點特殊,雖然沒有new這個關鍵字,但仍是在堆內存中開闢了一塊空間,在String是一個很普通的類一文中已經講解過了,這裏就再也不細講了,String底層是數組實現的,數組也是引用類型,age爲基本數據類型,表現以下圖
上圖中大框裏的內容就是整個Person對象在堆內存中的體現,繼續執行如下代碼
沒有new關鍵字,per2不會在堆內存中新開闢空間,和數組同樣,也是把per1的內存地址直接賦值給了per2
當咱們修改per1的屬性的時候
以下圖兩個紅框裏的內容,給對象(數組也是對象)賦值其實就是至關於引用從新指向一塊堆內存,基本數據類型是直接修改值,表現以下圖
因此,無論打印per1仍是per2的name、age,打印出來的結果都是「李四」、35,這個你也答對了嗎?最後,咱們來驗證一下,結果是否是和文中說的一致。
結果徹底一致,回過頭來看看Java裏的「==」比較符,結果就不難理解了,代碼以下
結果分別是false,true,true,當==兩邊是基本數據類型時,==於比較的是兩邊的兩個值是否相等,當==兩邊是引用類型時比較的是兩個內存地址,也能夠當作是看這兩個引用是否指向堆內存裏的同一塊地址,以下圖
新手在學習Java時,在引用類型上可能常常容易犯錯誤,如本文中所講的arr1,arr2,不少人在寫代碼的時候是想拷貝一份值來用,殊不知道在修改arr1的時候,arr2的值也變了。
本篇內容就講解到這兒,畫圖不易,但願你們之後多想一想變量在內存中的樣子,學習起來能夠事半功倍。四類八種基本數據類型,本文只列舉了int類型,其它的7中基本類型和int的表現形式一致,這裏就不一一舉例了。
最後,說一下前面的文章留的文末思考,首先是讓人疑惑的Java代碼一文中的文末思考
很簡單是false
兩個對象都是新new出來的,開闢了兩塊內存空間,i7和i8的引用不是指向堆內存裏的同一塊地址,所以打印出來是false。
至於Java中的數組一文中的文末思考
相信認真看過本文的朋友都知道打印出來是多少了,還不清楚的,建議從新閱讀本文,直到弄明白爲止。
注:char數組的打印有點特殊,int數組打印是打印出來一個地址,而char數組是打印數組裏的內容。本文中全部代碼已經上傳至公衆號:saysayJava,須要請自行關注下載。
若是喜歡本系列文章,請爲我點贊或順手分享,您的支持是我繼續下去的動力,您也能夠在評論區留言想了解的內容,有機會本專欄會作講解,最後別忘了關注一下我。
轉載無限歡迎,但請註明「做者」和「原文地址」。轉載請在文中保留此段,感謝您對做者版權的尊重。如需商業轉載或刊登,請聯繫做者得到受權