方法的参数传递机制
来源:互联网 发布:语音广告合成软件 编辑:程序博客网 时间:2024/06/05 15:11
Java的参数传递只有一种方式:值传递。所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不受任何影响。
下面程序演示了方法参数传递的效果。
public class C {private static void swap(int a,int b){//下面实现a、b值的交换int temp = a;a = b;b = temp;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);}}
运行上面的程序,看到如下运行结果:
swap方法里,a的值是9;b的值是6
交换结束后,a的值是6;b的值是9
从这个运行结果可以看出,main()方法里的变量a和b,并不是swap()方法里的a和b。正如前面所讲的,swap()方法里的变量a和b只是main方法里变量a和b的复制品。
Java程序从main方法开始执行,main方法里定义了a、b两个局部变量,两个变量的储存示意图如下图所示:
当程序执行swap方法时,系统进入swap方法,并将main方法中的a、b变量作为参数值传入swap方法中,传入只是a和b的副本,而不是a、b本身。进入swap方法后系统中产生了4个变量,这4个变量在内存中的存储示意图如下图:
在main方法中调用swap方法时,main方法还未结束。因此,系统分别为main方法和swap方法分配两块栈区,用于保存main方法和swap方法的布局变量。
在执行swap方法交换a、b的值后,内存中存储的示意图如下所示:
对比这前后的示意图可以看出,main方法栈区中a、b的值并未有任何改变,程序改变的只是swap方法栈区中的a、b。这就是值传递的实质:当系统开始执行方法时,系统为形参执行初始化,就是把实参的值赋给方法的形参变量,方法里操作的并不是实际的实参变量。
上面的是基本类型的参数传递,Java对于引用类型的参数传递,一样采用的是值传递方式。下面是实例代码:
public class DataWrap {int a;int b;}public class D {public static void swap(DataWrap dw){//下面实现a、b值的交换int temp = dw.a;dw.a = dw.b;dw.b = temp;System.out.println("swap方法里,a的值是" + dw.a + ";b的值是" + dw.b);}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方法里,a的值是9;b的值是6
交换结束后,a的值是9;b的值是6
从运行结果来看,在swap方法里面,a、b两个成员变量的值被交换成功。不仅如此,当swap方法执行结束之后,main方法里的a、b两个成员变量的值也被交换了。程序从main方法开始执行,mian方法里创建了一个DataWrap对象,并定义了一个引用变量dw来指向DataWrap对象。这是一个与基本类型不同的地方。创建一个对象时,系统内存中有两个东西:堆内存中保存了对象本身,栈内存中保存了引用该对象的引用变量。接着程序通过引用来操作DataWrap对象,并把对象的a、b成员变量分别赋值为6,9。此时系统内存中的存储示意图如下所示:
接下来,main方法中开始调用swap方法,main方法并未结束,系统会分别为mian方法和swap方法开辟出两个栈区,用于存放main和swap方法里的局部变量。调用swap方法时,dw变量作为实参传递如swap方法,同样是值传递,从而完成swap方法里的dw形参的初始化。值得指出的是,main方法中的dw是一个引用,它保存了DataWrap对象的地址值,当把dw的值
赋给swap方法的dw形参后,即让swap方法里的形参也保存这个地址值,即也会引用到堆内存中的DataWrap对象。如下图所示:
从上图可以看出,这种参数的传递方式是不折不扣的值传递方式,系统一样复制了dw的副本传入swap方法,但关键在于dw只是一个引用变量,所以系统复制了dw变量,但并未复制了DataWrap对象。
其实不管是操作main方法里的dw变量还是swap方法里的dw参数,其实都是操作他们的引用对象DataWrap,他们引用的是同一个对象。为了更好的证明main方法里的dw和swap方法中的dw是两个变量,在swap方法的最后一行增加如下代码:
dw = null;//把dw直接赋值为null,让它不再指向任何有效地址
再次运行以上代码,依然输出a=9,b=6.可见main方法中的dw变量没有受到任何影响。实际上,当swap方法中增加dw=null之后,内存中的示意图如下所示:
从上图可以看出,把swap方法中的dw赋值为null之后,swap方法。swap方法中失去了DataWrap对象的引用,不可再访问堆内存中的DataWrap对象。但mian方法中的dw不受任何影响
,依然引用DataWrap对象,所以可以输出DataWrap对象的a、b成员变量的值。
- 方法的参数传递机制
- 方法的参数传递机制
- 方法的参数传递机制
- 方法的参数传递机制——值传递机制
- Java方法参数的传递机制,值传递?引用传递?
- 5.2.2 方法的参数传递机制
- java中方法的参数传递机制
- 方法中参数传递的机制
- java中方法参数的传递机制
- Java方法的参数传递机制
- Java中方法的参数传递机制
- java中方法的参数传递机制
- java中方法的参数传递机制
- java中方法的参数传递机制
- java中方法的参数传递机制
- java中的方法参数的传递机制
- java方法的参数传递机制
- Java中方法的参数传递机制
- h5学习笔记(1)
- 第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
- 【Android】推荐一些学安卓经常浏览的网站
- Struts2中的ModelDriven机制及其运用
- 【LeetCode】292 Nim Games (java实现)
- 方法的参数传递机制
- 05_Java 网络编程
- 经典冒泡排序法
- CodeForces 601B Lipshitz Sequence (单调队列)
- 找第二大的数
- ubuntu kylin 15.10 防火墙 和 mysql不能远程访问的解决方法
- C/C++ 基础
- 第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件
- ISSC、红果蓝牙设备日志分析