《疯狂Java讲义》(七)---- 方法

时间:2023-03-09 20:18:11
《疯狂Java讲义》(七)---- 方法

一  方法的参数传递机制

  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);