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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吃阁子的猫 中级黑马   /  2013-8-28 22:00  /  1247 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吃阁子的猫 于 2013-9-9 16:13 编辑

构造函数内存图中,Person p = new Person("张三","30")创建后,自动调用构造函数,但是new Person放在了栈内存中,new出来的东西不是应该都在堆内存里吗?


4 个回复

倒序浏览
据我所知new Person()出来的对象时放在堆中的,这个区的内存空间需要我们手动释放,但是java中也有回收机制可以帮我们完成这一步.然而p被人为是局部变量,所以被存放在栈内存中,当程序运行结束时系统就将p占用的空间释放掉.
但是你说:"new Person放在了栈内存中",请问你是怎么测试出来的?
回复 使用道具 举报
你说的应该是构造函数吧,构造函数随着类加载到方法区中,当创建对象即new Person("张三",30)的时候有参的构造函数会被调用进入栈.new 出来的对象还是在堆内存中.
回复 使用道具 举报
首先需要给你纠正一下认识上的错误,Person p = new Person("张三","30")这句话里面:Person p 是栈内存中的一个局部变量,new Person在堆内存中产生一个对象,然后把new Person所产生的对象的内存地址值分配给p 变量,我们通过这个变量名调用对象。
回复 使用道具 举报
构造函数内存图中,Person p = new Person("张三","30")创建后,自动调用构造函数,但是new Person放在了栈内存中,new出来的东西不是应该都在堆内存里吗?

需要说明的是new Person,是创建一个对象,对象创建后,是存放在堆内存中,而p是一个变量,是存放在栈内存中的,将new Person("张三",30)赋给p,其实就是将Person对象在堆内存中的引用地址赋给了p,对于Person对象的实例化过程如下:
1.加载Person类
2.在栈内存中开辟空间存储p变量;
3.在堆内存中开辟空间并分配地址同时存储new出来的Person对象,假如这个地址是0x2323a3
4.将地址值0x2323a3赋给p变量
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马