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

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处时:

image.png

  • //2处时:

image.png

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

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

  • //11处内存状态:

image.png

  • //12处:

image.png

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

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

  • //14

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

这么一作图,很直观了。


[2011-06-27]


丰木
325 声望21 粉丝

遇见超乎想象的自己!