public class a{
public static void main(String args[]){
String s1 = "aaa";
String s2 = s1;
System.out.println(s1);
System.out.println(s2);
s2 = "bbb";
System.out.println(s1);
System.out.println(s2);
}
}
因为从书上知道的情况是,s2=s1的赋值是创建一个引用的拷贝,那么修改s2后s1的值(或者修改s1后s2的值)应该修改才是,但以上代码的结果不是这样,于是继续查了资料,我的问题是这样:
1  从资料上知道,以上赋值的确创建了到s1对象引用的拷贝,这点属实吗?
2  以上属实的话,解释s1没有随s2改变的原因是:String对象是只读的,这点又对吗?
3  以上都正确的情况下,我又在想,既然String对象只读,那么当引用s2视图修改指向的String对象时,程序做了什么,是不是s2脱离原对象,指向了新的对象,这个对象的值是“bbb”呢?
--------------------------------------------
问题描述的有些繁琐,如有不清楚的,请大家指出,我说明后请给我解答,请大家帮我多做分析,谢谢!

解决方案 »

  1.   

    s2 = "bbb";
    不要把这个表达式的右边"bbb"当成是值,字符串"bbb"是一个对象。
    这个赋值和 s2 = s1 一样,都是创建一个引用的拷贝。
      

  2.   

    可以这样理解
    String s2=s1 是s2获得了s1的引用 即 s2 指向 s1 的内存地址
    String s2="bbb" 是s2获得了bbb的引用 即 s2 指向 bbb 的内存地址
    在这个过程中与 s1 没有发生任何关系 可以想象成 s2 是一面镜子 照向 s1 镜子里面就是 s1
    照向 bbb 镜子里面就是 bbb
      

  3.   

    如果s2=“bbb”修改为:s1="bbb",这个时候s1就获得了“bbb”对象的内存地址了,而s2没有变化,是吗?
    至于一楼所说的,我想是我表述不当,我的意思是这个对象就是“bbb”。
      

  4.   

    还有就是,关于String对象创建后是只读的一说,我想再确定一下正确与否,就是这导致打印结果是aaa bbb,对吗?
      

  5.   

    是的
     开始时 s1,s2都是"aaa"的引用。
    修改其中的一个后,另一个不会改变的
      

  6.   

    只读式一种说法
    String是一种特殊的对象
    他的改变 相当于:
        开辟新空间  把改变后的值放置新空间 引用新空间 撤销原空间
      

  7.   

    如果想调试的话  可以用 hashcode跟踪 
    每次改变 String对象的hashcode 都已经改变