最近在寫代碼的時候出了一個錯誤,因爲對值引用理解的不深,將Integer傳入方法中修改,覺得傳入後直接修改Integer中的值就不用寫返回值接收了,雖然很快發現了問題,但仍是來總結一下spa
首先是代碼:code
public static void main(String[] args){ Integer a1 = 5; updateInteger(a1); System.out.println(a1); } public static void updateInteger(Integer var){ var = 10; }
打印輸出的結果是5,應該是毫無疑問的,可當時爲何我會認爲a1應該是10呢?對象
大概是平時常常obj.integer = number習慣了,因此以爲操做了一個引用就能夠修改對象裏的值blog
當我執行var = 10 的值之後,因爲jdk1.5自動裝箱的特性,實際狀況是等價於執行 var = Integer.valueOf(10);源碼
valueOf()方法 參看源碼 會根據傳入的數值 若是在-128-127之間 就從常量池中獲取一個Integer對象返回class
若是不在範圍內 會new Integer(var)返回變量
那麼執行 var = 10之後
jdk
當時我天真的覺得是操做了那個5變成了10date
好了 ,這兩張圖已經足夠說明Java傳參爲何是值傳參而不是引用傳參了引用
總結一下:
值傳參:將傳入的值拷貝一份 ,好比傳入int a = 5,並不會將變量a的地址傳給方法
又或者傳入對象類型Integer a1 =5 ,a1自己是個引用,傳入方法後不會直接將a1這個引用傳入,而是從新複製一份引用到方法參數中 ,有點繞 不理解? 想一下若是是將a1真實的傳入上述的方法中,那就變成a1 = new Integer(10) ,結果就不同了,變成下圖所示,固然這是在JAVA中不可能的
引用傳參:你能夠理解爲每次都把變量自己真實的傳進去了,無論是個像int a這種引用地址的變量,仍是像Integer a1這種引用對象的變量
public static void main(String[] 參數) { AtomicInteger i=new AtomicInteger(40); i.intValue(); System.out.println(i); } public static void change(AtomicInteger i) { i.set(55);}