1. 程式人生 > >以Integer型別傳參值不變來理解Java值傳參

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

最近在寫程式碼的時候出了一個錯誤,由於對值引用理解的不深,將Integer傳入方法中修改,以為傳入後直接修改Integer中的值就不用寫返回值接收了,雖然很快發現了問題,但還是來總結一下

首先是程式碼:

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習慣了,所以覺得操作了一個引用就可以修改物件裡的值

實際情況是a1傳入方法後如圖

 

當我執行var = 10 的值以後,由於jdk1.5自動裝箱的特性,實際情況是等價於執行  var = Integer.valueOf(10);

valueOf()方法 參看原始碼 會根據傳入的數值 如果在-128-127之間 就從常量池中獲取一個Integer物件返回

如果不在範圍內 會new Integer(var)返回

那麼執行 var = 10以後 可以用下圖表示

 

當時我天真的以為是操作了那個5變成了10 

好了  ,這兩張圖已經足夠說明Java傳參為什麼是值傳參而不是引用傳參了

總結一下:

值傳參:將傳入的值拷貝一份   ,比如傳入int a = 5,並不會將變數a的地址傳給方法

               又或者傳入物件型別Integer a1 =5 ,a1本身是個引用傳入方法後不會直接將a1這個引用傳入,而是重新複製一份引用到方法引數中  ,有點繞 不理解? 想一下如果是將a1真實的傳入上述的方法中,那就變成a1 = new Integer(10) ,結果就不一樣了,變成下圖所示,當然這是在JAVA中不可能的

a1和var沒有分別,就是同一個變數

 

引用傳參:你可以理解為每次都把變數本身真實的傳進去了,不管是個像int a這種引用地址的變數,還是像Integer a1這種引用物件的變數