【问题标题】:Where in memory are objects located when they are created within a static block?在静态块中创建对象时,对象位于内存中的什么位置?
【发布时间】:2012-08-29 07:12:44
【问题描述】:

如果我创建一个静态块并在那里创建一个对象,比如说其他类,该对象是在堆上创建还是在堆栈上创建?

class Hello {
   static {
       Abc abcObject=new Abc();
   }
   // Other Code...
} 

【问题讨论】:

  • 欢迎来到 Stack Overflow。当有人在这里帮助您时,习惯上会接受答案。您可以通过单击下面您认为正确的答案旁边的复选标记的轮廓来执行此操作。谢谢!
  • 谢谢@Erick...我买了你的温柔建议..

标签: java object heap-memory stack-memory static-block


【解决方案1】:

无论静态(或)非静态,对象总是在堆上。

引用将在堆栈上。

【讨论】:

  • +1 abcObject 是一个局部变量,它是一个对象的引用。这将在堆栈上。引用的对象将在堆上。
  • @Nambari.. 所以这意味着,一旦在编译时加载类,引用 abcObject(位于堆栈上)将不包含任何垃圾......但它实际上会在运行时引用对象,也就是说它实际上会在运行时拥有内存地址(一旦创建对象).....请回答。
  • @Kumar:我认为你说对了一半,因为静态块,你的代码在加载时执行。因此,在加载时,JVM 通过在 HEAP 中执行其构造函数来创建 Abc 对象,并将 abcObject 引用分配给它。因此,abcObject 永远不会包含对垃圾的引用。
【解决方案2】:

对象是在堆中创建的,但是对象的引用在栈中。

您创建的变量abcObject 位于堆栈中。这包含在堆中存储new Abc() 对象的内存地址。

【讨论】:

  • 对对象的引用在堆栈中你能详细说明吗/
  • @Santosh 所有局部变量都在栈上。
  • @Erick。所以这意味着,一旦在编译时加载类,,引用 abcObject(位于堆栈上)将不包含任何垃圾......但它实际上会在运行时引用对象,即它实际上会在运行时拥有内存地址(一旦创建对象).....请回答.....
  • @Kumar:在编译时,abcObject 是一个仅在 static { } 块范围内有意义的引用。此时,它还没有位于堆栈上,因为它仍然是编译时间。直到运行时才创建堆栈。但第二部分是正确的 - 它实际上会在运行时引用对象,并且一旦创建对象就会实际具有内存地址。
猜你喜欢
  • 1970-01-01
  • 2016-03-22
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多