Java方法里面的参数传递方式只有一种:[color=Red]值传递---就是将实际参数值的副本(复制品)传入方法内,而参数本身是不会收到任何影响[/color]
例如如下程序[code=java]package cn.itcast.heima
public class TestPrimitiveTransfer
{
public static void swap(int a , int b)
{
//下面三行代码实现a、b变量的值交换。
//定义一个临时变量来保存a变量的值
int tmp = a;
//把b的值赋给a
a = b;
//把临时变量tmp的值赋给a
b = tmp;
System.out.println("swap方法里,a的值是" + a + ";b的值是" + b);
}
public static void main(String[] args)
{
int a = 5;
int b = 6;
swap(a , b);
System.out.println("交换结束后,实参a的值是" + a + ";实参b的值是" + b);
}
}[/code]运行上面程序可以看到[code=java]swap方法里,a的值是6;b的值是5
交换结束后,实参a的值是5;实参b的值是6[/code]从上面可以程序就说明了参数传递的机制,
1、Java总是从main方法开始执行的,main方法定义两个变量,他们在内存里面如下所示
[img]http://hi.csdn.net/attachment/201107/27/0_1311735288v9b9.gif[/img]
2、当程序开始执行swap方法时候,系统进入swap方法,讲main方法里面的两个变量作为参数传递到这个方法里面(是副本)如下所示
[img]http://hi.csdn.net/attachment/201107/27/0_1311735695hxHe.gif[/img]
3、这个时候系统存在两个栈区main方法和swap方法,分别保存他们的局部变量,main方法a,b作为参数传递到swap方法,但是swap方法栈区产生两个变量A,B,并且讲main方法的两个变量赋值给swap方法栈区的a,b阐述([color=Red]这个就是对形参进行初始化[/color]),且系统存在两个a变量,两个b变量,只不过存在不同的方法栈区
4、程序在swap方法交换两个a,b变量的时候,就是在swap方法栈区里面进行浇花,结束再输出a,b的值,如下所示
[img]http://hi.csdn.net/attachment/201107/27/0_1311736213IZId.gif[/img]
5、从上面图片可以看到main方法栈区的a,b变量没有任何改变,程序只是改变了swap方法栈区的a.b两个变量的值,[color=Red]这就是值传递的本质,系统开始执行方法的时候,系统为形参执行初始化,就是把实参变量的值付给方法的形参变量,方法里面的操作并不是实际的实参变量[/color]
[color=Red]最后对于引用类型的参数的传递,一样也是采用的值的传递方式,唯一的不同点就是,他们和基本类型的变量在内存里面的保存方式不同,引用类型的变量保存的是对象的引用,当把这个引用的值传给其他变量的时候,其他变量也就指向了实际的对象,当操作这个对象的时候就是对实际的对象的操作,它是通过引用来直接关联对象的,传递的不是直接的对象,而是指向这个对象的引用,各位麻油可以自己画图试试[/color] |