2012-01-05 86 views
-1
for(int i = 0; i < 3; i++){ 

Object obj = new Object(); 

} 

将在3个对象来创建或唯一一个被重新实例3倍的对象? 引擎盖下发生了什么?使用此for循环时将创建多少个对象?

+0

是指在循环执行完成后将创建多少个对象或将在内存中存储多少个对象? – StuperUser 2012-01-05 14:53:57

回答

7

三个对象将被创建,因为new Object()将被调用三次。

有没有这样的概念作为一个对象是“重新实例化”。

现在同样的堆栈空间很可能被用来存储从构造函数返回的引用,所以你可能会说,在某些方面,只有一个变量 ,这是对循环的每个迭代重新初始化。 ..但变量和对象是非常不同的,重要的是你在脑海中分开这两个概念。


在其他方面真的有三个独立的变量,所以请不要认为这太过分了。你使用“new”关键字

+1

使用转义分析,您可能会发现没有任何对象被创建,因为它们没有做任何事情,也没有被使用。我相信JRockit的优化可以消除这些代码。 – 2012-01-05 14:54:34

+0

一旦第二次分配发生,在循环的第二次迭代开始时由'obj'引用的内存中的对象会发生什么?是在循环的所有迭代的执行完成后还是在第二次迭代结束时收集的?或方法的结束?有关系吗? – StuperUser 2012-01-05 14:56:23

+1

@StuperUser:你是指对象本身?它立即成为垃圾收集的*符合条件*,但可以立即或稍后收集......不保证。 – 2012-01-05 15:05:29

1

你不能“重新实例化”一个对象。每次调用new关键字时,都会创建一个新对象,因此会创建3个对象。

1

任何时候,你会得到一个新的对象。由于引用位于本地范围内,因此该对象将在循环条件之后超出范围,并成为垃圾回收的候选对象。

0

你正在创建的堆内存三个不同的对象,但在循环后,你只能在你创造的最后一个对象访问。

编辑:对于“你可以”我的意思是通过指针你只能访问最后一个对象。每当这个词new使用新的对象

+0

实际上,考虑到声明变量的范围,他可以'在循环完成后访问任何对象我猜你可以说零对象被创建了! – Perception 2012-01-05 15:02:32

+0

噢,你是完全正确的,但我的意思是,在范围是“正确”的不同情况下,他只能访问在创建的“最后”对象上 – DonCallisto 2012-01-05 15:03:47

0

创建,所以您要创建3个对象。虽然给定了声明变量的范围,但是一旦循环完成,就不能使用任何对象。