一  方法的参数传递机制

  Java方法的参数传递方式只有一种:值传递。就是将实际参数值的副本传入方法内,而参数本身不会受到任何影响。

  eg.

  基本类型的值传递

public class PrimitiveTransferTest {

    public static void swap(int a, int b) {
        int tmp = a;
        a = b;
        b = tmp;

        System.out.println("in swap(), a =" + a + " b =" + b);
    }

    public static void main(String[] args) {
        int a = 6;
        int b = 9;
        swap(a, b);
        System.out.println("after swap(), a =" + a + ", b =" + b);
    }

}

  输出结果:

in swap(), a =9 b =6
after swap(), a =6, b =9

所以main方法中的a和b,并不是swap方法中的a和b。

 

  main()开始定义了a和b两个局部变量,存在main方法的栈区。当程序执行swap方法时,系统进入swap方法中,并将main方法中的a和b变量作为参数值传入swap方法,传入swap方法的只是a和b的副本,而不是a和b本身,进入swap方法后系统产生了4个变量,即main()的a和b,swap()中的a和b。

  在main方法中调用swap方法时,main方法还没结束,因此系统为main和swap分配两块栈区,用于保存main和swap的局部变量。main方法中a和b变量作为参数值传入swap方法,实际上是在swap方法栈区中重新产生了两个变量a和b,并将main方法栈区中a和b变量的值分别赋给swap方法栈区的a和b参数(就是对swap方法的a和b形参进行初始化),此时,系统存在两个变量a,两个变量b,只是存在不同的方法栈区中。这就是值传递。

 

  eg.

  引用类型的值传递

  

public class ReferenceTransferTest {

    public static void swap(DataWrap dw) {
        int tmp = dw.a;
        dw.a = dw.b;
        dw.b = tmp;

        System.out.println("in swap(), dw.a =" + dw.a + ", dw.b =" + dw.b);
    }

    public static void main(String[] args) {
        DataWrap dw = new DataWrap();
        dw.a = 6;
        dw.b = 9;
        swap(dw);

        System.out.println("after swap(), dw.a = " + dw.a + ", dw.b =" + dw.b);

    }

}

class DataWrap {

    public int a;

    public int b;
}

输出结果:

in swap(), dw.a =9, dw.b =6
after swap(), dw.a = 9, dw.b =6

 

main方法中开始调用swap方法,main方法并未结束,系统会分别开辟出main和swap两个栈区,用于存放main和swap方法的局部变量。调用swap方法时,dw变量作为实参传入swap方法,同样采用值传递的方式:把main方法里的dw变量值赋给swap方法的dw形参,从而完成swap方法的dw形参的初始化,main方法中dw是一个引用,保存了DataWrap对象的地址值,当把dw的值赋给swap的dw形参后,即swap方法的dw形参也保存这个地址值,也引用对内存中的DataWrap对象。当程序在swap方法中操作dw形参时,由于dw制式一个引用变量,故实际操作的还是对内存中的DataWrap对象。此时,不管操作main方法里的dw变量,还是操作swap方法里的dw参数,其实都是操作它所引用的DataWrap对象。

 

二  形参个数可变的方法

  从JDK1.5之后,Java允许定义形参个数可变的参数,从而允许为方法制定数量不确定的形参。在定义方法时,在最后一个形参的类型后增加三点,则表明该形参可以接受多个参数值,多个参数值被当作数组传入。

  test(int a, String... books);

posted on 2017-01-16 09:58  coder为  阅读(243)  评论(0编辑  收藏  举报