黑马程序员技术交流社区

标题: 请教内存问题 [打印本页]

作者: 刘奇    时间: 2012-7-29 17:38
标题: 请教内存问题
class Demo{
        String temp = "hello" ;               
};
public class RefDemo03{
        public static void main(String args[]){
                Demo d1 = new Demo() ;        // 实例化Demo对象
                System.out.println("fun()方法调用之后:" + d1.temp) ;
        }
        public static void fun(Demo d2){                // 由主方法直接调用
                d2.temp = "example";                                                // 修改temp值
        }
};


我想问的是当String作为一个类的成员时  它在堆中具体是怎么回事,例如在上述代码中  d2.temp = "example"。修改Sring类对象时,是不是一样先是创建一个匿名对象,再用temp引用它?如果是这样  那么是不是  原来的“hello”就成垃圾了。。。





作者: 黑马高明辉    时间: 2012-7-29 21:31
是。
String类中每一个看起来会修改String值的方法实际上都是创建了一个全新的String对象,以包含修改后的字符串内容,而最初的String对象则没有变动。
例如当吧String对象作为方法的参数时,会复制一份引用,而该引用所指的对象的物理位置从未动过。
顺便一说,用于String的“+”和“+=”是java中仅有的两个重载过的操作符。当用+=来连接String对象时,会产生一大堆需要垃圾回收的中间对象。这些对象也就是包含String对象改变的中间变量,当字符串连接成功后,不再有引用指向他们,所以会在不确定的时间里被垃圾回收器回收。
作者: 朱烈葵    时间: 2012-7-29 22:37
楼上说的是




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2