兩段代碼,結果的差異,請結合代碼給圖解下記憶體和執行過程。
萬分感謝!
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處時:
//2處時:
//3處:
由於方法調用已經完成,所以str臨時變數在stack中消失,s還是0x001,其地址處對象new String("old")沒有被動;所以輸出結果還是old;
---------------------------------------------------固執的分割線------------------------------------------------------
//11處記憶體狀態:
//12處:
//13處時候的記憶體狀況:
此時a[0]和a[1]的值被改變,其實就是arr的相應值改變了。最後就出現了結果//14
所以就出現結果改變的情況了。
這麼一作圖,很直觀了。