我们现在知道当在方法中传递一个primitive,那么在方法中改变该变量,和原成员变量无关看下面的例子public class C{ public static void main(String[] args){ int var = 3;
System.out.println("before method(),var is " + var); method(var); System.out.println("after method(),var is " + var); }
static void method(int arg){ System.out.println("top of method(),arg is "+ arg); arg = 0; System.out.println("bottom of mehtod(),arg is "+arg); }}由于传递的参数是primitive type,method方法并不改变原来var的值,那么程序运行的结果就是:before method(),var is 3top of method(),arg is 3bottom of mehtod(),arg is 0after method(),var is 3
当方法中传递的是reference type,情况就会不一样了,下面看一个例子:class Var{ int value = 3; public String toString(){ Integer i = new Integer(value); return i.toString(); }}
public class ChangeVar{ public static void main(String[] args){ Var v = new Var();
System.out.println("befor method(),v is "+v); method(v); System.out.println("after method(),v is "+v); } static void method(Var arg){ System.out.println("top of method,arg is "+arg); arg.value = 0; System.out.println("middle of method,arg is "+arg); arg = null; System.out.println("top of method,arg is "+arg); }}那么现在程序运行的结果会怎么样呢,现在分析一下,现在传递的是一个reference type,那么情况就会和传递的是primitive type的情况有些不一样了,我们知道,reference type在stack区放置的是字面值,实际内容存储在heap区。所以,当参数传递到方法method中的时候,方法其实得到的也是在stack区的v的一个副本arg,只是该副本arg所指向的内容也是heap区的同一个内容,并没有复制heap区的实例,所以,在改变arg的value的值的时候,由于v所指向的同一个内容,所以,v的值也就发生改变了,第二个,当arg赋值为null,说明arg现在为空了,不指向任何一个实例,这里的情况是什么呢,heap区的实例还存在,原来是由reference v和reference arg所指向的,现在,只有v指向了,结果就是arg为null了,而v的内容还是0,所以运行的结果就是:befor method(),v is 3top of method,arg is 3middle of method,arg is 0top of method,arg is nullafter method(),v is 0
如果变量定义在方法内部,那么再传递参数的结果会怎么样呢?
public class DataPassing{ public static void main(String[] args){ DataPassing b = new DataPassing(); b.test(); } void test(){ int[] arr = {10,13,24}; for(int i = 0;i<arr.length;i++) System.out.println("before: a" +i+ "=" + arr[i]); calc(arr); for(int i = 0;i<arr.length;i++) System.out.println("after: a" +i+ "=" + arr[i]); } void calc(int[] arr){ arr[0] *= 2; arr[1] *= 3; arr[2] *= 4; }}
如果把传递的参数该成primitive type,结果又会是怎么样呢?
运行结果发现,结果和前面是一样的。