我像下面这样创建一个String:
String str="ABC";然后在一个函数里面写:
String temp="DEF";
str=temp;这样赋值的话,应该是把temp的引用赋给str吧?但是temp是局部变量,从函数里出来后应该就不存在了,为什么str的值还能保持“DEF”呢?

解决方案 »

  1.   

    String str="ABC";String temp="DEF";
     这个是String类的知识 不单单是变量的问题,str和temp同是是String类创建的对象分别存放在堆内存中的两个位置,分别有两个地址值,str=temp;其实是将temp对象的地址赋给了str,所以str句柄就指向了temp的对象.也就是他俩操作的是一个对象.
     
      

  2.   

    从函数里出来后,对temp的引用数不为零,所以不会销毁。
      

  3.   

    1、"DEF" (仅仅是指字符本身) 是在堆上面创建的。可以理解为在堆上分配的字符数组。 
    2、temp 是一个临时的指针 指向 DEF
    3、出栈后销毁的是temp 指针,因为temp出栈了
    4、DEF 还是在堆上面。
    5、DEF 这个字符数组,被str引用着。总之,str 和 temp 都不过是地址,DEF 是内容。
    谁知道DEF 的地址,谁就能引用DEF的内容DEF的销毁,由JVM控制。当再没有任何引用指向"DEF"的时候,垃圾回收会回收"DEF"
      

  4.   

    "DEF"存储在堆内存上 不会随函数结束而消失 而str保持对"DEF"引用 所以会保持为"DEF"
      

  5.   

    java和c++不一样啊,对象不是在栈上分配的