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. 栈空间的释放先进后出
堆空间的释放先进先出