为了回答您的问题,我认为了解 JVM 在执行期间如何管理对象很有用。
所有java 对象都驻留在一个称为heap的JVM区域中并且可以(注意这不是强制性的)被一个或多个指向变量。
保存对对象的引用的变量位于 JVM 的另一个称为 stack 的区域。
每次执行像new SomeClass(); 这样的指令时,都会在该区域分配一个新对象。当堆区域变满时,垃圾会被收集,并在垃圾收集期间清除不再由变量指向的对象,以便为新对象释放堆空间。
你的两条指令有什么区别?
1-ClassName obj = new ClassName();
它在堆上分配一个由堆栈上的obj变量指向的新对象。
2-new ClassName();
它只是在堆上分配一个新对象,堆栈上没有指向它的变量。
什么时候可以使用第二种方法?
据此,如果您只想在堆上分配一个新对象而不通过变量使用它,例如测试程序的内存管理,则使用第二种方法可能很有用。实际上,当您想创建一个“一次性”对象并在同一条指令中使用它的方法或变量时,使用第二种方法可以提高垃圾收集器的效率并避免意外获得 OutOfMemoryError 异常,例如:
System.out.println(new ClassName().x)
或
new ClassName().evaluateResult();
注意:在这种特定情况下,您可能可以进行评估以在类上创建一个静态方法。
另一种用法是将新元素放入集合中,如下所示:
final List<ClassName> objectList = new ArrayList<>();
for(int i=0; i<10; i++){
objectList.add(new ClassName());
}
你可能会问:如果被指向的对象会发生什么?
至少有一个变量类似于第一种方法创建的变量?
当变量超出范围时,变量中的所有引用自然会被删除,因此它们自动符合垃圾收集的条件(根据它们的范围在代码上的管理方式)。