關於java值傳遞的問題,圖解直觀,若您有有高見請斧正!

來源:互聯網
上載者:User

 兩段代碼,結果的差異,請結合代碼給圖解下記憶體和執行過程。
  萬分感謝!

    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

所以就出現結果改變的情況了。

這麼一作圖,很直觀了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.