廢話不多說,先看乙個簡單的**
public static void main(string args)
public static void methodtest(int a)
這個比較簡單,輸出結果是0
原因:當方法形參為基本型別時 傳遞的是 值 在這裡也就是 給 methodtest方法的 a引數 設定了乙個值 為0
a+=1 後 也只是 改變了 methodtest 方法裡的 a變數的值 不影響 main方法裡的 a變數的 值
所以輸出結果為 0;
是不是很簡單?再看下乙個**示例
public static void main(string args)
public static void methodtest(integer a)
把int改為 integer 包裝物件 ,再算一下輸出結果是什麼?
什麼?還是0?物件不是傳遞的是位址麼?
沒錯,雖然包裝型別的值是放到堆裡的,棧中的變數只是存的乙個位址值。但是包裝型別和string型別有乙個特性 就是 值不可變,不能修改原有值,只會建立新的值
上面的**中 methodtest 方法的 a變數的值為 main方法中 a變數的 值的在堆中的位址
執行 a+=1操作 後 堆裡面會建立乙個 1的物件 並且把記憶體位址 賦給 methodtest方法中的變數a
但是外層的main方法中的a還是指向的 在記憶體中的0的位址
所以輸出結果依然是 0
剛開始本菜雞也不相信 直到我寫了乙個測試** 如下所示:
public static void main(string args)
public static integer methodtest(integer a)
在方法methodtest中修改值 看看 引用是否被改變了,結果列印false 表示a和b的引用確實不一致。
還是不服!然後注釋了 a+=1這行**,再次執行,發現列印出了true。
以上結果證明:
當包裝型別的值改變的時候,不會修改原有值,而是生成乙個新的值在堆中!
C 方法的引數傳遞機制
值引數 value parameter 方法名稱 引數型別 引數名稱 引數型別 引數名稱 引用引數 reference parameter 方法名稱 ref 引數型別 引數名稱 ref 引數型別 引數名稱 輸出引數 output parameter 方法名稱 out引數型別 引數名稱 out 引數型...
方法的引數值傳遞機制
形參 方法宣告時,方法小括號內的引數 實參 呼叫方法時,實際傳入的引數的值 規則 j a中的引數機制 值傳遞機制 形參是基本資料型別的 將實參的值傳遞給形參的基本資料型別的變數 public class testargstransfer 交換兩個變數的方法 public void swap int ...
Java中方法的引數傳遞機制
public class foo public static void operator stringbuffer x,stringbuffer y 最近看到這道題,網上好多錯誤解答,為防止初學者被誤導,特發文與大家 先說結果 ab,b 關鍵點在於 執行至operator方法時,是將實參a,b的值複...