Java基础——方法的参数传递机制

来源:互联网 发布:js 跳转到锚点 编辑:程序博客网 时间:2024/05/01 13:23

   在之前用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);    }}
   运行结果:

   
    在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分配两块内存.

   

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

     

    因此,在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);    }}
     运行结果:

     

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

      

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


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


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


总结

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

原创粉丝点击