JAVA中值傳遞和引用傳遞

前言

我們都知道坡脐,java中數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型卢佣。

  • 基本數(shù)據(jù)類型

    • 整型:byte,short栋豫,int挤安,long
    • 浮點型:float,double
    • 字符型:char
    • 布爾型:boolean
  • 引用數(shù)據(jù)類型

    • 數(shù)組
    • 接口

方法的參數(shù)分為實際參數(shù)丧鸯,和形式參數(shù)蛤铜。

  • 形式參數(shù):定義方法時寫的參數(shù)
  • 實際參數(shù):調(diào)用方法時寫的具體數(shù)值

一般情況下,在數(shù)據(jù)做為參數(shù)傳遞的時候丛肢,基本數(shù)據(jù)類型是值傳遞围肥,引用數(shù)據(jù)類型是引用傳遞(地址傳遞)

值傳遞

public static void main(String[] args) {
    int num1 = 10;
    int num2 = 20;

    swap(num1, num2);

    System.out.println("num1 = " + num1);
    System.out.println("num2 = " + num2);
}

public static void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;

    System.out.println("a = " + a);
    System.out.println("b = " + b);
}

運行的結(jié)果是:

a = 20
b = 10
num1 = 10
num2 = 20
流程:
  • 主函數(shù)進棧,num1摔踱、num2初始化虐先。
  • 調(diào)用swap方法怨愤,swap( )進棧派敷,將num1和num2的值,復(fù)制一份給a和b。
  • swap方法中對a篮愉、b的值進行交換腐芍。
  • swap方法運行完畢,a试躏、b的值已經(jīng)交換猪勇。
  • swap方法彈棧。
  • 主函數(shù)彈棧颠蕴。
解析:

在swap方法中泣刹,a、b的值進行交換犀被,并不會影響到num1椅您、num2。因為寡键,a掀泳、b中的值,只是從num1西轩、num2的復(fù)制過來的员舵。 也就是說,a藕畔、b相當(dāng)于num1马僻、num2的副本,副本的內(nèi)容無論怎么修改注服,都不會影響到原件本身巫玻。

引用傳遞

public static void main(String[] args) {
    int[] arr = {1,2,3,4,5};

    change(arr);

    System.out.println(arr[0]);
}

//將數(shù)組的第一個元素變?yōu)?
public static void change(int[] array) {
    int len = array.length;
    array[0] = 0;
}

運行的結(jié)果是:

0
流程:
  • 主函數(shù)進棧,int[] arr初始化祠汇。
  • 調(diào)用change方法仍秤,change( )進棧,將arr的地址值可很,復(fù)制一份給array诗力。
  • change方法中,根據(jù)地址值我抠,找到堆中的數(shù)組苇本,并將第一個元素的值改為0。
  • change方法運行完畢菜拓,數(shù)組中第一個元素的值已經(jīng)改變瓣窄。
  • change方法彈棧。
  • 主函數(shù)彈棧纳鼎。
解析:

調(diào)用change()的時候俺夕,形參array接收的是arr地址值的副本裳凸。并在change方法中,通過地址值劝贸,對數(shù)組進行操作姨谷。change方法彈棧以后,數(shù)組中的值已經(jīng)改變映九。main方法中梦湘,打印出來的arr[0]也就從原來的1變成了0.

無論是主函數(shù),還是change方法件甥,操作的都是同一個地址值對應(yīng)的數(shù)組捌议。
就像你把自己家的鑰匙給了另一個人,這個人拿著鑰匙在你家一頓瞎折騰引有,然后走了禁灼。等你拿著鑰匙回到家以后,家里已經(jīng)變成了被折騰過后轿曙,慘不忍睹的樣子弄捕。。
這里的鑰匙就相當(dāng)于地址值导帝,家就相當(dāng)于數(shù)組本身守谓。

String類型傳遞


public static void main(String[] args) {
    String str = "AAA";

    change(str);

    System.out.println(str);
}   
public static void change(String s) {
    s = "abc";
}

運行的結(jié)果是:

AAA

String是一個類,類是引用數(shù)據(jù)類型您单,做為參數(shù)傳遞的時候斋荞,應(yīng)該是引用傳遞。但是從結(jié)果看起來卻是值傳遞

原因:

String的API中有這么一句話:“their values cannot be changed after they are created”虐秦,
意思是:String的值在創(chuàng)建之后不能被更改平酿。
API中還有一段:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
也就是說:對String對象str的任何修改 等同于 重新創(chuàng)建一個對象,并將新的地址值賦值給str悦陋。

這樣的話蜈彼,上面的代碼就可以寫成:

