今天在看韩老师视频p466和p470遇到一个疑问,
1 在p466中 1) String 有属性 private final char value[]; 用于存放字符串内容
2) 一定要注意:value 是一个 final 类型, 不可以修改:即 value 不能指向
String name = "jack";
name = "tom";
final char[] value = {'a','b','c'};
char[] v2 = {'t','o','m'};
value[0] = 'H';
//value = v2; 不可以修改 value 地址
2 在p470中 1) String是一个fanal类,代表不可变的字符序列
2)字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的。(又叫 不可变对象)
老师举了下面这个例子
当看到这就有了疑问 这和上面的例子不是矛盾了吗
在这里 对比1.2和2.2 就产生了疑问 到底可不可变 就上网搜了些资料
首先弄明白这点一个是final数组 一个是String类
先说数组:
都说final不可修改,为什么这边final数组的值却被改了呢,
final修饰的变量可以这么理解:修饰基本类型值不变,修饰引用类型只是引用不可变,但是引用所指向的地址的内容可以改变。(不能更改这个地址了,但数组里面的东西我是能够修改的。)
String不可变对象
String s = new String("he");
s = "ha";
在这里代码输出s 是 ha,发现这不是又变了吗 通过debug可以发现这里的he 和 ha 地址并不一样
初学java 实际上这个问题是因为对 对象这个词不是很了解
在s = "he";这里 s只是对象的引用换句话说就是 s只是存了"he"的地址 对象的地址
当s又=ha的时候 s存的地址由he换成ha,he在内存中还存在 并没有改变 这就叫字符串不可变又叫对象不可变
最后做下总结:
1 对final有了更深的了解:
final修饰的变量可以这么理解:修饰基本类型值不变,修饰引用类型只是引用不可变,但是引用所指向的地址的内容可以改变。(不能更改这个地址了,但数组里面的东西我是能够修改的。)
2.不可变对象简单理解
String常量的不可变指的是存放String对象那个区域里的内容不能变。比如,上面的代码。堆里面会有存放he的区域,而这个区域的he是不能变的,也就是不能变为ha,hi等等。而引用是可变的,只要不改变常量里面的内容就行。
2022.3.1