黑马程序员技术交流社区

标题: 两个内存的问题:构造函数和对象 [打印本页]

作者: zhaishuang    时间: 2012-4-18 23:18
标题: 两个内存的问题:构造函数和对象
创建对象并对构造函数初始化时,构造函数是在方法区中还是在栈内存中。还有对象是不是只能在堆内存中。如String s = new("abc");大家都知道这语句执行完之后有两个对象。看见有的人说s是在栈内存中对象。
希望有大侠懂内存帮忙指导。
作者: liuyang    时间: 2012-4-18 23:26
Person p = new Person("zhangsan",20);
该句话做了如下事件:
1.因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中
2.执行该类中的static代码块,如果有的话。给Person.class类进行初始化
3.在堆内存中开辟空间,分配内存地址
4.在堆内存中建立对象的特有属性,并进行默认初始化
5.对属性进行显示初始化
6.对对象进行构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址付给栈内存中的p变量。
作者: zhaishuang    时间: 2012-4-18 23:32
liuyang 发表于 2012-4-18 23:26
Person p = new Person("zhangsan",20);
该句话做了如下事件:
1.因为new用到了Person.class,所以会先找到 ...

您说的这个我了解的,就是比较糊涂方法区。。。谢谢你的回答
作者: 黄或俊    时间: 2012-4-19 00:25
个人理解是构造函数是放在栈内存中的;
Person p = new Person(2);先在栈内存中划分一块内存给p这个局部变量,然后如果构造函数有参数的话会在栈内存中分配参数变量,最后在堆内存中分配一块空间,里面包含这几个变量,由栈中的参数把变量传递过来,然后参数变量占用的内存就消失了。即当一个方法调用完成后,栈里面为他分配的空间全部消失。

作者: 邓斌    时间: 2012-4-19 01:03
创建对象并对构造函数初始化时,构造函数是在方法区中还是在栈内存中。还有对象是不是只能在堆内存中。如String s = new("abc");大家都知道这语句执行完之后有两个对象。看见有的人说s是在栈内存中对象。

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

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



作者: 张超超    时间: 2012-4-19 09:58
如果是String s = "abc"
先看常量池中有没有"abc"    再创建  将常量放入常量池

而String s=new String("abc");
创建的字符串不是常量   所以是直接放在在堆中
new String("abc");是在运行期  new出来的   存放在堆中,可以有多份,所以我想没必要查看常量池吧      




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2