在Java中,方法的参数传递方式是值传递。
我们首先测试基本类型的值传递,基本类型参数的传递方式是复制该基本类型参数,把该基本类型数值的复制品传给方法做参数,该基本类型数值和它的复制品之间没有关联关系,互不影响。
看以下的例子:
public class PrimtiveTransferTest {
public static void wrap(int a,int b){
System.out.println("在wrap方法中交换之前a的值是" + a + ";b的值是" + b);
int temp;
temp = a;
a = b;
b = temp;
System.out.println("在wrap方法中交换之后a的值是" + a + ";b的值是" + b);
}
public static void main(String[] args) {
int a = 6;
int b = 9;
System.out.println("main方法中未调用wrap方法前,main方法中a的值是" + a + ";b的值是" + b);
wrap(a, b);
System.out.println("main方法中调用wrap方法交换过a、b之后,main方法中a的值是" + a + ";b的值是" + b);
}
}
输出结果是:
main方法中未调用wrap方法前,main方法中a的值是6;b的值是9
在wrap方法中交换之前a的值是6;b的值是9
在wrap方法中交换之后a的值是9;b的值是6
main方法中调用wrap方法交换过a、b之后,main方法中a的值是6;b的值是9
由此我们可以看出,在Java方法中如果参数是基本类型值,参数传递并没有影响原本的基本类型的值。
另外,如果是引用类型变量,那么传递的就是引用变量的复制品,实则两个引用变量指向的是同一个对象,如果通过其中任何一个引用变量改变了它所指向的实例对象,那么另外一个也会受到影响。
再看接下来这个例子:
public class ReferenceTransferTest{
public static void swap(DataWrap dw){
System.out.println("wrap方法中a成员变量的值是" + dw.a + ";b成员变量的值是" + dw.b);
int temp = dw.a;
dw.a = dw.b;
dw.b = temp;
System.out.println("wrap方法中交换以后a成员变量的值是" + dw.a + ";b成员变量的值是" + dw.b);
}
public static void main(String[] args) {
DataWrap dw = new DataWrap();
dw.a = 6;
dw.b = 9;
swap(dw);
System.out.println("main方法中交换结束后a成员变量的值是" + dw.a + ";b成员变量的值是" + dw.b);
}
}
输出结果是:
main方法中通过wrap方法交换结束前,main方法中a成员变量的值是6;b成员变量的值是9
wrap方法中a成员变量的值是6;b成员变量的值是9
wrap方法中交换以后a成员变量的值是9;b成员变量的值是6
main方法中通过wrap方法交换结束后,main方法中a成员变量的值是9;b成员变量的值是6
本例中的参数传递方式就是值传递方法,系统复制了dw的副本,传入wrap方法,但是dw只是一个引用变量,所以系统复制了引用变量,而并未复制DataWrap对象,因此dw和它的复制品指向同一个DataWrap对象,因此该对象中成员变量的改变,会对两个引用变量都有影响。
摘抄编辑自《疯狂Java讲义》