java中的参数传递
在java官方文档中关于参数传递的描述是这样的"everything in Java is pass-by-value"。java中所有的参数传递都是值传递。在类、数组、接口的传递中,我们看到,数据的值发生了改变,但传入的值是引用地址值,归根到底还是值传递。
public class Convention{
public static void alterr(int a){
a = 3;
}
public static void main(String[] args){
Convention cn = new Convention();
int a = 1;
System.out.println(a);
cn.alterr(a);
System.out.println(a);
}
}
程序输出的结果是
1
1
方法传入的是a的值,方法调用完,出栈,没了。与a变量无关。
public class Nums{
public static viod change(int a){
a = 2;
}
public static void main(String[] args){
Nums ns = new Nums();
int[] a = {1,2};
System.out.println(a[0]);
ns.change(a[0]);
System.out.println(a[0]);
}
}
程序输出的结果为
2
方法change传入的是参数a[0]对应的引用地址值,在方法change引用地址对应的数值改变了,a[0]自然也变了。
public class ChangeString{
public static void change(String a){
a = "cat";
}
public static void main(String[] args){
ChangeString cg = new ChangeString();
String a = "dog";
System.out.println(a);
cg.change(a);
System.out.println(a);
}
}
程序输出的结果为
dog
dog
在方法change中传入了a的引用地址值,然后重点来了,由于String的特殊性,change中的"a = “cat”;"其实代码真正执行的时候是"a = new String(“cat”);"把一个新的引用地址值给了change方法中的a,然后在方法中对该方法的a进行一顿操作,最后,外面的a没有受到影响,最后输出的也是初始化时候的值。