1. 程式人生 > >java中的值傳遞與引用傳遞(隨筆)

java中的值傳遞與引用傳遞(隨筆)

       這裡複習一下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的型別特殊處理,可以理解為傳值,最後的操作不會修改實參物件。