1、結論:
2、傳值和傳引用區別:
例項1:(傳值)
void method1()
7 void method2()
13 voidchange1(stringbuffer sb)
17 voidchange2(stringbuffer sb)
呼叫method1(),螢幕列印結果為:"helloworld!"
呼叫method2(),我們認為結果應該是"hiworld",因為sb傳進來的是引用。可是實際執行的結果是"hello"!
從記憶體結構角度去分析change2:
程式執行到第8行,x指向乙個存放著"hello"的記憶體空間。
變數x---->[存放值"hello"]
第9行呼叫change2,將sb指向x指向的記憶體空間,也就是傳入x的引用。
變數x \
-->[存放值"hello"]
變數sb /
到這裡為止還沒有什麼異樣,接下來執行18行,這裡就出現了類似傳入值拷貝的變化:new方法並沒有改變sb指向記憶體的內容,而是在內從中開闢了一塊新的空間存放串"hi",同時sb指向了這塊空間。
變數x---->[存放值"hello"]
變數sb---->[另一塊存放"hi"的空間],×
所以,還有一條不成規則的規則:對於函式呼叫,最終效果是什麼完全看函式內部的實現。比較標準的做法是如果會改變引用的內容,則使用void作為方法返回值
;而不會改變引用內容的則在返回值中返回新的值(如本例中的change2不會改變引用內容,所以最好寫成stringbuffer change2(stringbuffer sb) {
sb = newstringbuffer("hi");
return sb;
js 函式引數傳值 傳引用
基本數值型別 傳值 引用型別 嚴格來說不能算傳引用,在js中叫按共享傳遞 call by sharing也叫按物件傳遞 按物件共享傳遞。該策略的重點是 呼叫函式傳參時,函式接受物件實參引用的副本 既不是按值傳遞的物件副本,也不是按引用傳遞的隱式引用 它和按引用傳遞的不同在於 在共享傳遞中對函式形參的...
C 引數傳值 與 傳引用
在 c 中,函式引數的傳遞有兩種方式 傳值和傳引用。在函式的形參不是引用的情況下,引數傳遞方式是傳值的。傳引用的方式要求函式的形參是引用。傳值 是指,函式的形參是實參的乙個拷貝,在函式執行的過程中,形參的改變不會影響實參。例如下面的程式 include using namespace std voi...
java中引數傳值和傳引用例子詳解
1.當傳引數為基本資料型別時,在方法體中對形參的修改不會影響到實參的數值 set類 package hello public class set 建構函式 主函式 public class hello 執行結果 從a的真實值可以看出,引數傳遞的是數值傳遞,set函式呼叫結束後並沒有影響a的真實值。2...