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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张宏祚 中级黑马   /  2013-10-10 13:57  /  1855 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张宏祚 于 2013-10-10 16:41 编辑

不知道我理解的是否正确,希望大家来讨论!
我理解的是在栈内存中,存放的是一个地址,该地址放的是堆内存中的某一个地方。
那么,例如 int a = 5; 这个5是直接放在栈内存里,还是栈内存有一个空间叫a,但是数据5放在堆内存里?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

11 个回复

倒序浏览
应该是栈内存有一个空间叫a,堆内存有数据5的空间 a指向5
回复 使用道具 举报
Java把内存划分成两种:一种是栈内存,一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。


int a = 5;
变量a是存在栈里面的,5存在堆里面,5在内存中的地址值赋给了变量a,然后变量a指向了5。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
      int a=5;这句话,会把a这个引用对象放进栈内存,也就是对象的名字a放进栈内存。而在堆内存中开辟一块空间给a这个对象,空间里有个数据是5。
     栈存放的是引用也就是地址,堆用来存放具体对象的属性和方法。例如Object obj = new Object();
这句话,会把obj这个引用放进栈内存,就是这个对象的名字obj放进栈内存,而new Object()会在堆内存中开辟一块空间给这个对象,对象的属性、方法全在里面。不知道对不对纯属个人理解。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
首先变量分为成员变量和局部变量,他们在内存中的加载是不一样的。
局部变量存储于栈内存,而堆内存用于存储数组和对象,通过new建立的实体全部存放到堆内存中,每一个实体都有内存地址值;
如果int a=5;是成员变量,a的值是5它们都在栈中;同样如果是局部变量他们都在堆中。
回复 使用道具 举报
卜弦 发表于 2013-10-10 14:41
首先变量分为成员变量和局部变量,他们在内存中的加载是不一样的。局部变量存储于栈内存,而堆内存用于存储 ...

哥们,你理解的很到位,谢谢,就是有一个地方还是糊涂,再追问你一下。成员变量储存在栈,局部变量储存在堆,对吗?
回复 使用道具 举报
卜弦 中级黑马 2013-10-10 15:36:11
7#
张宏祚 发表于 2013-10-10 15:21
哥们,你理解的很到位,谢谢,就是有一个地方还是糊涂,再追问你一下。成员变量储存在栈,局部变量储存在 ...

才发现我打错了。。。。在解释一下。
如果这个变量在类中在对象还没建立时就已经初始化了即在内存中加载了,那么这个变量和它的值都在栈中。
如果一旦建立了新的对象,那么他们就都在堆中(相当于又复制了一份)。堆有点特别,它只存储实例化对象相关的数值。所以毕老师说所有new建立的对象以及其中包含的变量和方法都在堆中。
我楼上的说的也挺到位的

评分

参与人数 1黑马币 +5 收起 理由
xh396660787 + 5

查看全部评分

回复 使用道具 举报 1 0
卜弦 发表于 2013-10-10 15:36
才发现我打错了。。。。在解释一下。
如果这个变量在类中在对象还没建立时就已经初始化了即在内存中加载 ...

ok ,现在明白了,谢谢啦!兄弟
回复 使用道具 举报
堆栈就是指针和空间的关系。
一个存放指向该对象的指针,相当于地图。
一个存放数据的。相当于仓库。。
不过两个都是得开辟空间的,如果没开辟空间的话,会报空指针异常。。
就像地图虽小,但也占空间,它指向的数据空间那就更不必说了。
回复 使用道具 举报
卜弦 中级黑马 2013-10-10 16:14:06
10#
张宏祚 发表于 2013-10-10 15:53
ok ,现在明白了,谢谢啦!兄弟

不用谢 希望对你有帮助!:D
回复 使用道具 举报
...... 中级黑马 2013-10-11 09:26:04
11#
卜弦 发表于 2013-10-10 14:41
首先变量分为成员变量和局部变量,他们在内存中的加载是不一样的。局部变量存储于栈内存,而堆内存用于存储 ...

感觉这个说的对。。。如果a不是类的成员变量,a和5应该都是在栈内存中
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马