Java按引用傳遞?按值傳遞!

當一個對象被看成參數傳遞到一個方法後,在此方法內能夠改變對象的屬性,那麼這裏究竟是「按值傳遞」仍是「按引用傳遞」?java

答:是按值傳遞。Java語言參數傳遞只有按值傳遞。當一個實例對象做爲參數被傳遞到方法中時,參數的值就是該對象的引用的一個副本。指向同一個對象,對象的內容能夠在被調用的方法內改變,但對象的引用(不是引用的副本)永遠不會改變。數組

Java的參數傳遞,無論是基本數據類型仍是引用類型的參數,都是按值傳遞,沒有按引用傳遞!code

Microsoft文檔中對引用傳遞的定義:在方法的參數列表中使用ref關鍵字,它指示參數按引用傳遞,而非按值傳遞。按引用傳遞的效果是,對所調用的方法中的參數進行任何的修改都反映在此方法中。例如,若是調用方傳遞本地變量表達式或數組元素訪問表達式,所調用方法會替換ref參數引用的對象,而後,當該方法返回時,調用方的本地變量或數組元素將開始引用新對象。對象

不要混淆經過引用傳遞與引用類型的概念。這兩種概念是不一樣的。不管方法參數是值類型仍是引用類型,都可由ref修改。當經過引用傳遞時,不會對值類型裝箱。blog

1.基本數據類型參數

public class TransferTest {
    public static void main(String[] args) {
        int num = 1;
        System.out.println("changeNum()方法調用以前:num = " + num);
        changeNum(num);
        System.out.println("changeNum()方法調用以後:num = " + num);
    }

    public static void changeNum(int x) {
        x = 2;
    }
}

運行結果:changeNum()方法調用以前:num = 1,changeNum()方法調用以前:num = 1內存

內存示意

num做爲參數傳遞給changeNum()方法時,是將內存空間中num所指向的那個存儲單元中存放的值1傳遞給了changeNum()方法中的x變量,而這個x變量也在內存空間中分配了一個存儲單元,這個時候,就把num的值1傳遞給了x這個存儲單元中。此後在changeNum()方法中對x的一切操做都是針對x所指向到的這個存儲單元,與num所指向的那個存儲單元無關。文檔

因此,在changeNum()方法調用以後,num所指向的存儲單元的值仍是沒有發生變化,這就是所謂的**「按值傳遞」**!按值傳遞的精髓是:傳遞的是存儲單元中的內容,而不是存儲單元的引用!it

2.引用數據類型參數

public class TransferTest2 {
    public static void main(String[] args) {
        Person p1 = new Person();
        System.out.println(p1);
        change(p1);
        System.out.println(p1);
    }

    public static void change(Person p2) {
        p2 = new Person();
    }
}

/**
 * Person類
 */
class Person {

}

運行結果:兩次打印person的地址值是同樣的,即調用完change() 方法以後,person變量並無發生改變。class

內存示意圖

當執行到第3行代碼時,程序在堆內存中開闢了一塊內存空間,用來存儲Person類的實例對象,同時在棧內存空間中開闢了一個存儲單元,用來存儲該實例對象的引用,person指向的存儲單元。 按 當執行到第5行代碼時,person做爲參數傳遞給change()方法,須要注意的是:person將本身的存儲單元的內容傳遞給了change()方法中的p變量。在change()方法中對p的一切操做都是針對p所指向的存儲單元,與person所指向的那個存儲單元沒有關係了!變量

相關文章
相關標籤/搜索