【JAVA】【基礎類型】Java中的不可變類型


參考:https://blog.csdn.net/jingjbuer/article/details/42419305】

一、Java中的不可變類型

什么叫不可變類型呢?我們先看兩個例子

樣例1:

public class Test {
  public int num;

  public static void main(String[] args) {
    Test t = new Test();
    t.num = 11;
    
    Test t1 = t;
    t1.num = 111;

    System.out.println(t.num);
  }
}

//輸出結果是111

樣例2:

public class Test_1 {
  public static void main(String[] args) {
    int i = 0;

    int i1 = i;
    i1 = 10;

    System.out.println(i);
  }
}

//輸出結果仍然是0

為什么如上兩個例子返回的結果是不一致的呢?這就涉及到Java中的 可變數據類型不可變數據類型 的概念了。

  1. 不可變數據類型:當該數據類型對應的變量的值發生了改變,那么它對應的內存地址也發生改變,對於這種數據類型,就稱不可變數據類型。即:原有內存地址中的內容不變,為變化后的值分配了新的內存。
  2. 可變數據類型:當該數據類型對應的變量的值發生了改變,那么它對應的內存地址不發生改變,對於這種數據類型,就稱之為可變數據類型。可變數據類型改變時實際上更改了內存中的內容。
  • 如上樣例1中:
    t是Test類型,屬於可變數據類型。對象t和t1的值其實是一個地址,也可以看成一個指向堆內存中某個對象的指針。讓t1=t時,實際上也是讓t1指向t指向的對象,通過t1改變num的值,也就是改變了堆內存中的對象的值,通過t再調用時,num的值自然也是改變后的結果。

  • 如上樣例2中:
    雖然i1=i的時候,i1和i共用0,但是一旦i1賦值10,此時不是將內存中的0改成10,而是又創建一個10,讓i1指向10,而i還是指向0的,所以最后的結果還是0

在Java中,如下這些都是不可變數據類型(對象類型的不可變數據類型也稱之為immutable Objects):
/這個存在爭議,貌似不是(1)所有基本數據類型(boolean、char、byte、short、int、long、float、double)。/
(2)所有基本數據類型的封裝類(Boolean、Char、Byte、Short、Integer、Long、Float、Double)。
(3)String
(4)其他:BigInteger、BigDecimal等 (BigInteger、BigDecimal:Java中精度最高的數據類型。這兩個類支持任意精度的整數和任意精度的浮點數。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM