Java基元是堆栈还是堆?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

我只知道非基元(对象)放在堆上,方法放在堆栈上,但是基元变量呢?

我可以说堆可以有一个新的堆栈和堆给定的对象?鉴于该对象将有原始和参考变量..?

提问于
用户回答回答于

在本地定义的基元将位于堆栈上。然而,如果一个基元被定义为一个对象的一个​​实例的一部分,那么这个基元就会在堆上。

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 HeapClass())时,HeapClass的所有成员变量都被添加到堆中。因此,由于HeapClass正在堆中分配实例,因此int y将作为实例的一部分堆在堆上HeapClass

但是,任何方法的主体中声明的所有基本变量都将位于堆栈上。

正如你在上面的例子中看到的那样,int x它在堆栈中,因为它是在方法体中声明的 - 而不是作为类的成员。

用户回答回答于

所有局部变量(包括方法参数)都在堆栈中; 对象及其所有字段都存储在堆中。变量始终是对象的基元或引用

Java实现可能实际上将对象存储在堆中,使得它仍然符合规范。同样,局部变量可以存储在寄存器中,或者通过优化变得模糊不清。

扫码关注云+社区