Java的傳值與傳引用

最近在工作中踩到了一個(gè)坑,就是Java的值傳遞和引用傳遞赌髓。對于值傳遞和引用傳遞定義有了解,但編寫代碼時(shí)沒有特別注意催跪。因?yàn)檫@個(gè)原因?qū)е乱粋€(gè)重大的線上bug锁蠕,這個(gè)是不可原諒的。由此決定把這些內(nèi)容再次牢記懊蒸,記錄下來荣倾。

作為一個(gè)工作幾年還犯這個(gè)錯(cuò)誤真是太慚愧!骑丸!

定義

  • 傳值
    傳遞的是值的副本舌仍。方法中對副本的修改,不會(huì)影響到調(diào)用方
  • 傳引用:
    傳遞的是引用的副本通危,共用一個(gè)內(nèi)存铸豁,會(huì)影響到調(diào)用方。
    此時(shí)黄鳍,形參和實(shí)參指向同一個(gè)內(nèi)存地址推姻。
    對引用副本本身(對象地址)的修改平匈,如設(shè)置為null框沟,重新指向其他對象藏古,不會(huì)影響到調(diào)用方。

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

public class ParamChangeValue {    
        public static void main(String[] args) {        
            int s = 1;        
            System.out.println("args = [" + s + "]");        
            change(s);        
            System.out.println("args = [" + s + "]");  
       }    
      private static void change(int i){ 
       i = i* 5;    
      }
}

輸出

args = [1]
args = [1]

對象

public class ObjectChangeValue {    
  public static class Score{        
      private int value;        
      public int getValue()  {            
          return value;  
       }        
    public void setValue(int value) {
            this.value = value;     
     }    
}   
 public static void main(String[] args) {       
   Score score = new Score();        
    score.setValue(1);        
    System.out.println("args = [" + score.getValue() + "]");                       
    change(score);        
    System.out.println("after args = [" + score.getValue() + "]");    
  }    
  private static void change(Score score){  
      score.setValue(2);    
  }
}

輸出

args = [1]
after args = [2]

注:
如果對象被重新創(chuàng)建或賦值為null忍燥,即new則會(huì)重新指向其他對象拧晕,不影響其遠(yuǎn)對象的值

public class ObjectChangeValue {    
  public static class Score{        
      private int value;        
      public int getValue()  {            
          return value;  
       }        
    public void setValue(int value) {
            this.value = value;     
     }    
}   
 public static void main(String[] args) {       
   Score score = new Score();        
    score.setValue(1);        
    System.out.println("args = [" + score.getValue() + "]");                       
    change(score);        
    System.out.println("after args = [" + score.getValue() + "]");    
  }    
  private static void change(Score score){  
      score = new score();    
  }
}

輸出

args = [1]
after args = [1]

String、Integer梅垄、Long等

public class StringChangeValue {    
    public static void main(String[] args) {        
          String s = "test1";        
          System.out.println("args = [" + s + "]");        
          change(s);                
          System.out.println("args = [" + s + "]");    
    }    
    private static void change(String i){       
           i = i + " test value";    
    }
}

輸出

args = [test1]
args = [test1]

總結(jié)

  1. 基本類型(byte,short,int,long,double,float,char,boolean)為傳值
  2. 對象類型(Object,數(shù)組厂捞,容器)為傳引用
  3. String、Integer队丝、Double等immutable類型因?yàn)轭惖淖兞吭O(shè)為final屬性靡馁,無法被修改,只能重新賦值或生成對象机久。
    當(dāng)Integer作為方法參數(shù)傳遞時(shí)臭墨,對其賦值會(huì)導(dǎo)致原有的引用被指向了方法內(nèi)的棧地址,失去原有的的地址指向膘盖,所以對賦值后的Integer做任何操作都不會(huì)影響原有值胧弛。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市侠畔,隨后出現(xiàn)的幾起案子结缚,更是在濱河造成了極大的恐慌,老刑警劉巖软棺,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件红竭,死亡現(xiàn)場離奇詭異,居然都是意外死亡喘落,警方通過查閱死者的電腦和手機(jī)德崭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揖盘,“玉大人眉厨,你說我怎么就攤上這事∈尴粒” “怎么了憾股?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箕慧。 經(jīng)常有香客問我服球,道長,這世上最難降的妖魔是什么颠焦? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任斩熊,我火速辦了婚禮,結(jié)果婚禮上伐庭,老公的妹妹穿的比我還像新娘粉渠。我一直安慰自己分冈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布霸株。 她就那樣靜靜地躺著雕沉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪去件。 梳的紋絲不亂的頭發(fā)上坡椒,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音尤溜,去河邊找鬼倔叼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宫莱,可吹牛的內(nèi)容都是我干的缀雳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼梢睛,長吁一口氣:“原來是場噩夢啊……” “哼肥印!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绝葡,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤深碱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后藏畅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敷硅,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年愉阎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绞蹦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡榜旦,死狀恐怖幽七,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溅呢,我是刑警寧澤澡屡,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站咐旧,受9級特大地震影響驶鹉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铣墨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一室埋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦姚淆、人聲如沸孕蝉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疹尾,卻和暖如春上忍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纳本。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工窍蓝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人繁成。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓吓笙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巾腕。 傳聞我的和親對象是個(gè)殘疾皇子面睛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司尊搬,掛了不少叁鉴,但最終還是拿到小米、百度佛寿、阿里幌墓、京東、新浪冀泻、CVTE常侣、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,274評論 11 349
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法弹渔,內(nèi)部類的語法胳施,繼承相關(guān)的語法,異常的語法肢专,線程的語...
    子非魚_t_閱讀 31,662評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理巾乳,服務(wù)發(fā)現(xiàn),斷路器鸟召,智...
    卡卡羅2017閱讀 134,699評論 18 139
  • 冰雪茫茫的北方胆绊,有一個(gè)古老的民族,流傳著一個(gè)古老的故事欧募。 一天晚上压状,老爺爺與孫子們圍爐夜話。老爺爺說,孩子們种冬,在人...
    繆繆J森閱讀 852評論 0 1
  • 也曾看過山镣丑、河、大海 還以為這些娱两,就都是澎湃 哪里想過會(huì)有一支 落英繽紛的花 能夠帶來悸動(dòng)靈魂的感慨 看見的莺匠,消失...
    東門聖手閱讀 180評論 0 4