求java高手。。string a=b到底是将b的值给a还是将地址给a?

如题所述

本质上string 是引用类型的。
string a="xxx";
a指向字符串xxx所在的地址。
string b=a;
会把a的地址给b,此时a和b保存相同的地址,所以他们的值是相同的。
a="yyy";
此时并不是把a地址的内容改为yyy,而是重新分配地址保存字符串"yyy".修改a的地址为指向yyy.
于是,a有个新地址指向yyy,b仍是老地址指向xxx.
b="zzz";
此时并不是把b地址的内容改为zzz,而是重新分配地址保存字符串"zzz".修改b的地址为指向zzz.
于是,不再有变量指向xxx,xxx内存会被回收。追问

为什么string是引用类型?int呢

追答

int是基本类型,值类型。意味着每个变量分配一片内存,保存值。修改时,修改内存内容。
说string 是引用,是站在string 变量保存的是地址基础上理解的。但是java已经没有指针了。这都是套用c来理解的。
实际上string 是一个很特殊的类型。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-09-09
String a=b是重新定义一个a,并把b的值给了a,
String a="a";
String b="a";
这样的他们的地址才是相同的追问

你写的这个分明a和b只有值相同啊

追答

是值相同,但是"a"指向的是同一个地址

追问

难道不是两个不同的内存

第2个回答  2014-09-09
很多人这个地方都搞不明白,java里面对象间是没有值传递的,全部都是地址传递。追问

怎么回事

追答

String b = "this is a string"; //假设此处"this is a string"这个字符串在内存中的地址为 1,
//而b这个变量指向地址为 1的区域。

String a = b; //这里只是让a这个变量也指向的地址为 1的区域,并没有重新申请内存,因此是地址传递

其实关于这个问题你只要Debug一下,注意看一下每个变量的ID就能更清楚一些了。

追问

如果是string a=new string;
a=b;这样呢

追答

String a = new String(); //这个时候a指向了另一个地址,也就是新的new String()
a = b; //这时候又将b指向的地址赋给了a,所以a又指向 1了

追问

那我有没有办法只赋值呢?如果地址相同,岂不是改了a后,b也会改?

追答

不是,String是final的,一旦定义了就不会改变的。
所谓的改变只是你的错觉,只是变量指向的内存变了。
比如:
b = "asdf";
a = b;
b = "asdfasdf";

这个时候只是又重新开辟了一块内存用来保存“asdfasdf",并且将b指向了这块内存,而a还是指向原来的"asdf“的内存。

本回答被提问者采纳
第3个回答  2014-09-09
追问

这怎么回事

追答

求采纳

相似回答