Java的参数传递总是按值调用。
无内鬼,先来整个例子:
Employee a = new Employee("Alice");
Employee b = new Employee("Bob");
swap(a,b);
public static void swap(Employee x,Employee y){
Employee temp = x;
x = y;
y = temp;
}
我们知道这里给函数 swap 传进来两个对象的引用,然后在内部将他们两个进行了交换。按理来说如果 Java 对对象采用的是按引用调用则,输出来应该是交换成功的。
但是结果,并不是这样而是他们根本没有被交换,所以 Java 参数传递是按值掉用的。
我们来分析一下原因:
一开始传入 swap 函数中时,a,b本来就已经指向了 Employee 类的实例了,而在 java 中并不是把两个引用原封不动的传到函数内,而是各拷贝了一份引用 x,y 也指向了 Employee 类的实例。
在函数内进行交换时,只交换了 x,y 引用的指向,它们确实交换成功了。但是函数结束后变量销毁,我们输出的还是 a,b 的引用所指向的实例,a,b 本身并没有发生改变,所以在 Java 这里并没有发生交换,体现了并不是按引用传递的。
我们看下面代码:
User u1 = new User();
User u2 = new User();
u1.name = "张三";
u2.name = "李四";
exchange2(u1, u2);
System.out.println(u1.name);
System.out.println(u2.name);
public static void exchange2(User x,User y) {
String temp = x.name;
x.name = y.name;
y.name = temp;
}
我们仍把对象的引用 a,b 传进函数内,函数内仍会生成引用的拷贝 x,y,但是通过 x 直接调用到了实例的属性 name并对其进行了交换,当函数结束时虽然销毁了引用 x,y 但是实例的值已经发生了改变。
所以这下你应该弄懂了 Java 参数传递总是值传递了。
下面总结一下 Java 方法中参数的使用情况:
- 一个方法不能修改一个基本数据类型的参数。
- 一个方法可以改变一个对象参数的状态。
- 一个方法不能让对象参数引用一个新的对象。