在之前用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);
    }
}

运行结果:

 

   

.net java 参数传递 java参数的传递方式_.net 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分配两块内存.   

.net java 参数传递 java参数的传递方式_成员变量_02

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

     

.net java 参数传递 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);
    }
}

运行结果:

 

     

.net java 参数传递 java参数的传递方式_值传递_04

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

      

.net java 参数传递 java参数的传递方式_成员变量_05

       再来分析一下上述代码的堆栈信息:
       执行上述代码②的位置,main()创建了一个DataWrap对象。

.net java 参数传递 java参数的传递方式_参数传递_06

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

.net java 参数传递 java参数的传递方式_成员变量_07

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

.net java 参数传递 java参数的传递方式_参数传递_08

 

总结

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