JAVA(1)【基础类型】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中精度最高的数据类型。这两个类支持任意精度的整数和任意精度的浮点数。)

posted @ 2021-03-29 19:37  小拙  阅读(3316)  评论(0编辑  收藏  举报