1. 程式人生 > >Java 值傳遞

Java 值傳遞

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

Java 實際支援只有值傳遞一種機制,值傳遞、引用傳遞本質還是值傳遞

測試案例:

public class ValueDelivery {
	
	public static void changeBasicalType(int intSample){
		intSample++;
	}
	
	public static void changeValueNotRefer(StringBuffer sb){
		System.out.println("changeRefer:"+sb.hashCode());
		sb.append("changeValueBotRefer->引用不變,值改變");
	}

	public static void changeValueTest(StringBuffer sb01,StringBuffer sb02){
		sb01.append("changeValueTest-->引用不變,值改變");
		sb02 = sb01;
		System.out.println("sb01:"+sb01.hashCode()+",sb02:"+sb02.hashCode());
		sb02.append("changeValueTest-->引用改變,值不變");
	}
	
	public static void main(String[] args) {
		
		int x = 0;
		changeBasicalType(x);
		System.out.println(x);
		
		StringBuffer sb01 = new StringBuffer("sb01:");
		StringBuffer sb02 = new StringBuffer("sb02:");
		System.out.println("函式呼叫前-->sb01:"+sb01.hashCode()+",sb02:"+sb02.hashCode());
		changeValueNotRefer(sb01);
		System.out.println(sb01);
		
		System.out.println("----------");
		changeValueTest(sb01, sb02);
		System.out.println("sb01:"+sb01);
		System.out.println("sb02:"+sb02);
	}
}

結果:

分析:

  1. changeBasicalType方法,只是基礎型別的值傳遞,方法內部無論怎麼操作都不會該改變形參

  2. changeValueNotRefer改變實參:可這麼理解,該方法傳遞的是一個物件,具體來說就是記憶體儲存空間的引用,本質記憶體儲存空間地址,當呼叫該方法時候,形參作為實參的拷貝,儲存相同的記憶體儲存空間的地址,因此形參改變會作用到實參的改變,日誌sb01的值也證明,sb02通過獲取sb01的地址,改變了sb01的值,換句話說形參sb01、實參sb01、形參sb02指向同一塊儲存空間,操作同步

  3. changeValueTest:sb01發生改變,sb02未變,原因是因為sb01就是儲存實參的地址,引用非發生改變,因此形參引用的記憶體空間改變,實參引用的記憶體空間也會發生改變,sb02未發生改變的原因是因為 sb02 = sb01;

    ,sb02形參改變了自生的引用,也就是說形參和實參指向的不是同一塊儲存空間,因此sb02改變,實參不變,從控制檯的日誌可以看出形參sb02和形參sb01的hashcode相同,也就是行參sb02指向的是sb01引用的儲存空間,和實參sb02指向的儲存空間無關

總結:

方法引數為基礎型別:形參拷貝實參的值,並新建儲存空間儲存,形參的改變不會影響實參

方法引數為物件型別:形參拷貝實參的值,也就是實際儲存物件的地址,如果形參的引用地址空間不變,形參和實參指向同一塊儲存空間,形參和實參的操作是同步影響的,如果形參的引用地址發生改變,那麼形參和實參指向的不是同一塊儲存空間,因此形參改變不會影響實參的儲存