转载

图解直观java值传递的问题

两段代码,结果的差异,请结合代码给图解下内存和执行过程。

字符串对象

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

数组对象

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

string

  • //1处时:

图解直观java值传递的问题

  • //2处时:

图解直观java值传递的问题

  • //3处:由于方法调用已经完成,所以str临时变量在stack中消失,s还是0x001,其地址处对象new String("old")没有被动;所以输出结果还是old;

------固执的分割线---------

  • //11处内存状态:

图解直观java值传递的问题

  • //12处:

图解直观java值传递的问题

  • //13处时候的内存状况:

图解直观java值传递的问题

此时a[0]和a[1]的值被改变,其实就是arr的相应值改变了。最后就出现了结果如图:

  • //14

图解直观java值传递的问题

所以就出现结果改变的情况了。

这么一作图,很直观了。

[2011-06-27]

原文  https://segmentfault.com/a/1190000022335529
正文到此结束
Loading...