一尘不染

Java原语会放在堆栈还是堆上?

java

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

-更新

根据答案,我可以说堆可以有一个新的堆,并且给定对象可以堆吗?假设对象将具有基本变量和引用变量。


阅读 311

收藏
2020-09-08

共1个答案

一尘不染

本地定义的基元将在堆栈中。但是,如果将原语定义为对象实例的一部分,则该原语将位于堆上。

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

但是,在任何方法的主体中声明的所有原始变量都将 位于stack上

如您在上面的示例中所见,int x它在堆栈中,因为它是在方法主体中声明的-而不是作为类的成员声明的。

2020-09-08