Java 在静态块中创建对象时,对象在内存中位于何处?

Java 在静态块中创建对象时,对象在内存中位于何处?,java,object,heap-memory,stack-memory,static-block,Java,Object,Heap Memory,Stack Memory,Static Block,如果我创建一个静态块并在那里创建一个对象,比如说某个其他类,那么该对象是在堆上还是在堆栈上创建的 class Hello { static { Abc abcObject=new Abc(); } // Other Code... } 对象始终在堆上,而不管是静态的(或非静态的) 引用将在堆栈上。对象在堆中创建,但对对象的引用在堆栈中。 您创建的变量abcObject位于堆栈中。它包含堆中存储新Abc()对象的内存地址。+1abcObject是一个局部变量,是

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

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

对象始终在堆上,而不管是静态的(或非静态的)


引用将在堆栈上。

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


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

+1
abcObject
是一个局部变量,是对对象的引用。这将在堆栈上。引用的对象将在堆上。@Nambari。。因此,这意味着,一旦类在编译时加载,,,引用对象(位于堆栈上)将不会包含任何垃圾内容…但它实际上会在运行时引用对象,也就是说,它在运行时(一旦对象被创建)将实际具有内存地址…请回答。@Kumar:我想你是对的一半,因为是静态块,所以代码在加载时执行。所以,在加载时,JVM通过在堆中执行其构造函数来创建Abc对象,并为其分配abcObject引用。所以,abcObject从不包含对垃圾的引用。对对象的引用在堆栈中。你能详细说明一下吗?/@Santosh所有局部变量都在堆栈上。@Erick。因此,这意味着,一旦类在编译时加载,,,引用对象(位于堆栈上)将不包含任何垃圾…但它实际上会在运行时引用对象,也就是说,它在运行时(一旦对象创建)将实际具有内存地址…请回答…@Kumar:在编译时,
abcObject
是仅在
static{}
块范围内具有意义的引用。此时,它不在堆栈上,因为它仍然是编译时。直到运行时才创建堆栈。但是第二部分是正确的-它实际上在运行时引用对象,并且在创建对象后实际具有内存地址。欢迎使用堆栈溢出。当有人在这里帮助你时,通常会接受回答。您可以通过单击下面您认为正确答案旁边的复选标记的轮廓来完成此操作。谢谢谢谢@Erick…我接受你温和的建议。。