永发信息网

java内存分配的问题,首先,问题有3个看清楚再回答

答案:4  悬赏:70  手机版
解决时间 2021-03-29 08:01
  • 提问者网友:wodetian
  • 2021-03-28 09:27
java内存分配的问题,首先,问题有3个看清楚再回答
最佳答案
  • 五星知识达人网友:行路难
  • 2021-03-28 10:45
没有区别。Aliase是一个对象,println输出如果是一个对象默认调用该对象的toString()方法。如果一个自定义对象没有覆盖toString()方法,则输出该对象的内存地址。
内存地址的分配是由jvm来决定,每次可能会不一样。
使用循环创建了(new)10个对象在内存中,该10个对象的内存地址肯定不同。因为循环体的作用域还没有结束,垃圾回收器还没有开始执行回收动作。

全部回答
  • 1楼网友:不甚了了
  • 2021-03-28 14:52

1、输出B和B.toString()没有区别的,pint(B)的时候,JAVA平台会默认的调用B的toString()方法的,所以如果写一个类,养成override其toString()方法是一个好习惯。
2、print(B)的时候,打印的并不是地址。JAVA里面所有的类都继承自Object类,而Object类的toString方法是返回该对象所属类+@+该对象哈希值。如果你的类里面没有override toString()方法的话,那么就调用的是父类(即Object类)的toString()方法。
3、JAVA有个垃圾回收机制,你创建对象B,打印完成后程序就执行完了,但是此对象并没有销毁,只是对象没有了引用,至于此对象何时销毁也是JAVA自己有个机制实现的,当你下次新建一个对象的时候,还有可能会拿到这个对象。所以造成B打印的HASH值与上一次一样的情况。
你这个循环创建10个对象的情况又不一样了,第二次new的时候,第一次new的对象还没有放弃引用,所以只能创建一个新的对象,依此类推,所以创建了十个新的对象。你如果说这个程序执行第二次,你会发现第二次也会“捡回”第一次创建的对象的。


顺便吐槽一下,,你的对象名最好用小写开头,比如:Aliase b = new Aliase();
  • 2楼网友:刀戟声无边
  • 2021-03-28 13:45
输出B-->B在内存中是以地址的方式存在的
输出B.toStirng()-->是调用B对象的toString()方法,输出什么就看你方法里怎么写的
运行一次程序,会分配一次内存空间给B,程序结束,Java的GC会不定时的清理无效内存,
所以有时候,可能分配同样的地址,有时候,没清理内存,就分配了一个新的地址。
你用while()循环,你的程序一直在运行,java虚拟机分配了一段地址空间,每次new一个C,分配一个地址,你使用完C队形,没有释放,所以地址不一样
  • 3楼网友:几近狂妄
  • 2021-03-28 12:17
B和B.toString()是否有区别
就看Aliase类中 是否重写的toString()方法,如果重写了 则按照重写的定义输出
否则,则按照从Object继承来的toString()方法,来输出对象的地址
至于为什么B的地址会变,因为你每次运行程序,java虚拟机要重新 为你定义的变量在内存中
开辟存储空间
至于你的最后一个问题
因为每次new 一个Aliase对象,就要在内存找空闲空间,开辟新的空间来保存这个对象,地址必然会变
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