关于Java创建对象内存分配的问题
请问 A a = new A();
这句话.分配了几块内存.
A a; 这分配内存了吗?
new A(); 我知道是在堆上面创建了个对象.就应该分配了.
可是 a 这个存的是对象的引用.这个算不算也是分配内存了.
------解决方案--------------------应该是每当new一个对象的时候就要为之创建内存吧
------解决方案--------------------两块内存,一块栈内存上存A a这个变量,堆内存上存new A()这个对象
------解决方案--------------------A a 引用在栈中保存,new A()对象在堆中保存
------解决方案-------------------- A a = new A();
这行代码实际上产生了两个实体,一个a变量 一个对象A。a被放在栈内存中,A的内容被放在堆内存的。a里面存放的是A的引用(地址)。
------解决方案--------------------首先java的执行过程在内存中一共占四个区域:
heap (堆)区:用来存放new出来的东西,是一个对象的真正存放位置。堆用于动态分配和释放程序所使用的对象。
stack (栈)区:用来存放局部变量,一般是对象的引用。
data segment 区:用来存放静态变量和字符串常量(只是常量,new出来的String对象还是在heap中)。
code segment 区:存放要执行的代码(函数,语句)
那么A a = new A();就不难理解为在栈中创建变量a,其a指向堆真正new的对象.
------解决方案--------------------六楼正解。。。。
------解决方案--------------------对象的引用,在栈中分配了内存,引用变量在程序运行到其作用域之外后被释放
上述的代码:
new A()在堆中分配内存,创建对象
A a在栈中分配内存,栈中的引用变量来访问堆中的对象
栈内存用来存放:基本类型的变量数据和对象的引用变量堆内存用来存放:由new创建的对象和数组
------解决方案--------------------
------解决方案--------------------这个应该跟虚拟机实现相关。因为对象访问有两种,1.句柄访问;2直接指针访问。
如果是第一种,那么会在java堆创建一个句柄,同时创建一个实例。而java栈中创建一个引用。这样就会有3块内存分配。如果是第二种,那么就跟楼上的说的差不多了