栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

对象的可变性

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

对象的可变性

最近期末复习看到数据类型可变与不可变这部分,感觉上课没太看明白的有了有点思路。

在Java中,有⼀些对象的内容是不变的 (immutable):⼀旦它们被创建,它们总是表⽰相同的值。另⼀些对象是可变的(mutable):它们有改变内部 值对应的⽅法。

String 就是不变对象的⼀个例⼦,⼀个 String 对象总是表⽰相同的字符串。⽽ StringBuilder 则是可变的,它有对应的⽅法来删除、插⼊、替换字符串内部的字符,等等。

以String和StringBuilder类型对象为例介绍可变类型和不可变类型的区别,因为 String 是不变的,⼀旦被创建,⼀个 String 对象总是有⼀样的值。为了在⼀个 String 对象字符串后加上另⼀个字符串,你必须创建⼀个新的 String 对象:

String s = "a";

s = s.concat("b");

代码运行时的快照图:

与此相对, StringBuilder 对象是可变的。这个类有对应的⽅法来改变对象,⽽不是返回⼀个新的对象:

StringBuilder sb = new StringBuilder ("a");

sb.append("b");

快照图如下:

 

java中还提供了final关键字来提供额外的不可变,而这种不可变是针对引用的。

final String s="a";

s=s.concat("b");

代码在编译时就会报错,因为我们为s指定了新的引用,而这与final的约束相违背。

当用final来修饰可变类型时:

       final StringBuilder sb = new StringBuilder("abc");

       sb.append("d"); 

       sb = new StringBuilder("e");

因为本身数据类型是值可变的,所以当改变可变字符串sb的值时,由于sb指向的地址空间始终不变,则sb.append(“d”);是能够正常编译运行的,而

sb = new StringBuilder("e");是要改变sb的运用,其对应的地址空间也会改变,所以这个时候就会报错。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/967124.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号