这是牛客网上的一道题目,运行结果是什么呢?
public class Test2 {
String str=new String("tarena");
char[] ch={'a','b','c'};
public static void main(String[] args) {
Test2 t=new Test2();
t.change(t.str,t.ch);
System.out.print("str="+t.str+'\t'+"ch=");
System.out.println(t.ch);
t.change(t);
System.out.print("str="+t.str+'\t'+"ch=");
System.out.println(t.ch);
}
public void change(String str,char[] ch){
str="test ok";
ch[0]='g';
}
public void change(Test2 t){
t=new Test2();
t.str="hhh";
}
}
结果:
str=tarena ch=gbc
str=tarena ch=gbc
为什么是这种情况?传递的都是引用,为什么结果不一样呢?
分析一下内存的情况:
调用第一个change函数后:
当调用结束后,那么str这个局部变量会被回收,不会影响
t.str
;而t.ch呢,通过图中可以看到ch[0]已经变成了'g'
,虽然此时的ch已经随着change函数调用结束而消亡,但是t.ch这个确实发生了改变。
现在分析第二个change函数:
从图中可以看出,这个局部变量t并不会影响main函数中的t.
总结:
遇到此类问题,应该简略的画出内存情况,这样结果就显而易见了。这当然要求我们比较熟悉java的内存模型。