Java 有引用传递吗

Questtion: 以下程序的输出结果是多少 ?


public static void test(int[] x){

x = new int[]{1,2,3};
 }

int[] out = new int[]{4,5,6};
test(out);
System.out.print(out[0]);
System.out.print(out[1]);
System.out.print(out[2]);


实验输出结果是:4 5 6

我们知道Java 中除了基本类型外,其余都是引用,数组也不例外。


为什么有很多人认为java有引用传递呢?一种情况是有人认为调用函数时其参数有可能是引用,所以java有引用传递,这部分人对引用传递根本没有正确的认识;而另一种情况看似有道理,但是仔细分析也是不正确的的,他们往往会用如下的代码来证明他们的观点:

示例一:

[java]  view plain copy
  1. class Demo{  
  2.      int a;  
  3.      public Demo(int a){  
  4.          this.a=a;  
  5.      }  
  6.  }  
  7.  public class TestQuote{  
  8.      public static void main(String args[]){  
  9.          Demo d1=new Demo(1);  
  10.          Demo d2=new Demo(2);  
  11.          System.out.println(d1.a);  
  12.          System.out.println(d2.a);  
  13.          function(d1,d2);  
  14.          System.out.println(d1.a);  
  15.          System.out.println(d2.a);  
  16.      }  
  17.      private static void function(Demo d1,Demo d2){  
  18.          int a;  
  19.          a=d1.a;  
  20.          d1.a=d2.a;  
  21.          d2.a=a;  
  22.      }  
  23.  }  
  

很容易理解,这个输出:2, 1   

继续看下面程序:


示例二:

[java]  view plain copy
  1. class Demo{  
  2.      int a;  
  3.      public Demo(int a){  
  4.          this.a=a;  
  5.      }  
  6.  }  
  7.  public class TestQuote{  
  8.      public static void main(String args[]){  
  9.          Demo d1=new Demo(1);  
  10.          Demo d2=new Demo(2);  
  11.          System.out.println(d1.a);  
  12.          System.out.println(d2.a);  
  13.          function(d1,d2);  
  14.          System.out.println(d1.a);  
  15.          System.out.println(d2.a);  
  16.      }  
  17.      private static void function(Demo d1,Demo d2){  
  18.          Demo temp;  
  19.          temp=d1;  
  20.          d1=d2;  
  21.          d2=temp;  
  22.      }  
  23.  }   

执行上面的代码,调用function()前后程序输出的都是12,此程序试图通过调用function()交换d1d2,但是没有成功,为什么呢?因为d1d2是值传递,function()中的d1d2main()函数中d1d2的副本,调用完function()不会对main()中的变量产生影响。再看示例一中,function()函数内改变的并不是d1d2本身的值,而是d1d2指向的对象的值,调用完function()d1d2仍然指向函数调用前的堆地址,即函数参数是栈中的d1d2,而不是堆中d1d2指向的对象,即使你在函数中改变了堆中的对象,但没有改变函数参数的值。所以示例一并不是什么引用传递;可见java中只有值传递。


补充:

 public static void test(int[] x) {
for (int i=0; i<x.length; i++) {
x[i] += 1;
}

}

int[] out = new int[]{4,5,6};
test(out);
System.out.print(out[0]);
System.out.print(out[1]);
System.out.print(out[2]);

结果不言而喻:5 6 7


总结:不要纠结那么多引用还是传值,传过去的肯定是一个值(值传递),即使是引用(比如数组)也是个具体的栈内存中的值(指向堆内存中的对象),这个引用值通过参数传递到函数再返回,肯定不会变咯,但你可以改变其所指向的堆内存中的值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值