一个奇怪的问题。看一个小程序。

superzrb 2003-05-27 11:09:06
import java.util.*;

class Groundhog {
int ghNumber;
int aa;
Groundhog(int n) { ghNumber = n; }
}

public class a {
public static void main(String[] args) {

for(int i = 0; i < 10; i++)
System.out.println("aa=" + new Groundhog(i));
}
} ///:~

为什么每次运行之后打印都是相同的地址,即本次和下一次的十个地址都相同。
请大家来解释一下java虚拟机的内存分配机制。
...全文
29 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
superzrb 2003-05-31
  • 打赏
  • 举报
回复
我是从Object中直接继承的,打印出来的就是地址啊。hashCode在Object中默认是地址(转成十六进制)。

在市面上讲解java虚拟机内部机制的书好象很少啊,大部分将的都是架构比如j2ee方面的书。
疾风2002 2003-05-31
  • 打赏
  • 举报
回复
明白了:Integer.toHexString(hashCode())
我们都被打印的十六进制数蒙蔽了,其实打印的是hashCode,
Object类hashCode值的设置是一个本地方法:public native int hashCode();
不能肯定一定就是对象的地址.
不过,测试似乎和类静态方法的长度(类的大小)还是有一点关系
有意思的是,加入
HashMap[][] hm = new HashMap[1][10]; (1)
会得到不同的值
而加入HashMap hm = new HashMap();输出却不会有任何改变.
并且你会发现加入(1)打印的值还是有部分和原来一样,
只是起始位置变化了.
zhjjava 2003-05-31
  • 打赏
  • 举报
回复
我明白你的意思了!
在类库中的那些类,我们在输出他们实例时,会自动调用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
我研究一下!
superzrb 2003-05-30
  • 打赏
  • 举报
回复
感谢大家来参与这个话题。
这句"aa=" + new Groundhog(i)我是为了将新的Groundhog对象的地址给打印出来。

而且大家有没有试过,当你改动了Groundhog,比如:在Groundhog里多增加一些成员,打印出来的结果仍然和变动以前的结果是一样的。而且我也试过了在系统繁忙的时候(比如不断的产生新的对象而不回收)运行这个程序,打印的结果仍然一样。

这就是我疑问的根源。为什么他们为一样?java的虚拟机不是回收内存不是不定期的吗?
stillfire 2003-05-29
  • 打赏
  • 举报
回复
自动调用 gc吗?
seven1996 2003-05-28
  • 打赏
  • 举报
回复
楼主,我觉得你出来的打印结果是一样的
这很正常。
class Groundhog 的构造函数没有返回值
换句话说对于new Groundhog(i),这样的话你的Groundhog 的对象实例的值是多少?
而且你的class Groundhog ,没有类似toString这样的函数。
请问楼主
执行这句"aa=" + new Groundhog(i)
应该是什么期望值?
antpower 2003-05-28
  • 打赏
  • 举报
回复
每次循环结束,分配的对象就消失掉,由于java虚拟机分配内存总是从开始往后分配,
所以,每次分配的开始地址一样。
prokingvov 2003-05-28
  • 打赏
  • 举报
回复
我不是很明白这各问题,个人认为 即本次和下一次的十个地址都相同 是因为 n 是一个临时变量
所以 地址都相同
我也是个 大菜鸟 呵呵 !!!!!
疾风2002 2003-05-28
  • 打赏
  • 举报
回复
哐当 ,看错题了!
疾风2002 2003-05-28
  • 打赏
  • 举报
回复
由于new Groundhog(i)后,这个新对像没有任何地方引用它,所以内存将被虚拟机回收
在循环中调用了打印到终端语句,使得cpu得以空闲从而被启动了java的内存回收.Groundhog对象被释放,在下一个new Groundhog(i)中,这块内存又被重新分配.

每次执行的结构应该不会完全一样.如当你运行了其它大型程序,打印的值会多一些不同的.结果和系统是否繁忙有关.
icewolf_li 2003-05-28
  • 打赏
  • 举报
回复
搂主的意思是说运行两次程序,打印出来的两次数据是一模一样的,而不是说10次println出来的东西是一模一样的。
这没什么好奇怪的。java vm的内存分配机制谈不上什么高深的地方。你的程序每次启动一个java vm,然后依次创建十个对象;java vm自然会把开头的一段内存分配给这些对象,所以每次打印出来的地址都是一样的。
zh_baiyu 2003-05-28
  • 打赏
  • 举报
回复
看了半天没看出什么问题。。。
呵呵,还真不知道问题出在哪里。
BrainA 2003-05-28
  • 打赏
  • 举报
回复
你这段程序是没有问题的,肯定是创建10个新的实例。

除非你把new Groundhog(i)放到for循环外面。
stillfire 2003-05-27
  • 打赏
  • 举报
回复
我得没有重复

你在试试

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