补疑(Java的参数传递)

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值