我只知道非基元(对象)放在堆上,方法在堆栈上,但是基元变量呢?
-更新
根据答案,我可以说堆可以有一个新的堆,并且给定对象可以堆吗?假设对象将具有基本变量和引用变量。
本地定义的基元将在堆栈中。但是,如果将原语定义为对象实例的一部分,则该原语将位于堆上。
public class Test { private static class HeapClass { public int y; // When an instance of HeapClass is allocated, this will be on the heap. } public static void main(String[] args) { int x=1; // This is on the stack. } }
关于更新:
对象没有自己的堆栈。在我的示例中,int y实际上是的每个实例的一部分HeapClass。只要分配了HeapClass的实例(例如new Test.HeapClass()),就会将HeapClass的所有成员变量添加到堆中。因此,由于的实例HeapClass是在堆上分配的,因此int y将作为实例的一部分在堆上HeapClass。
int y
HeapClass
new Test.HeapClass()
但是,在任何方法的主体中声明的所有原始变量都将 位于stack上 。
如您在上面的示例中所见,int x它在堆栈中,因为它是在方法主体中声明的-而不是作为类的成员声明的。
int x