为什么说按值传递
广义的说引用也是值。
对象类型传递
当一个对象引用(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关键字,所以对象的值不可改变,其它对象的包装器类型亦是如此。
三者的共通性
传进去的全部是自身的拷贝。