A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汪磊 中级黑马   /  2012-12-19 22:18  /  2057 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 汪磊 于 2012-12-19 23:01 编辑

我先定义一个字符串变量A, 再把它赋值给字符串变量B, 之后又给变量B赋另外一个值, 这时A和B的值各是什么...
  1. string a = "aaa";
  2. string b = a;
  3. b = "bbb";
复制代码
没有问题, 这个肯定是个弱智问题, a的值肯定是"aaa", b的值肯定是"bbb"; 但是接下来问题就来咯, string不是引用类型的变量吗? 怎么a的值没变呢?

再看个string[]的例子:
  1. string[] a = { "1", "2", "3" };
  2. string[] b = a;
  3. b[2] = "b";
复制代码
懂的人应该都知道我要问什么了...

定义一个字符串数组a, 再把它赋值给b, 之后把b修改了, 结果 就是传说中的引用类型, a的值也变了,  求解释!!!

还有就是我如何不让a变化?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

9 个回复

倒序浏览
对于:"bbb" 是一个只读的字符串

像这类的字符串 在进行操作符重载的时候(C#内置有相应的字符串重载方法)

举个例子 string a="aaa";
             string b="bbb";
   string c=a+b;

会创建新的字符串 并让C指向它;

你声明的一个string 变量引用了这个值


评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
你这个必须是改变的,首先你创建了一个字符数组a ,然后再将a赋值给b,也就是把a的地址值赋给b,你第三行代码,在b数组下标为2 的位置再赋值,改变的是不单是b,同时也把a指向的改变了

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
改变后的结果是a=【"1", "2", b】
b的结果也是【"1", "2", b】
个人建议你画图,这样方便理解

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
引用类型:因为你的a数组,与b在堆区指的对象是同一个对象,所以,你改了b以后,a的值也变化了。不知道你这样说明白不明白啊?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
w406996703 发表于 2012-12-19 22:44
引用类型:因为你的a数组,与b在堆区指的对象是同一个对象,所以,你改了b以后,a的值也变化了。不知道你这 ...

我明白,  但是现在有点混了, 为啥string不可以呢,  还有我如何把这个数组复制一份呢? 就相当于把原来的数组备份一下, 以后还能再用
回复 使用道具 举报
汪磊 中级黑马 2012-12-19 23:00:49
7#
董将 发表于 2012-12-19 22:42
改变后的结果是a=【"1", "2", b】
b的结果也是【"1", "2", b】
个人建议你画图,这样方便理解 ...

确实理解但是如何把这个数组复制一份呢? 就相当于把原来的数组备份一下, 以后还能再用
回复 使用道具 举报
汪磊 中级黑马 2012-12-19 23:01:04
8#
董将 发表于 2012-12-19 22:41
你这个必须是改变的,首先你创建了一个字符数组a ,然后再将a赋值给b,也就是把a的地址值赋给b,你第三行代码 ...

如何把这个数组复制一份呢? 就相当于把原来的数组备份一下, 以后还能再用
回复 使用道具 举报
如果你不想你的值被改变:
你可以这样写:
private String[] a get(){
     return a;
}
这是利用private把你的a封起来,你提取a的时候,如果用b提取方法就是b.get();
使用方法就是这样的。这样你的a对象永远都不会变化了。

点评

感觉有点小题大做了吧. 麻烦帮我想想有没有直接点的办法  发表于 2012-12-19 23:10
回复 使用道具 举报
w406996703 发表于 2012-12-19 23:04
如果你不想你的值被改变:
你可以这样写:
private String[] a get(){

如果String[] a的值不想改变的话,只能用这个方法。因为String[] a 的对象在堆区里,你如果知道内存图的话,这个比较好解决,你可以加我QQ406996703 我把图发给你,一看了然
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马