应该说,楼主一开始的结论就是错误的。
可以把引用类型看作一个C/C++中的指针,它指向的是一个Java对象的内存地址。
但是当函数调用时,JVM会生成第二个引用,并将原始引用的值(对象的内存地址)copy给第二个引用。
函数内部使用的是第二个引用的值,改变的也是第二个引用的值,而原始引用的值一直没有改变。记住,Java函数中参数的传递方式只有一种:值传递。

解决方案 »

  1.   

    对象的产生。String str = null ;
    对象的声明。
    new String("str") ;  对象的产生-->heap
    str = new String("str") ; 引用指向了对象.
      

  2.   


    恩?
    我怎么记得Java分值传递和地址传递两种的?
      

  3.   

    转:
    在传基本数据类型 变量时,直接传值不会让人费解;但当传递对象时,就应该理解为传递的是对象引用的值,但这个值并不是对象本身,而是指向该对象,即你让另一个引用指向了该对象。
      --Java以By Value的方式传递Object reference。
      以下面简单程序为例:
      package test;
      public class BlogTest
      {
       public void modifyAAA(int x, java.util.ArrayList list)
       {
       x += 5;
       System.out.println("x=====" + x);
       list.add(new java.util.Date());
       System.out.println(list.size());
       }
       public static void main(String[] args)
       {
       BlogTest blogtest = new BlogTest();
       int i = 5;
       java.util.ArrayList list = new java.util.ArrayList();
       System.out.println("i=======" + i);
       System.out.println("list.size()==="+list.size());
       blogtest.modifyAAA(i, list);
       System.out.println("i==new==" + i);
       System.out.println("list.size()====" + list.size());
       }
      }
      /*
      运行得到的结果是这样的
      i=======5
      list.size()===0
      x=====10
      1
      i==new==5
      list.size()==new==1
      */
      这说明在参数传递过程中发生了以下事情:int 变量 i 被复制了一份给 int x,在modifyAAA()方法中改变了x的值并不会影响主函数中i的值,当然,这是变量生存区间不同,很好理解。但发现list对象的引用传到modifyAAA()方法的前后,主函数中的list也跟着发生了变化。这正说了在传递对象引用时,形参得到了实参对象的引用拷贝,两个引用都指向了同一list对象,所以形参改变了list同时也能反映到实参中来。
      

  4.   

    JAVA没有地址传递,不过JAVA中的 参数为一个引用的时候,传过去的引用的值其实就是对象的地址。
      

  5.   

    本帖最后由 AWUSOFT 于 2010-01-19 09:32:42 编辑