剛開始學Java的時候一度覺得:基本數據類型是值傳遞,引用類型是引用傳遞。新人很容易在這兩個概念上面被搞糊塗,後來看了Hollis的文章才明白了Java中只有值傳遞。函數
接下來我能用簡單明瞭的方式來講明這一問題,但願能對剛學習Java的朋友有點幫助。學習
值傳遞:值傳遞是指在調用函數時將實際參數複製一份傳遞到函數中,這樣在函數中若是對參數進行修改,將不會影響到實際參數。spa
引用傳遞:在調用函數時將實際參數的地址傳遞到函數中,那麼在函數中對參數所進行的修改,將影響到實際參數。3d
值傳遞的概念沒啥說的,修改複製文件不會影響到源文件,最容易產生歧義的就在這個引用傳遞上。理解上面兩句話的關鍵在於兩句話的前半段中是否有複製。code
能夠理解爲有複製的就是值傳遞,不管複製的是值仍是地址值。接下來咱們依次探討Java中傳遞基本類型和應用類型的過程。對象
代碼: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
代碼:數據類型
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方法更改,即便傳遞引用對象,仍然是值傳遞。
若有錯誤歡迎指正!