黑马程序员技术交流社区
标题: 为什么String和其它引用类型有个明显的区别? [打印本页]
作者: 陈君 时间: 2014-5-16 21:46
标题: 为什么String和其它引用类型有个明显的区别?
本帖最后由 陈君 于 2014-5-17 15:10 编辑
附件是我调试的一个程序,我用它来验证值类型和引用类型的区别。用class和int来比较的时候可以发现:
值类型在赋值的时候会直接存储它的数据,就像a=b;a的内存里实际存储的是b的值。
而引用类型则不同。我们看Animal animal = dog。
animal的内存里实际存储的是dog这个对象的引用(地址)。所以当我们队animal.age赋值为20的时候,它实际就是通过其中保存着的地址找到那个存放age的内存单元然后改里面的值。由于animal.age和dog.age都是指向同一个内存,所以一旦那个内存里保存的值变了那么dog.age的值也会变化。就好像 是两个人共用一个装满金子的宝箱,如果一个人把里面的金子换成了石头,那么另一个人打开这个箱子的时候也只能看到石头,而不是原来的金子。
具体过程大家可以看下我的博客http://blog.sina.com.cn/s/blog_db23a6350101mj3h.html
但是在我使用String来调试的时候发现它和class不一样。它更像是一个值类型,
String s1 = "122222";
String s2 = s1;
String s3 = s1;
s2 = "21111111";
这里如果是引用类型的话在s3改变了之后应该s1和s2也会跟着改变才是啊。这到底是为什么啊?或者说我博文里的分析是有问题的?
-
类型分析2.png
(92.26 KB, 下载次数: 31)
-
类型分析3.png
(99.98 KB, 下载次数: 47)
-
1.png
(93 KB, 下载次数: 45)
作者: 方杰斌 时间: 2014-5-16 21:52
OBJECT是引用类型,但如果是int之类则这个应用可能是值,因为int也是继承自object
string在内存的表示上是引用(如果有C基础就能很好明白),但在实际使用中,.NET把string弄成了值类型。所以不要把string当引用类型看。
.NET中把引用的字符串值类型化的方案是每次对字符串变量赋值,包括字符串相加都是完全开辟新的存储空间给字符串变量使用。所以在使用string类型进行运算时比较消耗资源,此时可以使用stringbuilder类型替代。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |