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);
    }

}

 str1和str2中存的是同一个内存地址。
 当你
 str2="asdf"时,str2的内存地址和str1不是同一个了,str2指向asdf的内存地址了。而str1还是指向原来的内存地址。
 只是指向变了,原来的对象根本没有改变。

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

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

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

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

区分下对象引用就ok

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

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