JAVA 的值傳遞

JAVA 的值傳遞

預(yù)備知識

  1. 對象變量與對象
    在 Java 中奇适,任何對象變量的值都是對存儲在另外一個地方(堆)的一個對象的引用羽嫡。
    對象變量本質(zhì)仍然是變量肢专,存儲在棧中舞肆,而對象則是類的實(shí)例,存儲在堆中鸟召。如:

        List<Date> dateList = new ArrayList<>();
    

    對象變量 dateList 的值是對存在于堆中的一個 ArrayList 對象的引用胆绊。如下圖:


    image.png
  2. 基本類型
    4 種整形:byte, short, int, long
    2 種浮點(diǎn)型:float, double
    1 種字符類型:char
    1 種表示真值的類型:boolean

  3. 值傳遞(call by value)
    方法接收的是調(diào)用者提供的值氨鹏,方法不能修改對應(yīng)的變量值欧募。

  4. 引用傳遞(call by reference)
    方法接收的是調(diào)用者提供的變量地址,方法可以修改對應(yīng)的變量值仆抵。


JAVA 中的方法參數(shù)

Java 中僅存在值傳遞(call by value)跟继,并不存在引用傳遞(call by reference)。即 Java 方法得到的是所有參數(shù)值的一個拷貝镣丑,并不是參數(shù)值本身(地址)舔糖,方法并不能修改任何參數(shù)值的內(nèi)容。

例一
    public static void main(String[] args) {
        int a = 34;
        System.out.println(a);
        changeInt(a);
        System.out.println(a);
    }
    
    public static void changeInt(int a2) {
        a2 = 78;
    }

  1. 上述結(jié)果是:
    34
    34

  2. 原因:
    當(dāng)調(diào)用 changeInt(a) 時莺匠,只是將 a 的值傳遞給 changeInt 方法金吗,其本身地址沒有傳遞。
    changeInt 方法中的變量 a2 和 main 方法中的變量 a 存儲在棧的兩個位置趣竣,changeInt 方法中的 a2 的值改變并不影響 main 方法中的 a摇庙。

  3. 執(zhí)行步驟:

    1. a2 初始化為 a 的值的拷貝(34);
    2. a2 被重新賦值為 78遥缕,但此時 a 的值依然是 34卫袒;
    3. changeInt 方法結(jié)束后,a2 的作用域結(jié)束单匣,不再被使用
image.png
例二
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        System.out.println(list);
        changeList1(list);
        System.out.println(list);
        changeList2(list);
        System.out.println(list);
    }
    
    public static void changeList1(List<String> list1) {
        list1.add("1");
    }
    
    public static void changeList2(List<String> list2) {
        list2 = new LinkedList<>();
    }
  1. 輸出結(jié)果:
    []
    [1]
    [1]

  2. 原因:
    例二和例一比較類似夕凝,區(qū)別在于:此時宝穗,方法參數(shù)不是基本數(shù)據(jù)類型,而是一個對象引用码秉,也就是傳遞了變量 list 的值 —— new ArrayList 這個對象的地址逮矛,簡稱對象A。
    changeList1 和 changeList2 方法得到的都是對象A的地址转砖,即變量 list1 和變量 list2 都被賦初值:對象A的地址(如圖)橱鹏。
    此時請注意,變量 list1 和變量 list2 仍然不同于變量 list堪藐。它們?nèi)齻€存在在棧上的不同位置莉兰。
    當(dāng)變量 list1 增加元素時,是給對象A增加元素礁竞。
    而變量 list2 被指向了一個新的對象B糖荒。在方法結(jié)束時被丟棄了,并沒有改變變量 list 的值模捂。

  3. 執(zhí)行步驟

    1. 變量 list 初始化為 對象 A
    2. 打印變量 list捶朵,也就是打印對象 A,即 []
    3. 變量 list1 被初始化為變量 list 的值的拷貝狂男,也就是對象 A 的地址综看;
    4. 變量 list1 增加元素 "1",也就是對象 A 增加元素 "1";
    5. 打印變量list岖食,也就是打印對象 A 的值红碑,即 [1];
    6. 變量 list2 被初始化為變量 list 的值的拷貝,也就是對象 A 的地址泡垃;
    7. 變量 list2 被賦值一個 LinkedList 對象析珊,稱之為對象 B;
    8. 變量 list2 的作用域結(jié)束蔑穴,對象 B 同時結(jié)束忠寻,被丟棄;
    9. 打印變量list存和,也就是打印對象 A 的值奕剃,即 [1];
