首頁> Java> java教程> 主體

Java的引用與值傳遞詳解

巴扎黑
發布: 2017-07-20 13:11:20
原創
1344 人瀏覽過

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

#
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中文網其他相關文章!

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