??對值傳遞缸废、引用傳遞有些疑問包蓝,綜合其他人的解釋,加上自己的理解企量,在這里分享一下测萎,如有不當之處,懇請指出届巩。
1硅瞧、概念
??值傳遞、引用傳遞恕汇,是計算機領(lǐng)域的專有名詞腕唧。
??值傳遞和引用傳遞或辖,屬于函數(shù)調(diào)用時參數(shù)的求值策略(Evaluation Strategy),這是對調(diào)用函數(shù)時枣接,求值和傳值的方式的描述颂暇,而非傳遞的內(nèi)容的類型(內(nèi)容指:是值類型還是引用類型,是值還是指針)但惶。(參考:鏈接:https://www.zhihu.com/question/31203609/answer/112157038作者:Yolanda耳鸯。著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)膀曾,非商業(yè)轉(zhuǎn)載請注明出處县爬。)
??值傳遞和引用傳遞,和Java概念里的值類型(基本數(shù)據(jù)類型)妓肢、引用類型(String捌省、數(shù)組等)沒有任何聯(lián)系,這一點比較容易混淆碉钠。值類型/引用類型纲缓,是用于區(qū)分兩種內(nèi)存分配方式,值類型在調(diào)用棧上分配喊废,引用類型在堆上分配祝高。一個描述內(nèi)存分配方式,一個描述參數(shù)求值策略污筷,兩者之間無任何依賴或約束關(guān)系工闺。
2、為什么Java中的是值傳遞
2.1例一(參數(shù)為基本數(shù)據(jù)類型)
public static void main(String[] args) {
int i = 0;
//傳一個值類型(基本數(shù)據(jù)類型)
test1(i);
System.out.println("i="+i);
//結(jié)果:i=0
}
/**
* 函數(shù)一
* @param param
*/
public static void test1(int param) {
// 摔了一跤
param = 1;
}
??例一中瓣蛀,param存儲的是拷貝傳入變量的值陆蟆,而不是地址。打個比方惋增,我(變量i)有一杯水(i=0)叠殷,你(test1函數(shù))也想要喝,但是不能直接把我的喝掉诈皿,不然我就沒得喝了林束,于是乎,你拿出雙魚玉佩(參數(shù)param)復制了一杯一模一樣的水』鳎現(xiàn)在壶冒,我們都有了一杯水。然后截歉,你一不小心胖腾,摔了一跤,把那杯水倒在地上了( test1中param = 1;),你的水沒了胸嘁,但是對我沒有什么影響瓶摆。所以,結(jié)果:i=0
2.1例二(參數(shù)為引用數(shù)據(jù)類型:String)
public static void main(String[] args) {
String s="s1";
//傳一個引用類型(引用數(shù)據(jù)類型:String)
test2(s);
System.out.println("s="+s);
//結(jié)果:s=s1
}
/**
* 函數(shù)二
* @param param
*/
public static void test2(String param) {
// 吃的開心性宏,去唱歌
param = "s2";
}
??例二中群井,param存儲的是拷貝傳入變量的地址。打個比方毫胜,我(s)在沙縣國際大飯店定了個包間“芙蓉廳”书斜,服務員給了我一張房卡(s="s1";),同時我邀請你(test2函數(shù))也來酵使,找服務員給了你一張“芙蓉廳”的房卡(param="s1")荐吉,吃了一半,你吃飽了口渔,想去唱歌样屠,你把“芙蓉廳”的房卡(param="s1")扔了,換了“真難聽”ktv包間的房卡(param = "s2";)缺脉。此時痪欲,我手里的仍然是“芙蓉廳”的房卡(param="s1"),你的換的是自己手里的卡攻礼,并沒有把“芙蓉廳”拆了业踢,重新裝修成“真難聽”ktv包間。所以礁扮,結(jié)果:s=s1
2.1例三(參數(shù)為引用數(shù)據(jù)類型:數(shù)組)
public static void main(String[] args) {
int[] arr=new int[1];
arr[0]=1;
//傳一個引用類型(引用數(shù)據(jù)類型:數(shù)組)
test3(arr);
System.out.println("arr[0]="+arr[0]);
//結(jié)果:arr[0]=99
}
/**
* 函數(shù)三
* @param arrParam 復制房卡arr
*/
public static void test3(int[] arrParam) {
//喝多了知举,砸場子
arrParam[0] = 99;
}
??例三中,param存儲的是拷貝傳入變量的地址太伊。打個比方雇锡,我在沙縣國際大飯店定了個包間“芙蓉廳”,服務員給了我一張房卡(arr)僚焦,我點了一桌子菜(arr[0]=1;)遮糖,同時我邀請你(test3函數(shù))也來,找服務員也給了你一張“芙蓉廳”的房卡(arrParam=arr叠赐,復制arr的地址),吃了一半屡江,你喝多了芭概,發(fā)酒瘋,把桌子砸了(arrParam[0] = 99;)惩嘉。我從去了趟廁所罢洲,回來一看,一片狼藉,還以為走錯了惹苗,拿出卡一看殿较,還是arr呀,沒錯呀桩蓉,但是一桌子菜砸成渣了(arr[0] = 99;)淋纲。所以,結(jié)果:arr[0] = 99;
3院究、總結(jié)
??首先洽瞬,在Java中是值傳遞。值傳遞业汰、引用傳遞中的“值”伙窃、“引用”和Java中的數(shù)據(jù)類型(基本數(shù)據(jù)類型、引用數(shù)據(jù)類型)沒有關(guān)系样漆,不用把這一點搞混淆为障。
??其次,在Java中放祟,變量傳給某個函數(shù)后鳍怨,變量本身的值、地址沒有影響舞竿。例三中京景,雖然arr[0] = 99;但是arr數(shù)組本身指向的地址卻沒有改變,改變的是數(shù)組元素中的地址骗奖。
??最后确徙,以上是個人對Java值傳遞的理解,歡迎和大家一起溝通交流执桌。
??著作權(quán)歸作者所有鄙皇。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處仰挣。