先看一段程式碼,是我遇過的一道面試的筆試題:
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 }
值傳遞:
i的值並不會因為test方法中將輸入參數賦值為30而變成30
## 所以執行方法test(i )後列印i的值還是先前的值10 具體過程如下: 變數i---->[存放值10] 執行呼叫test( i)方法的時候,記憶體中是這樣的情形:i把自己值在記憶體中複製一份,然後變數m指向這個被複製出來的10。 變數i---->[存放值10] ;[存放值10]
這時候再執行到17行的時候,變數m的被賦值為30,而這一步的操作已經跟i沒有任何關係了。
-->[存放值"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中文網其他相關文章!