黑马程序员技术交流社区

标题: 请教关于初始化对象时先后顺序的问题 [打印本页]

作者: 立志转行    时间: 2015-5-16 21:40
标题: 请教关于初始化对象时先后顺序的问题
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再指向对象?


作者: 立志转行    时间: 2015-5-16 21:57
大神快显灵!!
作者: 陈明佳    时间: 2015-5-17 07:41
厉害啊。学习下
作者: 枕寒流    时间: 2015-5-17 08:03
谈一下我的理解,、(错了别打我)
1,栈内存应在在第七步之后才开辟,一开辟就存入向堆内存中的首地址
2,不是一个意思,堆内存开辟空间一般是一片连续的地址,栈内存开辟空间只存连续地址的首地址,
3,堆内存和栈内存开辟后是不是已经产生了联系?在Person p = new Person("zhangsan",20);中应该是产生了联系
栈内存中的p指向堆内存中的空间?p中存的是堆内存开辟空间的首地址,引用型变量。
还是堆内存初始化完全后p再指向对象?是的
作者: guoyangpeng    时间: 2015-5-17 08:20
学习了,说得好!
作者: 立志转行    时间: 2015-5-17 09:17
枕寒流 发表于 2015-5-17 08:03
谈一下我的理解,、(错了别打我)
1,栈内存应在在第七步之后才开辟,一开辟就存入向堆内存中的首地址
2, ...

根据毕老师的这八个步骤分析,栈内存在第7步之后开辟最为合理,同时解决了我的3个问题。
作者: guojiadui    时间: 2015-5-17 09:38
学习中

作者: 立志转行    时间: 2015-5-17 09:49
立志转行 发表于 2015-5-17 09:17
根据毕老师的这八个步骤分析,栈内存在第7步之后开辟最为合理,同时解决了我的3个问题。 ...

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

那栈在什么时候创建的呢?
作者: LoseMyCat    时间: 2015-5-19 22:09
立志转行 发表于 2015-5-19 22:08
那栈在什么时候创建的呢?

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

不明觉厉的赶脚!还没学到线程,先记住了,到时候看。谢了!
作者: lingdu    时间: 2015-5-19 22:22
学习中。。。。。
作者: tanzhixue    时间: 2015-5-19 22:33
本帖最后由 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才指向堆中的成员变量和方法

作者: 立志转行    时间: 2015-5-19 22:37
tanzhixue 发表于 2015-5-19 22:33
首先是类先加载 然后main()进方法区 然后 Person P这里加载Person类在栈中存入Person p,然后new 是在堆 ...

你的意思是第二步后开辟的栈内存存入p,在第8步p才指向对象,理解的对吧?
作者: 王连涛    时间: 2015-5-19 22:38
D:\课件\day07\day07-封装\day07_resource
作者: tanzhixue    时间: 2015-5-19 22:39
立志转行 发表于 2015-5-19 22:37
你的意思是第二步后开辟的栈内存存入p,在第8步p才指向对象,理解的对吧? ...

对的  要等对象初始化完毕之后才指向它
作者: 王连涛    时间: 2015-5-19 22:40
看看这张图你应该能明白
作者: 王连涛    时间: 2015-5-19 22:46
看看图片你应该能明白点。
作者: 立志转行    时间: 2015-5-19 22:51
王连涛 发表于 2015-5-19 22:46
看看图片你应该能明白点。

图上没有说静态代码块,应该在静态代码块后面,和上面的兄弟说的一样!谢了!




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