Java參數(shù)傳遞是傳值還是傳引用?

參考:http://ifeve.com/stackoverflow-reference-or-value/
   http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value

在Java的規(guī)范里說明了在Java中一切參數(shù)都是按值傳遞的,根本就沒有引用傳遞這一說奏窑。
理解這個概念的關(guān)鍵是要明白:

Dog myDog;

這里聲明的并不是一個Dog對象,而是一個指向Dog對象的指針墨叛。
這是什么意思呢漠趁,就是當(dāng)你執(zhí)行:

Dog myDog = new Dog("Rover");
foo(myDog);

本質(zhì)上是你把創(chuàng)建好的Dog對象的地址傳遞給foo方法。(我說的‘本質(zhì)上’其實是因為Java中的指針并不是直接的地址丸边,不過可以簡單的理解成這樣)纬朝。
假設(shè)Dog對象在內(nèi)存中的地址是42共苛。那我們就是把42這個值傳遞給了foo方法隅茎。

public void foo(Dog someDog) {
    someDog.setName("Max");     // AAA
    someDog = new Dog("Fifi");  // BBB
    someDog.setName("Rowlf");   // CCC
}

讓我們來看看執(zhí)行的時候會發(fā)生些什么绸硕。

  1. someDog的值設(shè)置為42出嘹。
  2. 在AAA行
    a.someDog指向一個內(nèi)存地址為42的Dog對象。
    b.把Dog(內(nèi)存地址為42)對象的name屬性改為Max垮斯。
  3. 在BBB行
    a.一個新的Dog對象被創(chuàng)建丸升,我們假設(shè)它的內(nèi)存地址是74。
    b.把這個74的內(nèi)存地址值賦給someDog夷狰。
  4. 在CCC行
    a.someDog指向一個內(nèi)存地址為74的Dog對象。
    b.把Dog(內(nèi)存地址為74)對象的name屬性改為Rowlf土至。
  5. 方法執(zhí)行完畢陶因。
    現(xiàn)在讓我們來想想在這個方法外面發(fā)生了什么:
    myDog改變了嗎贴见?
    這個問題的關(guān)鍵在于:
    要明確myDog是一個指針螟加,而不是一個實際的Dog對象。所以答案是它沒有改變站粟,myDog的值還是42奴烙;它指向的還是最開始的那個Dog對象(雖然在foo方法中的AAA行把它指向?qū)ο蟮膎ame屬性改成了Max,但是它指向的還是那個最初的Dog對象)幅虑。
    這驗證了改變所指對象的屬性,但沒有改變其指向。
    Java的運(yùn)行機(jī)制跟C很像绍申。你可以給一個指針賦值胃碾,然后把這個指針傳遞給一個方法书在,之后在這個方法中你可以改變這個指針指向?qū)ο蟮臄?shù)據(jù),但是你不能改變這個指針的指向栈源。

在C++涣雕,Ada,Pascal以及其他支持引用傳遞的語言中你可以直接改變傳遞的參數(shù)兑障。如果Java是引用傳遞的話逞怨,那么在執(zhí)行上面定義的foo方法的BBB行的時候someDog的指向就會被改變眯搭。

Let me explain this through an example:

public class Main{
     public static void main(String[] args){
          Foo f = new Foo("f");
          changeReference(f); // It won't change the reference!
          modifyReference(f); // It will modify the object that the reference variable "f" refers to!
     }
     public static void changeReference(Foo a){
          Foo b = new Foo("b");
          a = b;
     }
     public static void modifyReference(Foo c){
          c.setAttribute("c");
     }
}

I will explain this in steps:
1.Declaring a reference named f of type Foo and assign it to a new object of type Foo with an attribute "f".

Foo f = new Foo("f");


2.From the method side, a reference of type Foo with a name a is declared and it's initially assigned to null.

public static void changeReference(Foo a)

3.As you call the method changeReference, the reference a will be assigned to the object which is passed as an argument.

changeReference(f);

4.Declaring a reference named b of type Foo and assign it to a new object of type Foo with an attribute "b".

Foo b = new Foo("b");

5.a = b is re-assigning the reference a NOT f to the object whose its attribute is "b".

6.As you call modifyReference(Foo c) method, a reference c is created and assigned to the object with attribute "f".

7.c.setAttribute("c"); will change the attribute of the object that reference c points to it, and it's same object that reference f points to it.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盗痒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖吩抓,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挣饥,死亡現(xiàn)場離奇詭異,居然都是意外死亡倚舀,警方通過查閱死者的電腦和手機(jī)糠排,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門落追,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轿钠,“玉大人,你說我怎么就攤上這事。” “怎么了济瓢?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵箕宙,是天一觀的道長陷寝。 經(jīng)常有香客問我叛复,道長当辐,這世上最難降的妖魔是什么义桂? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任溉瓶,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好块攒,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布新翎。 她就那樣靜靜地躺著愁拭,像睡著了一般惜论。 火紅的嫁衣襯著肌膚如雪弹谁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天泳秀,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛乒融,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼罗洗,長吁一口氣:“原來是場噩夢啊……” “哼贩绕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎净捅,沒想到半個月后国章,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宁玫,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年愉昆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跛溉。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堪侯,靈堂內(nèi)的尸體忽然破棺而出伍宦,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布奴拦,位于F島的核電站株旷,受9級特大地震影響循头,放射性物質(zhì)發(fā)生泄漏卡骂。R本人自食惡果不足惜国裳,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望全跨。 院中可真熱鬧缝左,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至少办,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诵原,已是汗流浹背英妓。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留绍赛,地道東北人蔓纠。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像吗蚌,于是被迫代替她去往敵國和親腿倚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉蚯妇,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,725評論 0 9
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理敷燎,服務(wù)發(fā)現(xiàn),斷路器箩言,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法硬贯,類相關(guān)的語法,內(nèi)部類的語法陨收,繼承相關(guān)的語法饭豹,異常的語法,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • “我對你動心了务漩,這的確是一個錯誤拄衰。”我是這樣直截了當(dāng)?shù)母嬖V了那個人饵骨。對方一臉詫異翘悉,然后很驚奇的看著我...
    繁華宛如一掬細(xì)沙閱讀 685評論 0 0
  • 月光如水水如天,天邊炊煙飄過肩 外婆菜肴美又鮮居触,碗中月兒圓又圓 今夜好夢來敲門镐确,夢中溜進(jìn)廣寒宮 身上滿是桂花香,嘴...
    為獨行找個借口閱讀 106評論 0 0