decimal 类型数据怎么引用_Java基本数据类型和引用类型
前面的文章有時候會留一些思考題,主要是想讓大家多想想文章的內容,所以沒留答案,評論區回復也是五花八門。寫這篇文章是想再幫大家鞏固一下之前的內容,子曾經說過:“溫故而知新,可以上王者”。Java中一共有四類八種基本數據類型,看下表:
除掉這四類八種基本類型,其它的都是對象,也就是引用類型,包括數組。
來看一段示例代碼:
一個Person類,提供了一個構造方法,一些get/set方法:
下面是測試的main方法:
先看第一句代碼:
方法體里聲明的基本數據類型在棧內存里,我們畫一下
繼續執行以下代碼
對于基本數據類型來說,賦值(=號)就相當于拷貝了一份值,把int1的值100,拷貝給int2,繼續畫圖
int1=500,直接修改int1的值為500,表現如下圖
分別打印int1,int2的值,相信沒有人會答錯,分別是500,100。
再來看數組的初始化
先初始化arr1,當執行到new這個關鍵字,會在堆內存分配內存空間,并把該內存空間的地址賦值給arr1
繼續執行以下代碼
這時候執行如下代碼
雖然只是修改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數組是打印數組里的內容。
如果喜歡本系列文章,請為我點贊或順手分享,您的支持是我繼續下去的動力,您也可以在評論區留言想了解的內容,有機會本專欄會做講解,最后別忘了關注一下我
上一篇: String是一個很普通的類
下一篇: Java自動裝箱/拆箱
總結
以上是生活随笔為你收集整理的decimal 类型数据怎么引用_Java基本数据类型和引用类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存版本号揭秘:A级高性能抢眼,B、C、
- 下一篇: 使命召唤9占内存:细腻画面、震撼剧情、极