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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

我们都知道比方Person P =new Person();
这句话是在堆内存中开辟了一个空间,并且把地址赋给栈内存中的P引用

可是我想问,栈内存和堆内存谁先加载?
还有,如果对象有方法,那方法区又在什么时候加载呢?

5 个回复

倒序浏览
基本数据类型放在栈,引用数据类型放在堆里面
回复 使用道具 举报
堆内存是指存放的数据信息等“先进先出”,即取用先前存放的数据之后才能取用后面的,而栈内存恰好相反,即“先进后出”。  他们俩没有谁先谁后的问题。都是根据项目的需求来运行的
回复 使用道具 举报
[table]
[tr][td]我们都知道比方Person P =new Person();
这句话是在堆内存中开辟了一个空间,并且把地址赋
回复 使用道具 举报
本帖最后由 范泰洋 于 2012-8-5 00:32 编辑

我们都知道比方Person P =new Person();
这句话是在堆内存中开辟了一个空间,并且把地址赋给栈内存中的P引用
可是我想问,栈内存和堆内存谁先加载?
还有,如果对象有方法,那方法区又在什么时候加载呢?
首先,1:一开始主函数要先进栈,因为它是程序的入口出,这时后,栈内存就会先加载主函数,同时还有一个局部变量在栈内。2:然后,Person在堆内存中开辟了空间,这时候,堆内存开始加载,把地址值赋值给局部变量P。这时候,局部变量P就指向了对象Person。你说如果对象有方法,3:那就是当对象Person调用方法的时候,然后加载非静态区的方法,开始进栈,当方法结束的时候,就弹栈了。附图如下:

421421421.JPG (30.47 KB, 下载次数: 48)

421421421.JPG

评分

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

查看全部评分

回复 使用道具 举报
Person p = new Person();在内存中做了哪些事情
顺序如下:
        (1)将Person.class文件加载进内存中。
        (2)如果p定义在主方法中,那么,就会在栈空间开辟一个变量空间p。
        (3)在堆内存给对象分配空间。
        (4)对对象中的成员进行默认初始化。
        (5)对对象中的成员进行显示初始化。
        (6)调用构造代码块对对象进行初始化。(如果没有就不执行)
        (7)调用构造方法对对象进行初始化。对象初始化完毕。
        (8)将对象的内存地址赋值给p变量,让p变量指向该对象。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 鼓励新人!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马