龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

java中传值及引伸深度克隆的思考[组图]

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
大家都知道Java中没有指针。难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! !-- frame contents -- !-- /frame contents -- java中内存的分配方式有两种,一种

      大家都知道Java中没有指针。难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象!

<!-- frame contents -->
<!-- /frame contents -->

      java中内存的分配方式有两种,一种是在堆中分配,一种是在堆栈中分配,所有new出来的对象都是在堆中分配的,函数中参数的传递是在栈中分配的。通常情况下堆的内存可以很大,比如32位操作系统中的虚拟内存都可以被堆所使用(当内存紧张的时候甚至硬盘都可以是堆的存储空间),而堆栈的内存分配是有限的。
  
      这和c++中内存分配差不多(c++中还要有另一种方式用于全局变量或者局部静态变量的内存分配,这里就不说了)。java中有几种基本类型如int,float,double,char,byte等,他们不是对象,除此之外一切都是对象,所有的对象都是在堆上分配的。
  
      java中对象数组是什么,和c++类似,是句柄数组或者叫指针数组,里面保存的是每个元素的地址。和c++中不同,java没有操作符重载和拷贝构造函数(假如不了解这些也没有关系),因此当创建对象或者对已经创建的对象赋值时(注重是对象,不是基本类型):Object a=new Object 和Object a=b(b是Object的子类型或者同类型)时,进行的是对象地址的传递并复制。这就是所说的句柄的传递和赋值。
  
      句柄里存储的就是对象的地址,句柄就是指针,只不过是你无法得到的地址,java就是通过这一点巧妙的将指针隐藏起来。当对象作为参数传递到方法中时,传递的就是对象的地址,而行参中保存的是实参地址的副本(这就是最要害的地方,也是值传递,值传递就是将实参的值的副本作为行参)

  

      如:

  
  

  public class Example{
    int i=0;
  }
  public class A{
    public int i=0;
    public Example add0(Example e)
    {
       e.i++;
       return e;
     }
    
     public void add1(Example e)
     {
        e.i++;
     }

     public void modify0(Example e)
     {
        Example b=e;//将e行参对象的地址赋给句柄b
        b.i++;//也同时修改了e.i和实参的值
     }
    
     public void modify1(Example e)
     {
       e=new Example();
       e.i++;
     }
     public static void main(String[] args)
    {
       Example ex=new Example();
       A a=new A();
       a=a.add0(ex);//等价于a.add0(ex),无需返回值,因为通过传递的对象地址(句柄),直接修改了ex中i的值
       a.add1(ex);//add0,add1都在其中的方法体中直接修改了ex.i的值,因此add0的返回值有点多余
       a.modify0(ex);//对ex所产生的影响同add1
       a.modify1(ex);//对ex没有产生任何影响(而且这就是等价于什么也没有做).


  

  

          这可能会让一部分人搞不清了。 <!-- frame contents -->

<!-- /frame contents --> 为什么呢?因为是对象地址的副本"值传递",在modify1中e=new Example();实际上e仅仅是保存ex对象地址的副本的一个句柄,当对e赋值时仅仅是对堆栈中e的赋值(对ex指针副本的变量e赋值),而并没有改变ex的句柄的指向,当方法调用完毕堆栈弹出,e就将要被垃圾回收,没有任何用处。当然你可以将它作为返回值,这就是另外一回事了。
  
  
精彩图集

赞助商链接