public class a{
public static void main(String []wo){
String my=new String("xie");
my=my.concat("tao");//为什么能这样 不是说String类的对象的内容是不可以改变的吗
System.out.println(my);



}
}

解决方案 »

  1.   

    答:
    String my=new String("xie"); 
    //此时串my指向对象"xie"
    my=my.concat("tao");//为什么能这样 不是说String类的对象的内容是不可以改变的吗 此时串my已不是指向对象"xie",而是指向新的串对象"xietao",原来的老的串对象"xie"没有变化,只不过my不再指向它了。
      

  2.   

    你不要想当然地认为这样就是改变了String,你知道这在内存中师怎么操作的吗?String my=new String("xie"); 
    my=my.concat("tao");      //为什么能这样 不是说String类的对象的内容是不可以改变的吗 
    System.out.println(my);   //这是因为:你在进行my=my.concat("tao"); 的时候,在堆内存中重新复制了一份内存空间,这个内存空间存放"xietao"
                            //这个字符串,实际上,现在在堆内存已经存在了两份"xie"这一字符串,只不过你把"xietao"这块内存的首地址送给了变量my
                            //而你原来的字符串"xie"已经成为垃圾内存(没有被任何一个对象所指向),所以说字符串是不可变的,要记好了!!!!!!
      

  3.   

    String对象的存放位置同一般的对象是不同的:他有两个存放的位置 一个是 堆(java中使用new关键字创建的对象都会存放在堆上)。
    第二个位置 是一个String pool。 如果你直接使用 String my = "xie"; my 对象是放在 String pool中的。 如果使用new 关键字
    的话 两处地方都会存放my对象。 每创建一个String的对象 都会查找这个 String Pool, 如果有的话直接引用,没有的话再创建。
    所以 String对象的内容是不可改的, 如果表现出来改了的话 一定是 引用变了。 不信的话 你直接打印出 my对象, 肯定不是同一个
    对象。 1L 说的是正确的
      

  4.   

    my里存的不是xie 而是xie的地址吗
    是这个意思吗
      

  5.   

    "xietao"和"xie"是放在栈区把
    而堆区my对象 一开始是存储的"xie"的地址  后来 才变成了 "xietao"的地址  哦 只是指向变了
      

  6.   

    concat()方法是字符串连接,代码等同于
    my = my + "tao";