首頁  >  文章  >  Java  >  Java的引用與值傳遞詳解

Java的引用與值傳遞詳解

巴扎黑
巴扎黑原創
2017-07-20 13:11:201366瀏覽

 先看一段程式碼,是我遇過的一道面試的筆試題:

#
 1 /** 2  * ***面试题 3  */ 4 public class StringBufferTest { 5     public static void main(String[] args) { 6         int i = 10; 7         test(i); 8         System.out.println(i);//10 9         StringBuffer str = new StringBuffer("str");10         test2(str);11         System.out.println(str.toString());//str_add12         test3(str);13         System.out.println(str.toString());//str_add14     }15 16     public static int test(int m) {17         m = 30;18         return m;19     }20 21     public static StringBuffer test2(StringBuffer str2) {22         str2.append("_add");23         return str2;24     }25 26     public static StringBuffer test3(StringBuffer str3) {27         str3 = new StringBuffer("java");28         return str3;29     }30 31 }
##View Code## 

 值傳遞:

  i的值並不會因為test方法中將輸入參數賦值為30而變成30

##  所以執行方法test(i )後列印i的值還是先前的值10

  具體過程如下:

    變數i---->[存放值10]

  執行呼叫test( i)方法的時候,記憶體中是這樣的情形:i把自己值在記憶體中複製一份,然後變數m指向這個被複製出來的10。

  變數i---->[存放值10]

                                 ;[存放值10]

  這時候再執行到17行的時候,變數m的被賦值為30,而這一步的操作已經跟i沒有任何關係了。

  變數m--->[存放值30]

 

 引用傳遞:(全域變數變數時候要特別注意改變後是否會影響其他地方)

  str傳遞給test2方法是str的引用,所以str2的改變會影響str的值

  所以執行方法test2(str)後面印str的值變成str_add

#  具體過程如下:  

  變數str---->[存放值"str"]

  執行test2(str),注意,這裡就與值傳遞有了本質的不同:當呼叫test2(str)時,變數str2也指向了str所指向的記憶體空間,而不是指向str的一個拷貝。

  變數str  \

                   -->[存放值"str"]## 2指向的記憶體空間的值,str的值也就隨之改變了。

  變量str  \

                   -->[追加為"str_add"]

       變量str2 /

 

 思考為什麼test3(str)後打印str的值不是java而是str_add?

  主要原因在於:str3 = new StringBuffer("java");這行程式碼

  出現類似傳入值拷貝的變化:new方法並沒有改變str指向記憶體的內容,而是在內從中開闢了一塊新的空間存放串"java",同時str3指向了這塊空間。

  具體流程如下:

  程式執行到第12行,str指向一個存放著"str_add"的記憶體空間。

  變數str---->[存放值"str_add"]

#  呼叫test3(str),將str3指向str指向的記憶體空間,也就是傳入str的參考。

  變數str  \

                    -->[存放值」str_add"]

   -->[存放值」str_add"]

值拷貝的變化:new方法並沒有改變str指向記憶體的內容,而是在其中從中開闢了一塊新的空間存放串"java",同時str3指向了這塊空間。

  變數str---->[存放值"str_add"]

                   str3原有的引用被儲存的]

 

  

   

#

以上是Java的引用與值傳遞詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn