廣義的說引用也是值。java
當一個對象引用(list)做爲一個參數被傳遞到方法中時,參數就是該對象引用(list)一個副本(listCopy);由於是副本,因此不會影響對象引用(list)的值;數組
該副本(listCopy)指向同一個對象,經過副本(listCopy)能夠改變對象的內容。spa
/** * @author : bozheng * @date : 2018/8/12 14:27 */ public class TestDemo { @Test public void test(){ //list爲對象的引用 List list = new ArrayList(); //傳進去的是list引用的副本 setList1(list); //外部引用的指向並未變成null,該引用的副本變爲了null System.out.println(list); //傳進去的是list引用的副本 setList2(list); //改了對象的值 System.out.println(list); } public void setList1(List listCopy){ //改變的是引用副本的指向 listCopy = null; } public void setList2(List listCopy){ //改變對象的值 listCopy.add("1"); } }
當一個基本類型做爲參數傳遞進方法時,傳遞進去的是基本類型的拷貝。故不會影響外部參數的值。code
/** * @author : bozheng * @date : 2018/8/12 14:27 */ public class TestDemo { @Test public void test(){ int a = 0; //傳遞進去的是a的拷貝 setList1(a); //a的值爲改變 System.out.println(a); } public void setList1(int aCopy){ aCopy = 1; } }
String是對象類型,不是基本類型,正常來說應符合對象類型傳遞的規則:1.傳遞進去的是引用的副本;2.引用的副本可改變指向對象的值。對象
可是若是是這樣的話,我也會畫蛇添足把String單獨列出來了,你們能夠運行一下代碼:源碼
/** * @author : bozheng * @date : 2018/8/12 14:27 */ public class TestDemo { @Test public void test(){ String a = "hello"; //傳遞進去的是a的拷貝 setString(a); //a的值未改變! System.out.println(a); } public void setString(String aCopy){ aCopy = "hi"; } }
運行代碼後發現,a的值並未改變。故String類型傳遞時雖然是對象類型,但不能經過引用改變對象的值,切記!class
經過閱讀String的源碼可得,String中使用一個char數組進行值的存放,該char數組有final關鍵字,因此對象的值不可改變,其它對象的包裝器類型亦是如此。test
傳進去的所有是自身的拷貝。date