java是值传递,还是引用传递?

原文地址:http://blog.csdn.net/zxmzfbdc/article/details/5401960

   java到底是值传递,还是引用传递?以前国内的java开发者有过很多争论,由于《Practical java》等书籍的引入,现在大家都知道java是严格的值传递,基本数据类型不会有什么问题,但是针对对象和数组,执行的结果,似乎应该是引用传递。

   在《Practical java》中,给出了说明,针对对象和数组,事实上,传递的内容,是引用的值,而不是引用本身。但是怎么验证,网上没有例子,书上也没有给,现在给出一个 例子,可以很好的说明,java确实是值传递。例子如下:

  1. public class Test{  
  2.     public void c(Model m1, Model m2){  
  3.         Model m = m1;  
  4.         m1 = m2;  
  5.         m2 = m;  
  6.     }  
  7.     public void cd(int[] a, int[] b){  
  8.         int[] c = a;  
  9.         a = b;  
  10.         b =c;  
  11.     }  
  12.     public static void main(String[] args){  
  13.         Model m1 = new Model();  
  14.         m1.setName("m1");  
  15.         Model m2 = new Model();  
  16.         m2.setName("m2");  
  17.         Test app = new Test();  
  18.         app.c(m1, m2);  
  19.         System.out.println(m1.getName()+"---" + m2.getName());  
  20.         int[] a = new int[]{1};  
  21.         int[] b = new int[]{2};  
  22.         app.cd(a, b);  
  23.         System.out.println(a[0] + "----" + b[0]);  
  24.     }  
  25. }  
  26. class Model{  
  27.     private String name;  
  28.     public void setName(String name){  
  29.         this.name = name;  
  30.     }  
  31.     public String getName(){  
  32.         return name;  
  33.     }  
  34. }  

 

  打印的结果是

 
  1. D:/ > java Test  
  2. m1---m2  
  3. 1----2  
 

   这是因为,m1和m2本身是对象的引用没错,但是传入方法c的参数,实际上是m1和m2的副本,因此只是两个副本进行了交换,而m1和m2本身并没有被交 换。交换数组的方法cd,原理与之相同。

posted @ 2013-07-30 10:57  歌颂者  阅读(295)  评论(0编辑  收藏  举报