先简要阐述一下概念
传值:
将变量传递时,是变量的值在传递,可以理解为复制了一份值(其实在内存中也没有复制,只是这样便于理解)。因此修改传递进函数的参数(也可以是函数的返回值,返回出来)并不会影响到原值,相当于你只是修改了我的副本,跟我没关系。
传引用:
把引用进行传递,相当于复制了一份引用传递进函数,这时原引用和传递进来的引用其实都指向同一个对象,所以无论通过哪个引用来修改对象,对象都会被修改,也就是相当于若是在函数里修改传参,原变量也会被改变。
下面上例子,8种基本类型和其对应的包装类外加String类,都是传值。
public static void main(String[] args) {
int i=999;
chuanZhi(i);
System.out.println(i);
}
public static void chuanZhi(int i){
i=666;
}
输出:999
chuanZhi函数里修改了i,而由于i是int类型,属于传值,所以改了原值也不变。
public static void main(String[] args) {
Integer integer=new Integer(999);
chuanZhi(integer);
System.out.println(integer);
}
public static void chuanZhi(Integer integer){
integer=new Integer(666);
}
输出:999
这里都没有触发自动拆装箱,所以可以发现Integer类型也是传值的
值得注意的一点是,传值传引用的特点也适用于返回值,如下
public static void main(String[] args) {
String a="abc";
String b=huiDiao(a);
b="def";
System.out.println(a);
}
public static String huiDiao(String str){
return str;
}
输出:abc
这里返回的只是str的值,而不是引用,因此对b赋值无法改变a的值。
至于其他对象类则都是传递引用了,包括基本类型的数组也是对象类。