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条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题