Java原语是在堆栈上还是在堆上?
2022-08-31 16:19:28
我只知道非基元(对象)在堆上,方法在堆栈上,但是基元变量呢?
--更新
根据答案,我可以说堆可以为给定对象提供新的堆栈和堆?假设对象将具有基元变量和引用变量..?
我只知道非基元(对象)在堆上,方法在堆栈上,但是基元变量呢?
--更新
根据答案,我可以说堆可以为给定对象提供新的堆栈和堆?假设对象将具有基元变量和引用变量..?
本地定义的基元将在堆栈上。但是,如果将基元定义为对象实例的一部分,则该基元将位于堆上。
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.
}
}
关于更新:
对象没有自己的堆栈。在我的示例中,实际上是 的每个实例的一部分。每当分配 HeapClass 的实例(例如)时,HeapClass 的所有成员变量都会添加到堆中。因此,由于 的实例是在堆上分配的,因此将作为 的实例的一部分在堆上。int y
HeapClass
new Test.HeapClass()
HeapClass
int y
HeapClass
但是,在任何方法的主体中声明的所有基元变量都将位于堆栈上。
正如您在上面的示例中看到的,它位于堆栈上,因为它是在方法主体中声明的,而不是作为类的成员。int x
所有局部变量(包括方法参数)都在堆栈上;对象及其所有字段都存储在堆中。变量始终是基元或对对象的引用。
Java 实现实际上可能以仍然符合规范的方式将对象存储在堆上。同样,局部变量可以存储在寄存器中,或者通过优化变得模糊不清。