java 13章常用类中的String类 不可变对象 final数组

今天在看韩老师视频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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值