image.png
image.png

總結(jié)

  1. Java 中僅有值傳遞,不存在引用傳遞捐腿。當(dāng)傳遞一個對象時纵朋,實(shí)際上傳遞的是對象參數(shù)(對象變量)的值,也就是該對象的引用的地址叙量;
  2. 一個方法不能修改一個基本數(shù)據(jù)類型的參數(shù)倡蝙;
  3. 一個方法可以改變一個對象參數(shù)的狀態(tài)
  4. 一個方法不能實(shí)現(xiàn)讓對象參數(shù)引用一個新的對象绞佩;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寺鸥,一起剝皮案震驚了整個濱河市猪钮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胆建,老刑警劉巖烤低,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笆载,居然都是意外死亡扑馁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進(jìn)店門凉驻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腻要,“玉大人,你說我怎么就攤上這事涝登⌒奂遥” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵胀滚,是天一觀的道長趟济。 經(jīng)常有香客問我,道長咽笼,這世上最難降的妖魔是什么顷编? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮剑刑,結(jié)果婚禮上媳纬,老公的妹妹穿的比我還像新娘。我一直安慰自己叛甫,他們只是感情好层宫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布杨伙。 她就那樣靜靜地躺著其监,像睡著了一般。 火紅的嫁衣襯著肌膚如雪限匣。 梳的紋絲不亂的頭發(fā)上抖苦,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天,我揣著相機(jī)與錄音米死,去河邊找鬼锌历。 笑死,一個胖子當(dāng)著我的面吹牛峦筒,可吹牛的內(nèi)容都是我干的究西。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼物喷,長吁一口氣:“原來是場噩夢啊……” “哼卤材!你這毒婦竟也來了遮斥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤扇丛,失蹤者是張志新(化名)和其女友劉穎术吗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帆精,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡较屿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卓练。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘蝎。...
    茶點(diǎn)故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖襟企,靈堂內(nèi)的尸體忽然破棺而出末贾,到底是詐尸還是另有隱情,我是刑警寧澤整吆,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布拱撵,位于F島的核電站,受9級特大地震影響表蝙,放射性物質(zhì)發(fā)生泄漏拴测。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一府蛇、第九天 我趴在偏房一處隱蔽的房頂上張望集索。 院中可真熱鬧,春花似錦汇跨、人聲如沸务荆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽函匕。三九已至,卻和暖如春蚪黑,著一層夾襖步出監(jiān)牢的瞬間盅惜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工忌穿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抒寂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓掠剑,卻偏偏與公主長得像屈芜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子朴译,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評論 2 350

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

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,557評論 1 118
  • 大家好我是白澤井佑。 這篇打算講講java開發(fā)中新人要知道的一些事情吧 對象引用和值引用糕珊,這個是在基礎(chǔ)不過的知識了,但...
    白澤1935閱讀 336評論 0 0
  • 看過一些Java教材的話毅糟,對這句話應(yīng)該不陌生: “在Java里面參數(shù)傳遞都是按值傳遞”這句話的意思是:按值傳遞是傳...
    jacky123閱讀 548評論 0 1
  • Java的值傳遞和引用傳遞問題 String的對象是不可修改的红选,如果真正要達(dá)到改變字符串的效果,我們需要使用Str...
    gadfly_only閱讀 595評論 0 50
  • 類似于屏幕的點(diǎn)擊事件一樣,系統(tǒng)提供了三個搖動事件:
    ShenYj閱讀 150評論 0 1