A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾宇 中级黑马   /  2014-6-6 16:23  /  4726 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曾宇 于 2014-6-7 18:31 编辑

class test{}

main{
    test t = new test();
}

1问:
开辟了栈内存空间,有一个变量t,存放堆内存地址new test();
这样理解是否正确?
2问:
如果直接使用new test();
是否表示只开辟了堆内存空间,而没有栈内存空间,由于没有引用,所以堆内存会被java垃圾回收机制回收。
但是,new test();毕竟开辟了堆地址,
那么是否可以使用new test().函数()。或者new test().成员变量?
3问:
如果class test{}类中没有任何方法,new test();是否还是会开辟内存空间。
是否是因为java自动加入的空构造函数,所以开辟空间。
如果使用test t = new test();
是否会造成无意义的占用内存空间?如果无限创建,是否会内存溢出?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览
基本上你说的都对,但是对于开发来说没必要纠结这个。内存的问题其实很复杂,远没有像视频中说的那么简单,视频中只是说明了一个大框。如果你实在纠结推荐你一本书《深入理解java虚拟机》,但是理解起来真的不容易。
回复 使用道具 举报 1 0
你的第1个问题如你所说的那样。
第2个问题是匿名对象的使用,你可以去看看。
第3个问题,class tet{}; 中肯定包含一个空的构造方法,以及其从Object类中继承的所有东西。肯定会分配内存的。
如果你对new出来的东西一直没有释放掉对它的引用的话,java的垃圾收集机制肯定是无法对其进行回收的,当你创建的对象足够多时,肯定会内存溢出。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报 2 0
Wokno 发表于 2014-6-6 18:42
你的第1个问题如你所说的那样。
第2个问题是匿名对象的使用,你可以去看看。
第3个问题,class tet{}; 中肯 ...

谢谢你的解答,理解更深刻了。扫清了我的疑惑。
回复 使用道具 举报
Wokno 发表于 2014-6-6 18:42
你的第1个问题如你所说的那样。
第2个问题是匿名对象的使用,你可以去看看。
第3个问题,class tet{}; 中肯 ...

解释的非常清楚
回复 使用道具 举报
楼主研究的很深。。。
回复 使用道具 举报
现在终于理解了
回复 使用道具 举报
Wokno 发表于 2014-6-6 18:42
你的第1个问题如你所说的那样。
第2个问题是匿名对象的使用,你可以去看看。
第3个问题,class tet{}; 中肯 ...

首先感谢wokno的解答  想知道引用什么时候算是释放掉了?是在当前线程执行完毕算是释放掉呢?还是可以手动释放?还是其他的什么情况?
回复 使用道具 举报
正在消化中   
回复 使用道具 举报
谢谢楼主
回复 使用道具 举报
又学习了一遍
回复 使用道具 举报
楼主和学友的解释让我对内存有了更清晰的认识,毕竟内存很复杂,还需要再研究
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马