楼主,我觉得你出来的打印结果是一样的 这很正常。 class Groundhog 的构造函数没有返回值 换句话说对于new Groundhog(i),这样的话你的Groundhog 的对象实例的值是多少? 而且你的class Groundhog ,没有类似toString这样的函数。 请问楼主 执行这句"aa=" + new Groundhog(i) 应该是什么期望值?
感谢大家来参与这个话题。 这句"aa=" + new Groundhog(i)我是为了将新的Groundhog对象的地址给打印出来。而且大家有没有试过,当你改动了Groundhog,比如:在Groundhog里多增加一些成员,打印出来的结果仍然和变动以前的结果是一样的。而且我也试过了在系统繁忙的时候(比如不断的产生新的对象而不回收)运行这个程序,打印的结果仍然一样。这就是我疑问的根源。为什么他们为一样?java的虚拟机不是回收内存不是不定期的吗?
这没什么好奇怪的。java vm的内存分配机制谈不上什么高深的地方。你的程序每次启动一个java vm,然后依次创建十个对象;java vm自然会把开头的一段内存分配给这些对象,所以每次打印出来的地址都是一样的。
在循环中调用了打印到终端语句,使得cpu得以空闲从而被启动了java的内存回收.Groundhog对象被释放,在下一个new Groundhog(i)中,这块内存又被重新分配.每次执行的结构应该不会完全一样.如当你运行了其它大型程序,打印的值会多一些不同的.结果和系统是否繁忙有关.
所以,每次分配的开始地址一样。
这很正常。
class Groundhog 的构造函数没有返回值
换句话说对于new Groundhog(i),这样的话你的Groundhog 的对象实例的值是多少?
而且你的class Groundhog ,没有类似toString这样的函数。
请问楼主
执行这句"aa=" + new Groundhog(i)
应该是什么期望值?
这句"aa=" + new Groundhog(i)我是为了将新的Groundhog对象的地址给打印出来。而且大家有没有试过,当你改动了Groundhog,比如:在Groundhog里多增加一些成员,打印出来的结果仍然和变动以前的结果是一样的。而且我也试过了在系统繁忙的时候(比如不断的产生新的对象而不回收)运行这个程序,打印的结果仍然一样。这就是我疑问的根源。为什么他们为一样?java的虚拟机不是回收内存不是不定期的吗?
在类库中的那些类,我们在输出他们实例时,会自动调用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
我研究一下!
我们都被打印的十六进制数蒙蔽了,其实打印的是hashCode,
Object类hashCode值的设置是一个本地方法:public native int hashCode();
不能肯定一定就是对象的地址.
不过,测试似乎和类静态方法的长度(类的大小)还是有一点关系
有意思的是,加入
HashMap[][] hm = new HashMap[1][10]; (1)
会得到不同的值
而加入HashMap hm = new HashMap();输出却不会有任何改变.
并且你会发现加入(1)打印的值还是有部分和原来一样,
只是起始位置变化了.