以Integer類型傳參值不變來理解Java值傳參

最近在寫代碼的時候出了一個錯誤,因爲對值引用理解的不深,將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);}

相關文章
相關標籤/搜索