黑马程序员技术交流社区

标题: 引用类型的问题,求解决! [打印本页]

作者: 汪磊    时间: 2012-12-19 22:18
标题: 引用类型的问题,求解决!
本帖最后由 汪磊 于 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变化?
作者: 梦ing    时间: 2012-12-19 22:40
对于:"bbb" 是一个只读的字符串

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

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

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

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



作者: 董将    时间: 2012-12-19 22:41
你这个必须是改变的,首先你创建了一个字符数组a ,然后再将a赋值给b,也就是把a的地址值赋给b,你第三行代码,在b数组下标为2 的位置再赋值,改变的是不单是b,同时也把a指向的改变了
作者: 董将    时间: 2012-12-19 22:42
改变后的结果是a=【"1", "2", b】
b的结果也是【"1", "2", b】
个人建议你画图,这样方便理解
作者: 王小聪    时间: 2012-12-19 22:44
引用类型:因为你的a数组,与b在堆区指的对象是同一个对象,所以,你改了b以后,a的值也变化了。不知道你这样说明白不明白啊?
作者: 汪磊    时间: 2012-12-19 23:00
w406996703 发表于 2012-12-19 22:44
引用类型:因为你的a数组,与b在堆区指的对象是同一个对象,所以,你改了b以后,a的值也变化了。不知道你这 ...

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

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

如何把这个数组复制一份呢? 就相当于把原来的数组备份一下, 以后还能再用
作者: 王小聪    时间: 2012-12-19 23:04
如果你不想你的值被改变:
你可以这样写:
private String[] a get(){
     return a;
}
这是利用private把你的a封起来,你提取a的时候,如果用b提取方法就是b.get();
使用方法就是这样的。这样你的a对象永远都不会变化了。
作者: 王小聪    时间: 2012-12-19 23:14
w406996703 发表于 2012-12-19 23:04
如果你不想你的值被改变:
你可以这样写:
private String[] a get(){

如果String[] a的值不想改变的话,只能用这个方法。因为String[] a 的对象在堆区里,你如果知道内存图的话,这个比较好解决,你可以加我QQ406996703 我把图发给你,一看了然




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2