老师说成员变量存放在栈内存里面,new出来的东西存放在堆内存里面。比如类A中的成员变量int i; 这个i是存放在栈内存里面吗?
那A a = new A();这个new A()是在堆内存里面,a.i也是在堆内存里面呢?那么int i到底是在堆内存里面还是在栈内存里面呢?
那A a = new A();这个new A()是在堆内存里面,a.i也是在堆内存里面呢?那么int i到底是在堆内存里面还是在栈内存里面呢?
比如
void f(){
int i;//这个i在函数被调用时在栈中分配空间
}class A{
int i;
}
new A();创建对象的时候分配在堆里。打个比方,张三在堆里坐着,那张三的脑袋当然也在堆里了。
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
当对象没有被实例化之前,类A的成员变量int i分配在堆还是栈里面呢?
是不是在对象没有被实例化之前类的成员变量在栈内存上分配空间;而实例化对象之后成员变量就被分配到了堆空间中呢?
比如您所说的:[Quote=引用
class A{
int i;
}
new A();创建对象的时候分配在堆里。打个比方,张三在堆里坐着,那张三的脑袋当然也在堆里了。
[/Quote]
如果没有new A();int i会被分配到堆还是栈呢?
你所说的是一个变量的引用,那如果成员变量在定义的时候就给它赋了值,比如int i = 1;在实例化这个类的对象之前,int i = 1被分配到哪个内存里面?
在这里看懂了,谢谢!
不过面文章里下的又不懂了:
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啊?里面的看不太懂!
它在运行的时候才会被分配空间,没有运行的时候它就是一个class文件。所以说,实例化之前,它存在硬盘上,而不是内存里。
可以看看我的博客《String in Java》
同时更正一下:成员变量在运行时被分配在堆内存里面,因为成员变量是在new出对象的时候才运行的!是我听课时听错了,谢谢大家的热情!