我们现在知道当在方法中传递一个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 3
top of method(),arg is 3
bottom of mehtod(),arg is 0
after 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 3
top of method,arg is 3
middle of method,arg is 0
top of method,arg is null
after 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,结果又会是怎么样呢?
运行结果发现,结果和前面是一样的。