【问题标题】:memory allocation of a variable in java?java中变量的内存分配?
【发布时间】:2016-05-01 23:09:00
【问题描述】:

假设我有一个这样的代码 sn-p:-

class A {
   void help() {
      Help helper = new Help();
   }
}

在上述情况下,对象引用助手将在堆栈中分配内存。

如果我有这样的情况

class A {
    Help helper = new Help();
}

在这种情况下,助手不会在堆栈帧内分配内存(我确信这一点)。 它的行为会像一个实例变量一样,并且会在堆上的对象内部分配空间。

【问题讨论】:

标签: java


【解决方案1】:

对象变量和引用变量是有区别的。例如:

//Here 'helper' is the reference variable
Helper helper = new Helper ();

每当我们创建任何对象 (new Helper()) 时,它总是在 堆空间 中创建,并且它是 堆栈空间 中的引用 (helper)。 p>

Java Stack 内存用于执行线程。他们包含 短暂的和对其他方法的引用 堆中的对象从方法中获取。

(来源:https://www.journaldev.com/4098/java-heap-space-vs-stack-memory#java-stack-memory)

所以这两个对象存储在堆中,但它们的两个引用变量存储在不同的堆栈中。

【讨论】:

    【解决方案2】:

    是的,在第二种情况下,一旦class A 的对象被初始化,内存就会被分配给对象helper但是在第一种情况下,内存将被分配到堆栈到名为void help() 的函数,并且将在函数结束后立即销毁,因为helper 对象是此函数的局部变量。

    【讨论】:

      【解决方案3】:

      是的,你是对的。在第二种情况下,Help 对象将充当类的实例变量。 当您在函数内声明对象时,堆栈内存已用完(局部变量)。而对于实例变量,则使用堆内存。

      【讨论】:

        【解决方案4】:

        这种类型的声明仅位于您的实例中。每次实例化 A 类时都会分配 helper 属性。

        它绝对是一个实例变量。它在堆中

        为了分离实例和变量,你可以使用静态属性。然后它被链接到类,所以它进入代码段。

        【讨论】:

          猜你喜欢
          • 2016-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-05
          • 1970-01-01
          • 2021-12-02
          相关资源
          最近更新 更多