關于Java對象作為參數(shù)傳遞是傳值還是傳引用的問題

前言
  在Java中右冻,當對象作為參數(shù)傳遞時装蓬,究竟傳遞的是對象的值,還是對象的引用国旷,這是一個飽受爭議的話題矛物。若傳的是值,那么函數(shù)接收的只是實參的一個副本跪但,函數(shù)對形參的操作并不會對實參產(chǎn)生影響履羞;若傳的是引用峦萎,那么此時對形參的操作則會影響到實參。
  首先我們來看一句代碼:

Object obj = new Object();
1
  這句話的意思是:創(chuàng)建一個Object對象忆首,再創(chuàng)建一個名為obj的引用爱榔,讓這個引用指向這個對象,如下圖所示:

在有了上面的基礎之后糙及,我們便來看下面這組在網(wǎng)上很流行的例子:

基本數(shù)據(jù)類型作為參數(shù)傳遞:
例1:

public class test {
public static void main(String[] args) {
int i = 1;
System.out.println("before change, i = "+i);
change(i);
System.out.println("after change, i = "+i);
}
public static void change(int i){
i = 5;
}
}
1
2
3
4
5
6
7
8
9
10
11
  這個例子不難理解详幽,當基本數(shù)據(jù)類型作為參數(shù)傳遞時,傳遞的是實參值的副本浸锨,即傳的是值唇聘,無論在函數(shù)中怎么操作這個副本,實參的值是不會被改變的柱搜。所以以上代碼執(zhí)行的結果是:
  
  before change, i = 1
  after change, i = 1

對象作為參數(shù)傳遞:
  在下面的例2中迟郎,我們把StringBuffer對象作為參數(shù)傳遞到change函數(shù)。
  
  例2:

public class test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("before change, sb is "+sb.toString());
change(sb);
System.out.println("after change, sb is "+sb.toString());
}
public static void change(StringBuffer stringBuffer){
stringBuffer.append("world !");
}
}
1
2
3
4
5
6
7
8
9
10
11
  為了方便推理出結論聪蘸,我們先直接看程序的運行結果:
  
  before change, sb is Hello
  after change, sb is Hello world !
  
  從輸出結果中我們可以發(fā)現(xiàn)宪肖,sb所指向的對象的值被改變了,那么是否我們可以推論出健爬,在Java中控乾,當對象作為參數(shù)傳遞時,傳遞的是該對象的引用呢娜遵?我們再來看下面這個例子:
  
  例3:

public class test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("before change, sb is "+sb.toString());
change(sb);
System.out.println("after change, sb is "+sb.toString());
}
public static void change(StringBuffer stringBuffer){
stringBuffer = new StringBuffer("Hi ");
stringBuffer.append("world !");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
  如果上面的推論是正確的蜕衡,即Java中對象作為參數(shù)傳遞,實際傳遞的是該對象的引用魔熏,那么在調(diào)用change函數(shù)之后衷咽,原對象的值應該是會改變的,變?yōu)椤癏i world 蒜绽!”镶骗,但是,當我們運行程序后躲雅,結果卻是如下所示:
  
  before change, sb is Hello
  after change, sb is Hello
  
  原對象的值并沒有被改變鼎姊,這與上面的推論相矛盾!為什么在Java中相赁,當對象作為參數(shù)傳遞時相寇,有的時候?qū)崊⒈桓淖兞耍械臅r候?qū)崊⒉⑽幢桓淖兡嘏タ疲肯旅孀屛覀儊矸治鲆幌缕渲械脑颍?br>   從文章的開頭我們知道唤衫,當執(zhí)行StringBuffer sb = new StringBuffer(“Hello “)時,我們創(chuàng)建了一個指向新建對象“new StringBuffer(“Hello “)”的引用“sb”绵脯,如下圖所示:
  
  
  
  在例2中佳励,當我們調(diào)用change函數(shù)后休里,實際上,形參stringBuffer也指向了實參sb所指向的對象赃承,即:
  
  
  
  那么當我們執(zhí)行stringBuffer.append(“world !”)后妙黍,便通過對象的引用“stringBuffer”修改了對象的值,使之變成了“Hello world 瞧剖!”拭嫁,即:
  
  
  
  但是,在例3中的change函數(shù)中抓于,我們又新建了一個對象“new StringBuffer(“Hi “)”(這實際上在內(nèi)存中開辟了一塊在原對象地址之外的新區(qū)域)做粤,這讓形參stringBuffer實際指向了這個新建的對象,并將新對象的值設置為“Hi world 毡咏!”驮宴,即:
  
  
  
  那么我們就不難理解逮刨,為何在執(zhí)行完change函數(shù)之后呕缭,實參的值仍為“Hello”了。

結論
  綜上所述修己,我們可以得出結論:在Java中恢总,當對象作為參數(shù)傳遞時,實際上傳遞的是一份“引用的拷貝”睬愤。


作者:Alan_Xiang
來源:CSDN
原文:https://blog.csdn.net/xiangwanpeng/article/details/52454479
版權聲明:本文為博主原創(chuàng)文章片仿,轉(zhuǎn)載請附上博文鏈接!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尤辱,一起剝皮案震驚了整個濱河市砂豌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌光督,老刑警劉巖阳距,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異结借,居然都是意外死亡筐摘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門船老,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咖熟,“玉大人,你說我怎么就攤上這事柳畔♀晒埽” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵薪韩,是天一觀的道長确沸。 經(jīng)常有香客問我堪置,道長,這世上最難降的妖魔是什么张惹? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任舀锨,我火速辦了婚禮,結果婚禮上宛逗,老公的妹妹穿的比我還像新娘坎匿。我一直安慰自己,他們只是感情好雷激,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布替蔬。 她就那樣靜靜地躺著,像睡著了一般屎暇。 火紅的嫁衣襯著肌膚如雪承桥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天根悼,我揣著相機與錄音凶异,去河邊找鬼。 笑死挤巡,一個胖子當著我的面吹牛剩彬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矿卑,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼喉恋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了母廷?” 一聲冷哼從身側(cè)響起轻黑,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琴昆,沒想到半個月后氓鄙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡椎咧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年玖详,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勤讽。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蟋座,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脚牍,到底是詐尸還是另有隱情向臀,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布诸狭,位于F島的核電站券膀,受9級特大地震影響君纫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芹彬,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一蓄髓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舒帮,春花似錦会喝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽译红。三九已至预茄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侦厚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淳蔼,地道東北人鹉梨。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓存皂,卻偏偏與公主長得像晌坤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旦袋,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容