關於Java傳參時是引用傳遞仍是值傳遞,一直是一個討論比較多的話題,有論壇說Java中只有值傳遞,也有些地方說引用傳遞和值傳遞都存在,比較容易讓人迷惑。java
可是請記住,Java 語言的參數傳遞只有「按值傳遞」spa
Java的參數傳遞,無論是基本數據類型仍是引用類型的參數,都是按值傳遞,沒有按引用傳遞!3d
先看一下microsoft的文檔中對按引用傳遞參數的定義(以下截圖)(看不懂的話就先看下面的,回頭再看這個,你會有一種醍醐灌頂的感受):code
先來看一下基本數據類型的參數按值傳遞的例子:對象
TransferTest.javablog
public class Test{ 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; } }
運行結果:內存
這個傳遞過程的示意圖以下:文檔
num做爲參數傳遞給changeNum()方法,是將內存空間中num所指向的存儲單元中存放的1傳遞給了changeNum()方法中的x變量。調用changeNum(),x變量在內存空間中分配一個存儲單元,這個時候,num的值1傳遞給了x指向的存儲單元中。此後,在changeNum()方法中對x的一切操做都是針對x所指向的這個存儲單元,與num所指向的那個存儲單元沒有關係了!class
因此,在changeNum()方法調用以後,num所指向的存儲單元的值仍是沒有發生變化,這就是所謂的「按值傳遞」!按值傳遞的精髓是:傳遞的是存儲單元中的內容,而不是存儲單元的引用!變量
Test2.java
1.public class Test2 { 2. public static void main(String[] args) { 3. Person p1 = new Person(); 4. System.out.println(p1); 5. change(p1); 6. System.out.println(p1); 7. } 8. 9. public static void change(Person p2) { 10. System.out.println(p2); 11. p2 = new People(); 12. System.out.println(p2); 13. } 14.} 15. 16./** 17. * Person類 18. */ 19.class Person { 20. 21.} 22.
運行結果:
能夠看出四次打印person的地址值,只有new以後的變量地址值不同,而且用完change() 方法以後,person變量並無發生改變。
這個傳遞過程的示意圖以下:
當執行到第3行代碼時,程序在堆內存中開闢了一塊內存空間用來存儲Person類的實例對象,同時在棧內存中開闢了一個存儲單元用來存儲該實例對象的引用,即上圖中person指向的存儲單元。
當執行到第5行代碼時,person做爲參數傳遞給change()方法,須要注意的是:person將本身存儲單元的內容傳遞給了change()方法的p變量(即引用對象的地址)!此後,在change()方法中對p的一切操做都是針對p所指向的存儲單元,與person所指向的那個存儲單元沒有關係了!如11行,對p變量指向了新的對象,這個傳遞過程以下圖
Java 語言的參數傳遞只有「按值傳遞」
基本類型傳參時,傳遞給形參的就是的實參的值
引用類型傳參時,傳遞給形參的是實參的引用對象的值