討論java中呼叫函式,形參的傳遞是值傳遞還是引用傳遞的問題
阿新 • • 發佈:2019-01-05
首先說結論:
當引數是引用資料型別時,傳入形參的是實參的引用;(證一)
當引數是基本資料型別時,傳入形參的是實參值;(證二)
證明如下:
(證一)
public class PassByReferenceOrValueTest { public static void main(String[] args) { Person p = new Person(); p.setName("main"); System.out.println("main中hash值:"+p); System.out.println("被function呼叫前的name:"+p.getName()); function1(p); System.out.println("被function呼叫後的name:"+p.getName()); } public static void function1(Person person) { System.out.println("function中的hash值:"+person); person.setName("function"); } }
執行結果為:
main中hash值:[email protected]
被function呼叫前的name:main
function中的hash值:[email protected]
被function呼叫後的name:function
分析:
在函式中使用的setName方法,將引數的name更改為function之後,實參的name也被改為了function,說明形參的改變會影響到實參,這可以說明傳入的是物件的地址值(至少效果上跟引用傳遞是一樣的)
========================================分割線===========================================================
證二:
public class PassByReferenceOrValueTest2 { public static void main(String[] args) { int i = 1; function1(i); System.out.println(i); } public static void function1(int i) { i=8; } }
執行結果為:
1
分析:
雖然呼叫函式時將形參的值設定成8,但是主函式中的i還是1,說明傳入的引數無論怎麼改變,也不會影響到之前的變數i,這跟值傳遞是一樣的效果。