Java 参数的传递过程图解

首先看下面一段代码:

 1 /*
 2  * 参数的传递
 3  */
 4 class Value{
 5     int i = 15;
 6 }
 7 public class Test {
 8     public static void main(String[] args) {
 9         Test t = new Test();
10         t.first();
11     }
12     public void first(){
13         int i=5;
14         Value v = new Value();
15         v.i = 25;
16         second(v,i);
17         System.out.println(v.i);
18     }
19     public void second(Value v,int i){
20         i = 0;
21         v.i = 20;
22         Value val = new Value();
23         v = val;
24         System.out.println(v.i + " " + i);
25     }
26 }

这段代码的输出结果是: 15  0  20

接下来我们具体分析下参数是怎么传递的:

1. 从main方法开始,即上面代码的第八行开始执行程序,执行到第九行结束时,内存中的状态如下:

栈中创建了一个局部变量t,堆中new出来了一块空间,并且把该地址传 “0x1122” 给了t 。

 

2. 第十行开始跳转到first() 方法中,十三行代码执行完,内存中的状态:

在栈空间中创建了局部变量 i 并且赋值 5;

 

3.十四行代码执行完,内存中的状态

栈空间中创建了对象v,堆空间中new出来了一块Value()的空间,并且把地址“0x3344”传给了v;

 

4.十五行代码执行完,内存中的状态:

通过v.i ,修改了空间地址为0x3344中的i值

 

5.十六行代码执行完,进入second()方法体中,内存中的状态:

创建对象v,并且赋的初始值是first()方法中的v传递过来的,所以second()方法中的v地址也指向0x3344

创建变量i,i的值是first()方法中i传递过来的为5

 

6.二十行代码执行完,内存中的状态:

把second()方法中的i值修改为0

7.二十一行代码执行完,内存中的状态:

修改地址为0x3344中的i的值为20

8. 二十二行代码执行完,内存中的状态:

创建对象val,堆中new出来一块地址为0x5566的新空间,并且把地址传给val

 

9.二十三行代码执行完,内存中的状态:

把“val”指向的地址“0x5566”赋值给second()方法中的对象“v”,second()方法中的对象“v”不在指向地址“0x3344”

10. 栈空间的释放先进后出

     堆空间的释放先进先出

posted @ 2016-01-13 16:26  njuptlwh  阅读(344)  评论(0编辑  收藏  举报