补疑(Java的参数传递)

    技术2022-05-11  54

    我们现在知道当在方法中传递一个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,结果又会是怎么样呢?

    运行结果发现,结果和前面是一样的。


    最新回复(0)