A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘奇 初级黑马   /  2012-7-29 17:38  /  1560 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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”就成垃圾了。。。




评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

2 个回复

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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上说的是
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马