两段代码,结果的差异,请结合代码给图解下内存和执行过程。
1.1 字符串对象
public class PassAddr {
public static void main(String[] args) {
String s=new String("old"); //1
method(s); //3
System.out.println(s);
}
static void method(String str){
str=new String("new"); //2
}
}
这个输出结果为:old
1.2 数组对象
public class T {
public static void main(String[] args) {
String[] arr=new String[2];
arr[0]="old_0";
arr[1]="old_1"; //11
/*arr[0]=new String("old_0");
arr[1]=new String("old_1"); //11 同样*/
method(arr); //14
System.out.println(arr[0]+";"+arr[1]);
}
static void method(String[] a){//12
a[0]="new_0";
a[1]="new_1"; //13
}
}
这个输出却是:new_0;new_1
2. 内存示意图
string
//1处时:
//2处时:
//3处:由于方法调用已经完成,所以str临时变量在stack中消失,s还是0x001,其地址处对象new String(“old”)没有被动;所以输出结果还是old;
-—–固执的分割线———//11处内存状态:
//12处:
//13处时候的内存状况:
此时a[0]和a[1]的值被改变,其实就是arr的相应值改变了。最后就出现了结果如图://14
所以就出现结果改变的情况了。
这么一作图,很直观了。
[2011-06-27]
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 hi@niewj.com