iteye_14750 2011-05-16 14:53
浏览 300
已采纳

关于String类内存分配的问题

遇到这样一个问题,求高手解释下:
public class RefDemo0{
public static void main(String args[]){
String str1 = "hello" ; // 实例化字符串对象
System.out.println("fun()方法调用之前:" + str1) ;
fun(str1) ; // 调用fun()方法
System.out.println("fun()方法调用之后:" + str1) ;
}
public static void fun(String str2){ // 此处的方法由主方法直接调用
str2 = "world" ; // 修改字符串内容
}
};

输出结果为:
fun()方法调用之前:hello
fun()方法调用之后:hello


class Demo{
String temp = "hello" ; // 此处为了方便,属性暂时不封装
};
public class RefDemo0{
public static void main(String args[]){
Demo d1 = new Demo() ; // 实例化Demo对象
d1.temp = "world" ; // 修改temp属性的内容
System.out.println("fun()方法调用之前:" + d1.temp) ;
fun(d1) ;
System.out.println("fun()方法调用之后:" + d1.temp) ;
}
public static void fun(Demo d2){ // 此处的方法由主方法直接调用
d2.temp = "hey"; // 修改temp值
}
};

输出结果为:
fun()方法调用之前:world
fun()方法调用之后:hey


为什么两次输出结果会不同?
问题补充

zhushidan100 写道
值传递,引用传递 好像是

能说详细点吗
问题补充
哪位帮忙解答下 ,这问题困扰我一个晚上了
问题补充
原来是String类的内容不可改变,感谢李老师的热心指导
问题补充
sziitjiang 写道
第一个例子,从程序上直接分析就是fun方法传入参数str2,而str2既不是全局变量,fun方法有没有返回到哪里,所以str1的值都没有得到修改,str1和str2是两个不同的对象
从JVM内存上分析,下面是我画的JVM分析图,应该是比较明白的

正是如此  谢谢你的详细分析
  • 写回答

14条回答 默认 最新

  • redstarofsleep 2011-05-16 15:05
    关注

    String是静态的不能被修改,每次赋值都是改变引用。
    而方法传值传的是指针

    比如方法调用fun(str1);这样的,把str1的指针复制一下传入方法,而方法中改变了这个指针指向的对象。但是注意,原来的str1没有变。因为方法内部的str2是str1复制了一遍的。

    而类的成员变量,改变了指向的对象。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(13条)

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波