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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhaishuang 中级黑马   /  2012-4-18 23:18  /  1740 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

5 个回复

倒序浏览
Person p = new Person("zhangsan",20);
该句话做了如下事件:
1.因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中
2.执行该类中的static代码块,如果有的话。给Person.class类进行初始化
3.在堆内存中开辟空间,分配内存地址
4.在堆内存中建立对象的特有属性,并进行默认初始化
5.对属性进行显示初始化
6.对对象进行构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址付给栈内存中的p变量。
回复 使用道具 举报
liuyang 发表于 2012-4-18 23:26
Person p = new Person("zhangsan",20);
该句话做了如下事件:
1.因为new用到了Person.class,所以会先找到 ...

您说的这个我了解的,就是比较糊涂方法区。。。谢谢你的回答
回复 使用道具 举报
个人理解是构造函数是放在栈内存中的;
Person p = new Person(2);先在栈内存中划分一块内存给p这个局部变量,然后如果构造函数有参数的话会在栈内存中分配参数变量,最后在堆内存中分配一块空间,里面包含这几个变量,由栈中的参数把变量传递过来,然后参数变量占用的内存就消失了。即当一个方法调用完成后,栈里面为他分配的空间全部消失。
回复 使用道具 举报
创建对象并对构造函数初始化时,构造函数是在方法区中还是在栈内存中。还有对象是不是只能在堆内存中。如String s = new("abc");大家都知道这语句执行完之后有两个对象。看见有的人说s是在栈内存中对象。

个人不确定回答:
根据推测,如果存在于方法区中。就脱移于类了,那就可以直接调用。
对象创建,在堆内存,堆内存就存在对象,对象的方法。以及其他属性。构造函数也在其中。

String s = new("abc"); 创建有2个对象。。 s不能说是栈内存中对象。s是存在栈内存中。但他是个变量。类类型变量,只是把对象在堆内存的地址值赋给s了


评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
如果是String s = "abc"
先看常量池中有没有"abc"    再创建  将常量放入常量池

而String s=new String("abc");
创建的字符串不是常量   所以是直接放在在堆中
new String("abc");是在运行期  new出来的   存放在堆中,可以有多份,所以我想没必要查看常量池吧      
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马