黑马程序员技术交流社区

标题: 构造函数问题 [打印本页]

作者: 吃阁子的猫    时间: 2013-8-28 22:00
标题: 构造函数问题
本帖最后由 吃阁子的猫 于 2013-9-9 16:13 编辑

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



作者: straw    时间: 2013-8-28 23:40
据我所知new Person()出来的对象时放在堆中的,这个区的内存空间需要我们手动释放,但是java中也有回收机制可以帮我们完成这一步.然而p被人为是局部变量,所以被存放在栈内存中,当程序运行结束时系统就将p占用的空间释放掉.
但是你说:"new Person放在了栈内存中",请问你是怎么测试出来的?
作者: 黑马-张辉    时间: 2013-8-28 23:54
你说的应该是构造函数吧,构造函数随着类加载到方法区中,当创建对象即new Person("张三",30)的时候有参的构造函数会被调用进入栈.new 出来的对象还是在堆内存中.
作者: 吕振中    时间: 2013-8-29 09:03
首先需要给你纠正一下认识上的错误,Person p = new Person("张三","30")这句话里面:Person p 是栈内存中的一个局部变量,new Person在堆内存中产生一个对象,然后把new Person所产生的对象的内存地址值分配给p 变量,我们通过这个变量名调用对象。
作者: 第一印象    时间: 2013-8-29 12:36
构造函数内存图中,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变量




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