爲什麼說按值傳遞
廣義的說引用也是值。
對象類型傳遞
當一個對象引用(list)作爲一個參數被傳遞到方法中時,參數就是該對象引用(list)一個副本(listCopy);因爲是副本,所以不會影響對象引用(list)的值;
該副本(listCopy)指向同一個對象,通過副本(listCopy)可以改變對象的內容。
代碼驗證
/**
* @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");
}
}
基本類型傳遞
當一個基本類型作爲參數傳遞進方法時,傳遞進去的是基本類型的拷貝。故不會影響外部參數的值。
代碼驗證
/**
* @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類型傳遞
特殊性
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類型傳遞時雖然是對象類型,但不能通過引用改變對象的值,切記!
值不能改變的原因
通過閱讀String的源碼可得,String中使用一個char數組進行值的存放,該char數組有final關鍵字,所以對象的值不可改變,其它對象的包裝器類型亦是如此。
三者的共通性
傳進去的全部是自身的拷貝。