在之前用C++的时候,参数传递有三种:传值,传地址值,传引用。Java中参数传递机制只有一种:值传递。值传递就是将实际参数值得副本传入方法内,而参数本身不会受到任何影响。

基本数据类型参数传递

举个栗子:

public class PrimitiveTransferTest {
public static void swap(int a,int b){ //③
int tmp = a;
a=b;
b=tmp;
System.out.println("swap方法里,a的值是"+a+";b的值是"+b);
}
public static void main(String[] args){
int a =6; //①
int b = 9; //②
swap(a,b);
System.out.println("交换结束后,变量a的值是"+a+";变量b的值是"+b);
}
}

运行结果:

java swing 参数传递 java中的参数传递_成员变量

在main方法中a赋值为6,b赋值为9,执行swap方法时,将实参a,b变量的值传给了swap方法的形参.从执行结果来看,交换结束后main方法中的执行结果还是a值为6,b值为9,swap方法的a,b只是main()方法中变量a,b的复制品。

在main()方法中给a,b变量赋值的时候(上边代码中的①②),会在栈区中为a,b分配两块内存.

java swing 参数传递 java中的参数传递_参数传递_02

在上述代码③处系统会为swap()方法的形参a,b分配两块内存。

java swing 参数传递 java中的参数传递_成员变量_03

因此,在swap()方法中执行交换时,是对自己的栈区变量进行的交换,不会影响main()栈区内的变量值。

引用类型参数传递

举个栗子:

public class ReferenceTransferTest {
public static void swap(DataWrap dw) //③
{
int tmp = dw.a;
dw.a = dw.b;
dw.b= tmp;
System.out.println("swap方法里,a成员变量的值是"+dw.a+";b成员变量的值是"+dw.b);
//dw=null; //①
}
public static void main(String[] args){
DataWrap dw = new DataWrap(); //②
dw.a=6;
dw.b=9;
swap(dw);
System.out.println("交换结束后,a成员变量的值是"+dw.a+";b成员变量的值是"+dw.b);
}
}

运行结果:

java swing 参数传递 java中的参数传递_值传递_04

根据结果来看,swap成员变量的交换影响到了main()中的成员变量值,难道这是引用传递吗?千万不要被这个表象骗了哦.我们来做一个实验。假如他是引用传递,我们现在把上述代码①的位置解开注释。执行一下,发现交换结束后,成员变量和b成员变量还是能取到值。如果是引用传递,那当我们将dw的值设为null时,交换结束后成员变量a,b的值将不会被取到,而是会报异常。

java swing 参数传递 java中的参数传递_参数传递_05

再来分析一下上述代码的堆栈信息:

执行上述代码②的位置,main()创建了一个DataWrap对象。

java swing 参数传递 java中的参数传递_值传递_06

执行上述代码③的位置,将实参dw的地址值传递给了形参dw,而不是dw的对象本身。到此,实参dw和形参dw都是指向堆内存中的同一块区域。所以才会出现swap()方法中的变量交换后影响了main()方法中的成员变量值。

java swing 参数传递 java中的参数传递_成员变量_07

执行上述代码①处,将dw置为null,其实是swap()方法中失去了对对象的引用。

java swing 参数传递 java中的参数传递_参数传递_08

总结

Java中的参数传递机制只有一种:值传递(包括值的传递和地址值的传递).