java中的值傳遞與引用傳遞(隨筆)
阿新 • • 發佈:2019-01-14
這裡複習一下Java的值傳遞與引用傳遞。
值傳遞(形式引數型別是基本資料型別):方法呼叫時,實際引數把它的值傳遞給對應的形式引數,形式引數只是用實際引數的值初始化自己的儲存單元內容,是兩個不同的儲存單元,所以方法執行中形式引數值的改變不影響實際引數的值。
package cn.kgc.demo01; public class ValuePass { public static void main(String[] args) { ValuePass vp = new ValuePass(); int param = 10 ; vp.setParam(param); System.out.println("值傳遞之後: "+param); } public void setParam(int a) { a = a + 20; System.out.println("值傳遞引數: "+a); } }
執行結果:
值傳遞引數: 30
值傳遞之後: 10
引用傳遞(形式引數型別是引用資料型別引數):也稱為傳地址。方法呼叫時,實際引數是物件(或陣列或自定義類的型別),這時實際引數與形式引數指向同一個地址,在方法執行中,對形式引數的操作實際上就是對實際引數的操作,這個結果在方法結束後被保留了下來,所以方法執行中形式引數的改變將會影響實際引數。
package cn.kgc.demo01; public class QutoPass { public static void main(String[] args) { IntValue source = new IntValue(10); //帶引數建構函式 QutoPass qp = new QutoPass(); System.out.println("引用傳遞前:"+source.getValue()); qp.setValue(source); System.out.println("引用傳遞後:"+source.getValue()); } //傳遞自定義型別引數 public void setValue(IntValue source) { source.setValue(34); System.out.println("賦值: "+source.getValue()); } } //自定義類 class IntValue{ public int value; public IntValue(int source) { value = source; } public int getValue() { return value; } public void setValue(int source) { this.value = source; } }
執行結果:
引用傳遞前:10
賦值: 34
引用傳遞後:34
結論
結合上面的分析,關於值傳遞和引用傳遞可以得出這樣的結論:
(1)基本資料型別傳值,對形參的修改不會影響實參;
(2)引用型別傳引用,形參和實參指向同一個記憶體地址(同一個物件),所以對引數的修改會影響到實際的物件;
(3)String, Integer, Double等immutable的型別特殊處理,可以理解為傳值,最後的操作不會修改實參物件。