圖解直觀java值傳遞的問題

兩段代碼,結果的差別,請結合代碼給圖解下內存和執行過程。
字符串對象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數組

數組對象spa

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_1code

string對象

  • //1處時:

image.png

  • //2處時:

image.png

  • //3處:因爲方法調用已經完成,因此str臨時變量在stack中消失,s仍是0x001,其地址處對象new String("old")沒有被動;因此輸出結果仍是old;

------執拗的分割線---------blog

  • //11處內存狀態:

image.png

  • //12處:

image.png

  • //13處時候的內存情況:

image.png
此時a[0]和a[1]的值被改變,其實就是arr的相應值改變了。最後就出現告終果如圖:內存

  • //14

image.png
因此就出現結果改變的狀況了。字符串

這麼一做圖,很直觀了。string


[2011-06-27]it

相關文章
相關標籤/搜索