抱歉,我不会画图,就拿老师的截图来给你讲一下吧。
首先主方法进栈,开辟两个空间,一个存 int a = 10;一个存 int b = 20;
输出 a = 10,b = 20。
接着调用 change(a,b)方法,change(a,b)方法进栈。它的实际参数就是刚才的 int a 和 int b。
在change方法中,b的值赋给了a,a就变成了20。接着把a+b的值赋给了b,b就变成了40,紧接着在change方法中输出 a = 20,b = 40.
然后change方法执行完毕,弹栈,就从栈内存中消失。
再接着主方法中输出a = 10,b = 20.这时请注意,a 和 b 是主方法的局部变量,在主方法中a 和 b 的值并没有发生改变,所以这时还是输出a = 10,b = 20.
然后在主方法中定义了一个数组 int[] arr,arr是在栈内存中的,但是数组是个引用类型变量,实体是存在堆内存中的。所以在堆内存中就开辟空间,存储数组arr的值,默认都是0.然后显示初始化为1,2,3,4,5。并把地制值赋给栈中的arr。
紧接着调用change(arr)方法,那么这个方法进栈。实际参数就是刚才的arr,也就是把arr的地制值直接传递了过来。这时候是关键,change(arr)也指向了堆内存中的数组实体。然后change(arr)方法把偶数元素变成原来的2倍,这时,数组中的内容就变成了1,4,3,8,5,然后输出arr[1],这时候就是4了。然后change(arr)方法弹栈。
最后得出的结论就是:
基本类型:形式参数的改变对实际参数没有影响.
引用类型:形式参数的改变直接影响实际参数.
过程有点复杂,希望我说的够明白。
|