你这段程序是没有问题的,肯定是创建10个新的实例。除非你把new Groundhog(i)放到for循环外面。

解决方案 »

  1.   

    搂主的意思是说运行两次程序,打印出来的两次数据是一模一样的,而不是说10次println出来的东西是一模一样的。
    这没什么好奇怪的。java vm的内存分配机制谈不上什么高深的地方。你的程序每次启动一个java vm,然后依次创建十个对象;java vm自然会把开头的一段内存分配给这些对象,所以每次打印出来的地址都是一样的。
      

  2.   

    由于new Groundhog(i)后,这个新对像没有任何地方引用它,所以内存将被虚拟机回收
    在循环中调用了打印到终端语句,使得cpu得以空闲从而被启动了java的内存回收.Groundhog对象被释放,在下一个new Groundhog(i)中,这块内存又被重新分配.每次执行的结构应该不会完全一样.如当你运行了其它大型程序,打印的值会多一些不同的.结果和系统是否繁忙有关.
      

  3.   

    每次循环结束,分配的对象就消失掉,由于java虚拟机分配内存总是从开始往后分配,
    所以,每次分配的开始地址一样。
      

  4.   

    楼主,我觉得你出来的打印结果是一样的
    这很正常。
    class Groundhog 的构造函数没有返回值
    换句话说对于new Groundhog(i),这样的话你的Groundhog 的对象实例的值是多少?
    而且你的class Groundhog ,没有类似toString这样的函数。
    请问楼主
    执行这句"aa=" + new Groundhog(i)
    应该是什么期望值?
      

  5.   

    感谢大家来参与这个话题。
    这句"aa=" + new Groundhog(i)我是为了将新的Groundhog对象的地址给打印出来。而且大家有没有试过,当你改动了Groundhog,比如:在Groundhog里多增加一些成员,打印出来的结果仍然和变动以前的结果是一样的。而且我也试过了在系统繁忙的时候(比如不断的产生新的对象而不回收)运行这个程序,打印的结果仍然一样。这就是我疑问的根源。为什么他们为一样?java的虚拟机不是回收内存不是不定期的吗?
      

  6.   

    我明白你的意思了!
    在类库中的那些类,我们在输出他们实例时,会自动调用toString()!输出一个什么信息!
    可是你的这个自定义类没有这些,那他输出的是什么信息呢?
    D:\jdk1.3\bin>java a
    aa=Groundhog@256a7c
    aa=Groundhog@720eeb
    aa=Groundhog@3179c3
    aa=Groundhog@310d42
    aa=Groundhog@5d87b2
    aa=Groundhog@77d134
    aa=Groundhog@47e553
    aa=Groundhog@20c10f
    aa=Groundhog@62eec8
    aa=Groundhog@2a9835
    我研究一下!
      

  7.   

    明白了:Integer.toHexString(hashCode())
    我们都被打印的十六进制数蒙蔽了,其实打印的是hashCode,
    Object类hashCode值的设置是一个本地方法:public native int hashCode();
    不能肯定一定就是对象的地址.
    不过,测试似乎和类静态方法的长度(类的大小)还是有一点关系
    有意思的是,加入
    HashMap[][] hm = new HashMap[1][10];         (1)
    会得到不同的值
    而加入HashMap hm = new HashMap();输出却不会有任何改变.
    并且你会发现加入(1)打印的值还是有部分和原来一样,
    只是起始位置变化了.
      

  8.   

    我是从Object中直接继承的,打印出来的就是地址啊。hashCode在Object中默认是地址(转成十六进制)。在市面上讲解java虚拟机内部机制的书好象很少啊,大部分将的都是架构比如j2ee方面的书。