变量和内存的关系

gzsky133 2010-03-04 11:36:12
老师说成员变量存放在栈内存里面,new出来的东西存放在堆内存里面。比如类A中的成员变量int i; 这个i是存放在栈内存里面吗?
那A a = new A();这个new A()是在堆内存里面,a.i也是在堆内存里面呢?那么int i到底是在堆内存里面还是在栈内存里面呢?
...全文
156 15 打赏 收藏 转发到动态 举报
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
goshark 2010-03-04
  • 打赏
  • 举报
回复
内存分配方式有三种:
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
liujun3512159 2010-03-04
  • 打赏
  • 举报
回复
嗯,不错,这个问题,大家可以讨论 下哦
ZangXT 2010-03-04
  • 打赏
  • 举报
回复
看上下文。
比如
void f(){
int i;//这个i在函数被调用时在栈中分配空间
}

class A{
int i;
}
new A();创建对象的时候分配在堆里。打个比方,张三在堆里坐着,那张三的脑袋当然也在堆里了。
gzsky133 2010-03-04
  • 打赏
  • 举报
回复
谁能解释得详细一点呢?
jafapple 2010-03-04
  • 打赏
  • 举报
回复
公鸡下蛋, 堆中有栈
usherlight 2010-03-04
  • 打赏
  • 举报
回复
一个编译期间决定的,一个运行时动态生成的,不一样
gzsky133 2010-03-04
  • 打赏
  • 举报
回复
谢谢楼上的大侠!
同时更正一下:成员变量在运行时被分配在堆内存里面,因为成员变量是在new出对象的时候才运行的!是我听课时听错了,谢谢大家的热情!
heartraid86 2010-03-04
  • 打赏
  • 举报
回复
引用 12 楼 gzsky133 的回复:
引用 5 楼 chenzhp 的回复:
http://blog.sina.com.cn/s/blog_5d7cccb90100bv5u.html

在这里看懂了,谢谢!
不过面文章里下的又不懂了:
Strings tr1=new String(“abc”);
Strings tr2=“abc”;
tr1和tr2指向的不是同一个对象吗?它们的内存又是怎么分配的呢?
tr1在栈里面有一分内存,然后tr1的值"abc"分配在堆内存里rt1所引用的对象中,tr1指向"abc".
tr2在栈里面有一分内存,然后tr2的值就直接存在于栈内存中吗?还是tr2在堆中创建了另一个对象来存储"abc"?所以tr1 == tr2 为false? 可是tr2没有new啊?

里面的看不太懂!


可以看看我的博客《String in Java
bayougeng 2010-03-04
  • 打赏
  • 举报
回复
引用 11 楼 gzsky133 的回复:
引用 10 楼 zyw_computer_love 的回复:
把变量比作糖果,内存比作罐子,糖放在罐子里,同样变量就放在罐子里,但是变量是一个地址,而不是什么实实在在的值(比如数字什么),根据地址然后再去找这个值,这个地址存储着这个值

你所说的是一个变量的引用,那如果成员变量在定义的时候就给它赋了值,比如int i = 1;在实例化这个类的对象之前,int i = 1被分配到哪个内存里面?


它在运行的时候才会被分配空间,没有运行的时候它就是一个class文件。所以说,实例化之前,它存在硬盘上,而不是内存里。
gzsky133 2010-03-04
  • 打赏
  • 举报
回复
引用 5 楼 chenzhp 的回复:
http://blog.sina.com.cn/s/blog_5d7cccb90100bv5u.html


在这里看懂了,谢谢!
不过面文章里下的又不懂了:
Strings tr1=new String(“abc”);
Strings tr2=“abc”;
tr1和tr2指向的不是同一个对象吗?它们的内存又是怎么分配的呢?
tr1在栈里面有一分内存,然后tr1的值"abc"分配在堆内存里rt1所引用的对象中,tr1指向"abc".
tr2在栈里面有一分内存,然后tr2的值就直接存在于栈内存中吗?还是tr2在堆中创建了另一个对象来存储"abc"?所以tr1 == tr2 为false? 可是tr2没有new啊?

里面的看不太懂!
gzsky133 2010-03-04
  • 打赏
  • 举报
回复
引用 10 楼 zyw_computer_love 的回复:
把变量比作糖果,内存比作罐子,糖放在罐子里,同样变量就放在罐子里,但是变量是一个地址,而不是什么实实在在的值(比如数字什么),根据地址然后再去找这个值,这个地址存储着这个值


你所说的是一个变量的引用,那如果成员变量在定义的时候就给它赋了值,比如int i = 1;在实例化这个类的对象之前,int i = 1被分配到哪个内存里面?
zyw_computer_love 2010-03-04
  • 打赏
  • 举报
回复
把变量比作糖果,内存比作罐子,糖放在罐子里,同样变量就放在罐子里,但是变量是一个地址,而不是什么实实在在的值(比如数字什么),根据地址然后再去找这个值,这个地址存储着这个值
sqcyg 2010-03-04
  • 打赏
  • 举报
回复
new出来的东西是放在堆内存里 像a,i的变量放在栈内存里
gzsky133 2010-03-04
  • 打赏
  • 举报
回复
引用 4 楼 zangxt 的回复:
看上下文。
比如
void f(){
  int i;//这个i在函数被调用时在栈中分配空间
}

class A{
  int i;
}
new A();创建对象的时候分配在堆里。打个比方,张三在堆里坐着,那张三的脑袋当然也在堆里了。


当对象没有被实例化之前,类A的成员变量int i分配在堆还是栈里面呢?
是不是在对象没有被实例化之前类的成员变量在栈内存上分配空间;而实例化对象之后成员变量就被分配到了堆空间中呢?
比如您所说的:[Quote=引用
class A{
int i;
}
new A();创建对象的时候分配在堆里。打个比方,张三在堆里坐着,那张三的脑袋当然也在堆里了。
[/Quote]
如果没有new A();int i会被分配到堆还是栈呢?
相关推荐

62,567

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告