Java基礎-基本型別變數和引用型別變數
前言
每個變數佔據了一定的記憶體位置,宣告一個變數時,就是在告知編譯器這個變數可以存放什麼型別(佔據多少個位元組的記憶體)。
什麼是基本型別變數
一、定義
JAVA語言本身定義的整型、字元型、浮點型和布林型別是基本型別變數,通俗來說可利用關鍵字宣告的變數就是基本型別變數。對於基本型別變數來說,對應記憶體所儲存的值就是基本型別值。
二、八種基本型別變數
1.整型
- byte—佔據1個位元組 範圍:-2^7~2^7-1;
- short –佔據2個位元組 範圍:-2^15~2^15-1;
- int——佔據4個位元組 範圍:-2^31~2^31-1;計算機預設整型為int型別。
- long—-佔據8個位元組 範圍:-2^63~2^63-1;
2.字元型
- char 佔據2個位元組 範圍:0~(2^15) - 1;定義該變數時需要用單引號‘’引用,或者用數字,在計算機中是16位無符號整數形式儲存,unicode全球統一編碼範圍為0-65535,65–A,97–a,48–0,特殊符號需要用\轉義。
3.浮點型
- float 佔據4位元組 範圍:3.4e-45~1.4e38;
double 佔據8個位元組 範圍:4.9e-324~1.8e308;計算機預設浮點型為double型別。
在計算機中,浮點數通常被表示成如下格式:浮點值 = Ms值 × M值×R^E值 |__Ms(符號位)__|____E(階位)____|________M(尾數位)________|
Ms是尾數的符號位(sign bit),即浮點數的符號位,安排在最高一位,其中 0 表示數值為正數,而 1 則表示負數;R是階碼的基數,計算機一般規定為2、8或16,是一個不確定的常數;E 是階碼,緊跟在符號位之後,單精度數為 8 位,雙精度數為 11 位,都含階碼的一位符號位;M 是尾數,在低位部分,佔用n位。
注意:由於計算機儲存方式的原因,所以存在精度丟失的情況,數位電路有更加詳細的解釋。
4.布林型別
- boolean 佔據1位元組 只有兩種值:true/false;所有邏輯條件都是布林值。
引用型別變數
一、定義
引用型別變數(記憶體)儲存的是一個引用(基址),它指向物件在記憶體中的位置(物件的儲存地址)。物件型別都是引用型別變數
二、解析
注意:字串不是基本型別變數,字串“MadJieJie”就相當於構造器new String()那樣的例項,大家可以像指標那樣理解成為引用型別變數實際上儲存的只是地址。
基本型別變數和引用型別變數區別
賦值
將一個變數賦值給另一個變數,則兩者擁有相同的值。
byte a = 1;
byte b = 2;
a=b;
對於基本型別變數而言,就是將一個變數的實際值賦給另一個變數,實際上就是將變數記憶體裡所有的位上的二進位制替換掉。
String object1 = “MadJieJie”;
String object2 = “MadJieJie”;
object1 = object2; //兩者引用值相等之後
當兩者引用值相等之後,object1的引用就指向了object2物件,那麼原來object1的記憶體是不會造成記憶體洩漏的,因為object1物件失去了所有的引用,它會被系統當作垃圾回收,這是JAVA的記憶體回收機制,但請注意,若object1還有其他引用變數指向它就不被回收。
對於引用型別變數而言,就是將一個變數的引用賦給另一個變數,實際上就是替換了物件的基址。
注意:
新手想要判斷它們儲存的字串是否一樣時,往往使用object1 == object2;返回的布林值是true還是false呢?
答案顯然是false,因為不同物件開闢的地址不一樣,Java記憶體分配機制不可能分配已經使用的地址給予新的物件。
我們可以使用equals()方法來比較它們儲存的字串資料是否相同。