遇到这样一个问题,求高手解释下:
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
为什么两次输出结果会不同?
问题补充

能说详细点吗

问题补充


问题补充
原来是String类的内容不可改变,感谢李老师的热心指导
问题补充
从JVM内存上分析,下面是我画的JVM分析图,应该是比较明白的
正是如此
