1.如果这样写String s,请问这个s是产生在stack还是在heap中?如果在stack中,那么String就应该作为primitive来理解,如果在heap中,那么就是Wrap Class。2.String对象的内容在初始化之后就不能进行改动,请问我这样写 String s=new String("abc");
 s=s+"def";
 System.out.println(s);为什么还是能输出"abcdef"

解决方案 »

  1.   

    1. heap中
    2. 是能输出,但那是另一个对象。事实上"abc"对象仍然存在,只不过变成没用的东西而已,过段时间就会被jvm回收
      

  2.   

    (1)既然是class,对象本身当然是heap中。(2)“对象的内容在初始化之后就不能进行改动”不代表引用不能改动。
    s是个变量名,即引用。通过它当然不可以修改一个String对象本身,但它完全可以不再引用原来的对象,而改去引用一个被连接运算符新产生出来的对象。
    原来的对象当然是修改不了的,但s不再引用它了。事实上,执行完
    s=s+"def";
    之后,至少在你的程序里,也没有哪个变量再引用原来那个对象了,所以它极可能要被垃圾回收器收掉了。