理解方法的值的传递的流程:
package com; class value { int i = 15; } public class pass { public static void main(String[] args) { pass p=new pass(); p.first(); } public void first() { int i = 5; value v1 = new value(); v1.i = 25; second(v1, i); System.out.println(v1.i); } public void second(value v2, int i) { i = 0; v2.i = 20; value val = new value(); v2 = val; System.out.println(v2.i + " " + i); } }
这里,当first方法调用second方法时,将v1的value方法的地址传递给了v2,而v2改变了v1所在的那个value方法的值,变成了20
当val重新调用的value的地址,value里面的数值还原,即int=15,然后将val调用的value的新的地址赋给了v2,所以值也就是15,(v2当改变完了v1所在的value堆空间的数值之后,就改变了指向的地址,变成了val的地址)
而这里面的int是存在于栈空间的,不是在value方法的堆空间里,所以调用了value对于i没有声明影响。
输出之后,释放了second所存的数值,但是v1所在的value方法的数值没有释放,所以输出的v1是v2所改变后的数值,即为20