首先我们先来看下什么是不可变对象:一旦对象被创建并初始化后,内部的状态数据就会保持不变。查看 JDK 源码中的 类,可以看到类本身被 final 修饰,并且内部的大部分属性都是 final 修饰的,除了字段 hash 是通过字符串内容计算并缓存起来的。这样的行为让 类无法被扩展,内部属性也无法被修改。
接着我们再来用画图的形式来说明下 的不可变性。
通常我们初始化字符串都是以下形式:
类型的引用变量 a 保留了一个字符串对象 的引用,就如同下图所示,箭头则表示了变量 a 与真正 对象的引用关系。
再通过上述代码,我们将变量 a 赋值给变量 b ,变量 b 也存储了字符串对象 的引用,它们指向的是同一个对象。
当我们尝试对变量 a 重新赋值,看下对变量 b 会不会有影响呢
想必小伙伴一看就知道,打印的结果肯定是 ,,同样用画图的方式展示这两个变量与字符串对象的引用关系。
将变量 a 重新赋值后,保存了新的引用,而不是直接在原有的字符串对象上进行数据改变,同时变量 b 仍然存的是对象 的引用,变量 a 和 b 两者相互独立,不影响,这也正是说明了 对象的不可变。
在这里初认 Java 的小伙伴还可能会有些困惑:对一个对象 a 赋值 ,然后又让 a 值为 ,这个时候a的值变成 了, a 的值改变了,为什么还说 对象不可变呢。
其实问题也很简单,这里的 a 只是存储 对象的引用,并不是对象本身,a 存储的是指向对象所在内存的地址引用罢了,当第二次赋值时,a 引用指向了对象 的内存地址,而对象 是重新创建的,之前的 对象仍在内存中,并且由变量 b 引用着。
除此之外, 类的返回 对象的方法不会改变自身,都是返回一个新的 对象来实现,比如 ,, 等等。
以上就是的不可变介绍,如果有什么关于JAVA的问题,可以私信找我交流,我将尽我可能来解答!学习路线,资料等可找我。
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666