??對值傳遞、引用傳遞有些疑問,綜合其他人的解釋,加上自己的理解,在這里分享一下,如有不當之處,懇請指出。
1、概念
??值傳遞、引用傳遞,是計算機領域的專有名詞。
??值傳遞和引用傳遞,屬于函數調用時參數的求值策略(Evaluation Strategy),這是對調用函數時,求值和傳值的方式的描述,而非傳遞的內容的類型(內容指:是值類型還是引用類型,是值還是指針)。(參考:鏈接:https://www.zhihu.com/question/31203609/answer/112157038作者:Yolanda。著作權歸作者所有。商業(yè)轉載請聯系作者獲得授權,非商業(yè)轉載請注明出處。)
??值傳遞和引用傳遞,和Java概念里的值類型(基本數據類型)、引用類型(String、數組等)沒有任何聯系,這一點比較容易混淆。值類型/引用類型,是用于區(qū)分兩種內存分配方式,值類型在調用棧上分配,引用類型在堆上分配。一個描述內存分配方式,一個描述參數求值策略,兩者之間無任何依賴或約束關系。
2、為什么Java中的是值傳遞

2.1例一(參數為基本數據類型)
public static void main(String[] args) {
int i = 0;
//傳一個值類型(基本數據類型)
test1(i);
System.out.println("i="+i);
//結果:i=0
}
/**
* 函數一
* @param param
*/
public static void test1(int param) {
// 摔了一跤
param = 1;
}
??例一中,param存儲的是拷貝傳入變量的值,而不是地址。打個比方,我(變量i)有一杯水(i=0),你(test1函數)也想要喝,但是不能直接把我的喝掉,不然我就沒得喝了,于是乎,你拿出雙魚玉佩(參數param)復制了一杯一模一樣的水?,F在,我們都有了一杯水。然后,你一不小心,摔了一跤,把那杯水倒在地上了( test1中param = 1;),你的水沒了,但是對我沒有什么影響。所以,結果:i=0
2.1例二(參數為引用數據類型:String)
public static void main(String[] args) {
String s="s1";
//傳一個引用類型(引用數據類型:String)
test2(s);
System.out.println("s="+s);
//結果:s=s1
}
/**
* 函數二
* @param param
*/
public static void test2(String param) {
// 吃的開心,去唱歌
param = "s2";
}
??例二中,param存儲的是拷貝傳入變量的地址。打個比方,我(s)在沙縣國際大飯店定了個包間“芙蓉廳”,服務員給了我一張房卡(s="s1";),同時我邀請你(test2函數)也來,找服務員給了你一張“芙蓉廳”的房卡(param="s1"),吃了一半,你吃飽了,想去唱歌,你把“芙蓉廳”的房卡(param="s1")扔了,換了“真難聽”ktv包間的房卡(param = "s2";)。此時,我手里的仍然是“芙蓉廳”的房卡(param="s1"),你的換的是自己手里的卡,并沒有把“芙蓉廳”拆了,重新裝修成“真難聽”ktv包間。所以,結果:s=s1
2.1例三(參數為引用數據類型:數組)
public static void main(String[] args) {
int[] arr=new int[1];
arr[0]=1;
//傳一個引用類型(引用數據類型:數組)
test3(arr);
System.out.println("arr[0]="+arr[0]);
//結果:arr[0]=99
}
/**
* 函數三
* @param arrParam 復制房卡arr
*/
public static void test3(int[] arrParam) {
//喝多了,砸場子
arrParam[0] = 99;
}
??例三中,param存儲的是拷貝傳入變量的地址。打個比方,我在沙縣國際大飯店定了個包間“芙蓉廳”,服務員給了我一張房卡(arr),我點了一桌子菜(arr[0]=1;),同時我邀請你(test3函數)也來,找服務員也給了你一張“芙蓉廳”的房卡(arrParam=arr,復制arr的地址),吃了一半,你喝多了,發(fā)酒瘋,把桌子砸了(arrParam[0] = 99;)。我從去了趟廁所,回來一看,一片狼藉,還以為走錯了,拿出卡一看,還是arr呀,沒錯呀,但是一桌子菜砸成渣了(arr[0] = 99;)。所以,結果:arr[0] = 99;
3、總結
??首先,在Java中是值傳遞。值傳遞、引用傳遞中的“值”、“引用”和Java中的數據類型(基本數據類型、引用數據類型)沒有關系,不用把這一點搞混淆。
??其次,在Java中,變量傳給某個函數后,變量本身的值、地址沒有影響。例三中,雖然arr[0] = 99;但是arr數組本身指向的地址卻沒有改變,改變的是數組元素中的地址。
??最后,以上是個人對Java值傳遞的理解,歡迎和大家一起溝通交流。
??著作權歸作者所有。商業(yè)轉載請聯系作者獲得授權,非商業(yè)轉載請注明出處。