2 u013370108 u013370108 于 2016.05.10 22:16 提问

java中的引用问题??????

声明str1变量,在堆内存中开辟一块区域,str2引用str1,即str2和str1指向同一堆内存地址,
现在改变str2值,str1的值为什么不变呢?

 public class Test3 {

    public static void main(String[] args) {
    String str1=new String("aaaaaaaaaaaaaa");
    String str2=str1;
    str2="asdf";
    System.out.println(str1);
    }

}

7个回答

danielinbiti
danielinbiti   Ds   Rxr 2016.05.10 22:21
已采纳
 str1和str2中存的是同一个内存地址。
 当你
 str2="asdf"时,str2的内存地址和str1不是同一个了,str2指向asdf的内存地址了。而str1还是指向原来的内存地址。
 只是指向变了,原来的对象根本没有改变。
danielinbiti
danielinbiti 回复JohnnyDing1995: string类型都只能改变指向,不能修改内容。要修改具体值,自己定义类
一年多之前 回复
u013370108
u013370108 什么时候是改变指向,什么时候改变具体值呢?那这个例子如何修改呢?str2=“asdf”如何修改就不是改变指向,是改变值了?
一年多之前 回复
danielinbiti
danielinbiti 回复JohnnyDing1995: 这是不同概念,一个是改变对象内的值,一个是改变对象指向。对于对象变量来说,变量是执行这个对象的地址,如果改变对象内的值,变量对应对象的地址没有改变,获取的当然是对象改变后的内部值
一年多之前 回复
u013370108
u013370108 我知道不是同一个了,可是当是对象的时候,譬如节点,pre=node;那么我改变pre.value的值,那么node.value的值也改变了,而我用string举例时就改变地址了,这是为什么?
一年多之前 回复
Ro_bot
Ro_bot   2016.05.11 15:20

题主该去看下String类。
String被final修饰是不可改变的,所以当我们创建一个字符串后就不能改变了,当str2 = "abcd";即又创建了一个字符串。如果想实现你所说的那样,试试StringBuffer

u010453154
u010453154   2016.05.10 22:22

我觉得应该改变才对啊,mark下

CSDNXIAOS
CSDNXIAOS   2016.05.10 22:22

在写bean的时候,当bean中有一个map或list时,自然会给他们一个getter/setter

注意这里调用getter和setter之后,bean中的map或list和参数中的值已经共享一个引用,对其中一个的增删改都会影响到另外一个地方的值
......
答案就在这里:Java中的引用问题
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

u010453154
u010453154   2016.05.10 22:25

我去,我知道了,首先str指向堆的一块内存区域,你把str地址赋值给str2,当你改变str的值时,输出str2的值随之改变,但是!!!你改变了str2的值,意思是说又把一个内存地址赋值给了str2,这样子就是str指向原本的,str2指向新的,这样输出str当然是原来的啊!!差点被你代码骗了

tanjunchen
tanjunchen   2016.05.10 22:40

区分下对象引用就ok

l_vaule
l_vaule   2016.05.10 23:39

你应该好好理清下JAVA的内存布局,对象和引用得存储位置,相信你就不会问这样的问题了。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!