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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Person p = new Person("zhangsan",20);
该句话都做了什么事情?
1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。
毕老师总结了八步,关于栈内存一句带过,不是很清楚。
问题:1、是不是在第3步堆内存开辟的时候,栈内存也开辟了空间存入p变量?栈内存什么时候开辟?
2、第3步分配内存地址是不是和第8步一个意思?把堆内存空间的地址分配给了栈内存中的p?
3、堆内存和栈内存开辟后是不是已经产生了联系?栈内存中的p指向堆内存中的空间?还是堆内存初始化完全后p再指向对象?

22 个回复

倒序浏览
大神快显灵!!
回复 使用道具 举报
厉害啊。学习下
回复 使用道具 举报
谈一下我的理解,、(错了别打我)
1,栈内存应在在第七步之后才开辟,一开辟就存入向堆内存中的首地址
2,不是一个意思,堆内存开辟空间一般是一片连续的地址,栈内存开辟空间只存连续地址的首地址,
3,堆内存和栈内存开辟后是不是已经产生了联系?在Person p = new Person("zhangsan",20);中应该是产生了联系
栈内存中的p指向堆内存中的空间?p中存的是堆内存开辟空间的首地址,引用型变量。
还是堆内存初始化完全后p再指向对象?是的
回复 使用道具 举报
guoyangpeng 来自手机 中级黑马 2015-5-17 08:20:59
报纸
学习了,说得好!
回复 使用道具 举报
枕寒流 发表于 2015-5-17 08:03
谈一下我的理解,、(错了别打我)
1,栈内存应在在第七步之后才开辟,一开辟就存入向堆内存中的首地址
2, ...

根据毕老师的这八个步骤分析,栈内存在第7步之后开辟最为合理,同时解决了我的3个问题。
回复 使用道具 举报
学习中
回复 使用道具 举报
立志转行 发表于 2015-5-17 09:17
根据毕老师的这八个步骤分析,栈内存在第7步之后开辟最为合理,同时解决了我的3个问题。 ...

到底是不是呢?求真相帝显灵!
回复 使用道具 举报
赞赞赞!!!!
回复 使用道具 举报
求解!表沉!
回复 使用道具 举报
观摩学习
回复 使用道具 举报
JVM规范中有这么一句话
Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread.
大意是每个JVM线程有一个私有的线程栈,随着线程的创建而创建。
栈保存的是栈帧,栈帧保存的是方法执行时的局部变量、操作数、返回值地址等信息。
所以栈随着对象创建而创建时不对的。
回复 使用道具 举报
LoseMyCat 发表于 2015-5-19 21:56
JVM规范中有这么一句话
Each Java Virtual Machine thread has a private Java Virtual Machine stack, cre ...

那栈在什么时候创建的呢?
回复 使用道具 举报
立志转行 发表于 2015-5-19 22:08
那栈在什么时候创建的呢?

举个简单的例子,你在调用main方法的时候系统肯定会给你创建一条线程来执行main方法里面的代码,那么这条线程创建的时候,也会创建栈。
回复 使用道具 举报
LoseMyCat 发表于 2015-5-19 22:09
举个简单的例子,你在调用main方法的时候系统肯定会给你创建一条线程来执行main方法里面的代码,那么这条 ...

不明觉厉的赶脚!还没学到线程,先记住了,到时候看。谢了!
回复 使用道具 举报
学习中。。。。。
回复 使用道具 举报
本帖最后由 tanzhixue 于 2015-5-19 22:37 编辑

首先是类先加载 然后main()进方法区 然后 Person P这里加载Person类在栈中存入Person p,然后new 是在堆中申请空间,new Person 这里先执行person的名字和年龄默认初始化然后再显示初始化然后是构造代码块的初始化然后是构造函数,都初始化完毕之后 把地址赋给p然后p指向它

1.栈在执行Peson p这里就开辟了
2.只是生成地址值 没初始化完毕 不会把地址赋给p  第8是初始化完毕之后赋予p然后让p指向它
3.初始化完毕之后 栈的p才指向堆中的成员变量和方法
回复 使用道具 举报
tanzhixue 发表于 2015-5-19 22:33
首先是类先加载 然后main()进方法区 然后 Person P这里加载Person类在栈中存入Person p,然后new 是在堆 ...

你的意思是第二步后开辟的栈内存存入p,在第8步p才指向对象,理解的对吧?
回复 使用道具 举报
D:\课件\day07\day07-封装\day07_resource
回复 使用道具 举报
立志转行 发表于 2015-5-19 22:37
你的意思是第二步后开辟的栈内存存入p,在第8步p才指向对象,理解的对吧? ...

对的  要等对象初始化完毕之后才指向它
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马