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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李会成 中级黑马   /  2013-2-15 15:22  /  1266 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李会成 于 2013-2-18 11:27 编辑

创建对象并对构造函数初始化时,构造函数是在方法区中还是在栈内存中。还有对象是不是只能在堆内存中。如String s = new("abc");大家都知道这语句执行完之后有两个对象。看见有的人说s是在栈内存中对象。
希望有大侠懂内存帮忙指导。

3 个回复

倒序浏览
方法区,顾名思义,是存放方法的地方,也就是你的那些方法代码是存放在这里的,包括构造函数。对于栈内存,一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。对于堆内存,是存放由new创建的对象和数组(数组特殊点,你可以查查有关数组存放位置的资料)。
这句String s = new("abc");中,s是存在与栈内存中的,而new出的"abc"在字符串池中有一个"abc"对象,在堆内存中有一个"abc"对象,具体为什么请看下面的文章。我把我画的图也放在下面,你可以看看,我的理解,不一定对,你以后慢慢对内存这多了解了解就明白了。
文章地址:http://blog.csdn.net/shengfeixiang/article/details/8572749



String赋值图.PNG (36.52 KB, 下载次数: 27)

String赋值图.PNG

评分

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

查看全部评分

回复 使用道具 举报
构造函数和其它函数一样存在于方法区中,不同的是,其它方法被调用是在栈内存中开辟空间,而访问构造函数创建对象则是直接在堆内中存中开辟空间,String s = new ("abc");这其中有两个对象,每个字符串都是String类的一个实例对象。Sting类在内存中有个常量池,也就是个数组。"abc"作为一个实例对象就是存在于这个常量池中,而new ("abc")这个对象则是存在于堆内存中,因为通过new建立的实例都存放在堆内存中。s是存在于栈内存中的类类型变量。
回复 使用道具 举报
请勿复制他人帖子,技术分不是入学的门槛而是为了帮助大家学习而存在的。

请勿再次发此类帖子了!

此贴就关闭了。此后如有再次发现直接封禁处理,请看到此贴的会员也加以注意。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马