Java傳參:值傳遞 or 引用傳遞 ?

剛開始學Java的時候一度覺得:基本數據類型是值傳遞,引用類型是引用傳遞。新人很容易在這兩個概念上面被搞糊塗,後來看了Hollis的文章才明白了Java中只有值傳遞。函數

接下來我能用簡單明瞭的方式來講明這一問題,但願能對剛學習Java的朋友有點幫助。學習

 

1.概念

值傳遞:值傳遞是指在調用函數時將實際參數複製一份傳遞到函數中,這樣在函數中若是對參數進行修改,將不會影響到實際參數。spa

引用傳遞:在調用函數時將實際參數的地址傳遞到函數中,那麼在函數中對參數所進行的修改,將影響到實際參數。3d

值傳遞的概念沒啥說的,修改複製文件不會影響到源文件,最容易產生歧義的就在這個引用傳遞上。理解上面兩句話的關鍵在於兩句話的前半段中是否有複製。code

能夠理解爲有複製的就是值傳遞,不管複製的是值仍是地址值。接下來咱們依次探討Java中傳遞基本類型和應用類型的過程。對象

 

2.傳遞基本數據類型

代碼:blog

public static void main(String[] args) {
        int i = 2;
        add(i);
        System.out.println("i = "+i);
    }

public static void add(int x){
        x += 1;
        System.out.println("x = "+x);
    }

        

 

 

經過代碼和輸出結果能夠看出來,這就是值傳遞。get

 

 i 把值複製一份給了 x ,再修改x的值沒法影響 i 的值class

 

3.傳遞引用類型

代碼:數據類型

public static void main(String[] args) {
        Person p1 = new Person("張三", 18);
        change(p1);
        System.out.println("p1地址:"+p1);
        System.out.println("p1姓名:"+p1.getName());
        System.out.println("p1年齡:"+p1.getAge());

    }

public static void change(Person p2){
        p2.setAge(28);
        System.out.println("p2地址:"+p2);
        System.out.println("p2姓名:"+p2.getName());
        System.out.println("p2年齡:"+p2.getAge());

    }

結果:

 

 單從結果來看,可能就會有人誤覺得這是引用傳遞。

咱們再來詳細說說堆棧中是如何運做的:

 

 

咱們再來看一個案例:

public static void main(String[] args) {
        Person p1 = new Person("張三", 18);
        change(p1);
        System.out.println("p1地址:"+p1);
        System.out.println("p1姓名:"+p1.getName());
        System.out.println("p1年齡:"+p1.getAge());

    }

public static void change(Person p2){
        p2 = new Person("李四",20);
        System.out.println("p2地址:"+p2);
        System.out.println("p2姓名:"+p2.getName());
        System.out.println("p2年齡:"+p2.getAge());

    }

結果:

 

 此時p1的值就沒有受到change方法的影響

 

 因而可知,雖然對象中的數據可變,可是p1存的地址值是不會被change方法更改,即便傳遞引用對象,仍然是值傳遞。

 

若有錯誤歡迎指正!

相關文章
相關標籤/搜索