a = b执行后,a和b指向同一个对象,a原来所指向的对象并没有被立即删除,只有当垃圾回收器运行时,并且没有其他引用关联至该对象时才会被回收!
java中没有析构函数,也不用关心资源回收问题。

解决方案 »

  1.   

    。(core java中曾说过Format类的printf方法精确实现了c语言的printf函数,但在java1.5下查了文档没找到,用的时候也报错)。
    -------
    不会吧!我的怎么有?呵呵,难道我们的1.5不一样?
    这个方法是用来象C 里面的打印方法一样可以格式化输出,并不是打印对象的内存地址。
    目前我不知道怎么打印一个对象的内存地址。其实我的疑问是:在 a = b 时,a对象的地址是不是就变成 b对象的地址了呢?
    -------
    其实a和b都是对同一个对象的引用,即指向同一个内存地址。当赋值时,a=b,a就获得了b指向的对象的引用。而它们共同指向的对象就是new的时候生成的/
      

  2.   

    执行System.out.println(obj);时,如果obj所属类中为覆写toString()方法,那么它调用的就是Object类中的toString()方法中返回的是:getClass().getName() + "@" + Integer.toHexString(hashCode())而hashCode()未覆写时,就是对象的地址。
      

  3.   

    to (java欣人) 你的意思是说,在
    Test1 a = new Test1();
    Test1 b = new Test1();的时候,它们就指向了同一地址吗?to 孤独萤火虫,如果去掉 a = b; 打印它们,结果是:
                     Test1@757aef          Test1@d9f9c3
    也就是说a的地址是 757aef,而b的地址是 d9f9c3,是这样吗?
      

  4.   

    to (java欣人) 你的意思是说,在
    Test1 a = new Test1();
    Test1 b = new Test1();的时候,它们就指向了同一地址吗?
    -----------
    不,这里显然是定义了两个对象,a,b分别指向它们
    当a=b的时候,a指向了b之前指向的对象hashCode()不是获得对象内存地址的,如果是看过jdk源代码的就知道了,这个值是用一个普通的hash算法算出一个值
      

  5.   

    很少有听说java中有象c中的 栈区,堆区,全局区 什么的讨论。
    我不相信真的没有,是不是太简单了,不值得拿出来呢?
    因为我是从c转过来学习的,所以对这个比较关心。见笑了。
      

  6.   

    因为c是直接使用本机内存,而java是使用jvm的内存,也就是内存管理由jvm处理系统分配给java的特定内存区域。
    在java里面栈区,堆区,全局区的概念很模糊,因为首先没有全局变量的说法,所以就不用说全局区了。而大部分的内存分配都是使用栈内存
      

  7.   

    hashCode()不是获得对象内存地址的,如果是看过jdk源代码的就知道了,这个值是用一个普通的hash算法算出一个值
    哦?我一直以为就是对象的内存地址,给详细解释一下看看。
      

  8.   

    new一个对象的时候,对象产生在堆中,而基本型别都是直接存在栈中。
      

  9.   

    java欣人,你所说的 引用 跟 C++中的引用 的概念相同吗?
      

  10.   

    JAVA中操纵对象都是通过引用来进行的,比如你的代码中a和b不是对象,而是对象的引用
      

  11.   

    抱歉,刚才又仔细查看了代码,发现HashTable是用hash算法实现hash值,而HashCode()方法确实获得的是内存地址(以前我一直认为不是),感谢fireflyqt(孤独萤火虫)的指点。内存地址的问题,刚才也查了资料。从数据类型来看基本数据类型(int,boolean,char等)都是分配在栈里面,而new一个对象的时候是在堆里面获得内存。从另一个方面来看,final,static值都是在堆中分配内存,一般无修饰的基本数据类型变量则在栈分配,对象都是引用。java里面的引用其实是和C++里面的指针是一个概念,都是对内存地址的引用。C++已经好久不用了,对引用的概念已经记得不是很清楚了!再次谢谢fireflyqt(孤独萤火虫)
      

  12.   

    我个人认为是类似的,java中的引用是指向内存中对象的一个地址,C++中表面上看是一个变量或实参的别名,但实际上它就是对地址进行操作(对它赋值后,变量或实参的值就跟着改变)
      

  13.   

    由此看来java中的对象更象c++中的指针,因为c++中的引用一经初始化就不能再指向其他地址了。
    用来传递参数。比如:
    int a;
    int *p1 = a;
    int &p2 = a;
    那么p2 就相当于 const p1。不知,我理解的可对?
      

  14.   

    不是。
    比如Test1 a=new Test1();
    此时new Test1();创建在堆里面,相当于一个常量,a引用了它的地址
    但是如果有a=b,则a引用的对象就变了,就是原来b引用的对象了。
      

  15.   

    非常感谢各位参与讨论,经过测试,我将 a.i = 11; 结果 b.i 也变成了11。
    那么变量a 实质上就是个指针,当 a=b 时,如果改变a ,则变量b跟着改变。还有补充吗?
      

  16.   

    根据c的直觉,a,b 应该是存放在 栈区, 而a,b 指向的对象应该是存放在 堆区。
    你认为呢?
      

  17.   

    java中打印一个对象地址的方法是:
    System.identifyHashCode(Object a);
    这里对象a并不用RTTI进行解析的!
      

  18.   


    但对两个引用执行a = b操作时,内存中两个对象的地址没有任何变化只是引用a指向了引用b指向的对象
      

  19.   

    System.identityHashCode(Object a);
    不是
    System.identifyHashCode(Object a);可是这个能输出什么?什么都没有输出啊 你确信是打印地址的方法?
      

  20.   

    输出的是不重写hashCode之前的hashCode,也就是虚拟机地址。
    在IdentityHashMap里面就是这样获得hashCode
      

  21.   

    呵呵,我的意思是
    你可以这样输出:System.out.println(System.identifyHashCode(a))
      

  22.   

    其实直接用 a.hashCode() 就可打印出来了呵。