public static void main(String[] args) {
    String str1 = "AAA";

    change(str1);

    System.out.println(str1);
}   
public static void change(String s) {
    char data[] = {'a', 'b', 'c'}
    String str = new String(data);
    s = str;
}

流程:
  • 主函數(shù)進棧,str1初始化俺驶。
  • 調(diào)用change方法幸逆,change( )進棧,將str1的地址值暮现,復(fù)制一份給s还绘。
  • change方法中,重現(xiàn)創(chuàng)建了一個String對象”abc”栖袋,并將s指向了新的地址值拍顷。
  • change方法運行完畢,s所指向的地址值已經(jīng)改變塘幅。
  • change方法彈棧昔案。
  • 主函數(shù)彈棧尿贫。
解析:

String對象做為參數(shù)傳遞時,走的依然是引用傳遞爱沟,只不過String這個類比較特殊帅霜。
String對象一旦創(chuàng)建匆背,內(nèi)容不可更改呼伸。每一次內(nèi)容的更改都是重現(xiàn)創(chuàng)建出來的新對象。
當(dāng)change方法執(zhí)行完畢時钝尸,s所指向的地址值已經(jīng)改變括享。而s本來的地址值就是copy過來的副本,所以并不能改變str1的值珍促。

String類型類似情況:

class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}
public class Test {
    public static void main(String[] args) {
        Person p = new Person("張三");

        change(p);

        System.out.println(p.name);
    }

    public static void change(Person p) {
        Person person = new Person("李四");
        p = person; 
    }
}

運行的結(jié)果是:

張三

總結(jié)

  • 值傳遞的時候铃辖,將實參的值,copy一份給形參猪叙。
  • 引用傳遞的時候娇斩,將實參的地址值,copy一份給形參穴翩。

也就是說犬第,不管是值傳遞還是引用傳遞,形參拿到的僅僅是實參的副本芒帕,而不是實參本身歉嗓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市背蟆,隨后出現(xiàn)的幾起案子鉴分,更是在濱河造成了極大的恐慌,老刑警劉巖带膀,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件志珍,死亡現(xiàn)場離奇詭異,居然都是意外死亡垛叨,警方通過查閱死者的電腦和手機碴裙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來点额,“玉大人舔株,你說我怎么就攤上這事』估猓” “怎么了载慈?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長珍手。 經(jīng)常有香客問我办铡,道長辞做,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任寡具,我火速辦了婚禮秤茅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘童叠。我一直安慰自己框喳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布厦坛。 她就那樣靜靜地躺著五垮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杜秸。 梳的紋絲不亂的頭發(fā)上放仗,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機與錄音撬碟,去河邊找鬼诞挨。 笑死,一個胖子當(dāng)著我的面吹牛呢蛤,可吹牛的內(nèi)容都是我干的惶傻。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼顾稀,長吁一口氣:“原來是場噩夢啊……” “哼达罗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起静秆,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤粮揉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抚笔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扶认,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年殊橙,在試婚紗的時候發(fā)現(xiàn)自己被綠了辐宾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡膨蛮,死狀恐怖叠纹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敞葛,我是刑警寧澤誉察,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站惹谐,受9級特大地震影響持偏,放射性物質(zhì)發(fā)生泄漏驼卖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一鸿秆、第九天 我趴在偏房一處隱蔽的房頂上張望酌畜。 院中可真熱鬧,春花似錦卿叽、人聲如沸桥胞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽埠戳。三九已至井誉,卻和暖如春蕉扮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颗圣。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工喳钟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人在岂。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓奔则,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔽午。 傳聞我的和親對象是個殘疾皇子易茬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

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

  • 前言:1.此文中的語法會根據(jù)Swift的升級變動而更新。2.如果需要請移步 -> swift2.2 語法(上)及老、...
    珍此良辰閱讀 514評論 2 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法抽莱,類相關(guān)的語法,內(nèi)部類的語法骄恶,繼承相關(guān)的語法食铐,異常的語法,線程的語...
    子非魚_t_閱讀 31,669評論 18 399
  • 從三月份找實習(xí)到現(xiàn)在僧鲁,面了一些公司虐呻,掛了不少,但最終還是拿到小米寞秃、百度斟叼、阿里、京東春寿、新浪朗涩、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,281評論 11 349
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,824評論 1 10
  • 津巴多普通心理學(xué) 674頁厚度的心理學(xué)入門級教材 我要搞定你哦扒腕! 7.1 天性負責(zé)提議,教養(yǎng)負責(zé)決定萤悴。 敏感期瘾腰,大...
    月野兔_閱讀 263評論 1 1