Java 值傳遞
阿新 • • 發佈:2019-03-03
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); } }
結果:
分析:
-
changeBasicalType方法,只是基礎型別的值傳遞,方法內部無論怎麼操作都不會該改變形參
-
changeValueNotRefer改變實參:可這麼理解,該方法傳遞的是一個物件,具體來說就是記憶體儲存空間的引用,本質記憶體儲存空間地址,當呼叫該方法時候,形參作為實參的拷貝,儲存相同的記憶體儲存空間的地址,因此形參改變會作用到實參的改變,日誌sb01的值也證明,sb02通過獲取sb01的地址,改變了sb01的值,換句話說形參sb01、實參sb01、形參sb02指向同一塊儲存空間,操作同步
-
changeValueTest:sb01發生改變,sb02未變,原因是因為sb01就是儲存實參的地址,引用非發生改變,因此形參引用的記憶體空間改變,實參引用的記憶體空間也會發生改變,sb02未發生改變的原因是因為 sb02 = sb01;
總結:
方法引數為基礎型別:形參拷貝實參的值,並新建儲存空間儲存,形參的改變不會影響實參
方法引數為物件型別:形參拷貝實參的值,也就是實際儲存物件的地址,如果形參的引用地址空間不變,形參和實參指向同一塊儲存空間,形參和實參的操作是同步影響的,如果形參的引用地址發生改變,那麼形參和實參指向的不是同一塊儲存空間,因此形參改變不會影響實參的儲存