黑马程序员技术交流社区
标题:
请教内存问题
[打印本页]
作者:
刘奇
时间:
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