按值调用 (call by value): 表示方法接收的是调用者提供的值。
而按引用调用 ( call by reference):表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
C++支持值传递和引用传递,但Java 程序设计语言总是采用按值调用。也就是说, 方法得到的是所有参数值的一个拷 贝,特别是,方法不能修改传递给它的任何参数变量的内容。
public class callByRefTest {
public static void updata(int x){
x = x*10;
}
public static void main(String[] args){
int a = 3;
System.out.println(a);//输出a = 3;
}
}
上面的程序输出为3,说明一个方法不能改变一个普通类型参数的值。
package JsonTest;
public class callByRef1 {
public static int updata(int x){
x = x*10;
return x;
}
public static void main(String[] args){
int a = 3;
int b = updata(a);
System.out.println(a);//输出a = 3
System.out.println(b);//输出b = 30
}
}
修改第一个例子,在updata函数中将传入参数扩大十倍,然后return出来。其实当我们将一个普通类型的参数作为一个函数参数的时候,传入的是一个变量的副本,当我们在函数体里面改变变量值的时候,改变的是副本的值,所以我们返回的也是副本扩大之后的值,但是本来的数值还是没有变。
那如果我们的参数传入的是一个对象呢?
class Employee{
int age;
String name;
public Employee(int age,String name){
this.age = age;
this.name = name;
}
}
public class callByRef2 {
void swap(Employee x,Employee y){
Employee temp;
temp = x;
x = y;
y=temp;
System.out.println(x.name+" "+"我今年"+x.age);
System.out.println(y.name+" "+"我今年"+y.age);
}
public static void main(String[] agrs){
Employee a = new Employee(20,"我是a");
Employee b = new Employee(21,"我是b");
Test t = new Test();
t.swap(a,b);
System.out.println(a.name+" "+"我今年"+a.age);
System.out.println(b.name+" "+"我今年"+b.age);
}
}
我们可以看到在函数里面确实是将传入的两个Employee对象交换了,但是原来的对象还是没有改变。如果是传的引用,那么但我们把两个Employee对象a,b传入swap函数中的时候,x应该是指向a,y应该指向的b,那么这个方法就应该能够实现交换数据的效果:
在方法结束时参数变量
X
和
y
被丢弃了
。
原来的变量
a
和
b 仍然引用 这个方法调用之前所引用的对象