请注意,不要混淆“对象”本身和对“对象”的“引用”:
例如,以下代码创建一个 (null) 引用,但不创建任何对象。
Object a = null;
下面的代码创建一个 Object 和对该对象的引用(引用保存在一个名为'a'的变量中):
Object a = new Object();
下面的代码创建新的 Object 并“重新指向”现有(引用)变量以指向新对象:如果变量 'a' 已经包含另一个引用,则 'a' 会忘记它。[但这并不意味着其他变量可能仍然指向'a'引用的旧对象]。
a = new Object(); // it is the reference 'a' that is 're-used' here not the object...
每次您在循环中重新运行上面的语句时;你确实在创建一个新对象;并且您正在“重新指向”“a”到该新对象。
以前的引用(即保存在“a”中的引用)每次都会被遗忘;和(假设我们在这里有一个单线程程序)这意味着它指向的对象现在将没有指向它的引用:这意味着该对象有资格进行垃圾回收。这个垃圾回收是否发生在这个时间点 - 我不知道我害怕。
但是我要说:就垃圾回收发生的时间而言,您的编码示例没有区别;无论“指针类型”是否已在循环外部定义为“对象”,还是在循环中重复重新定义。
以下(无用的)示例可能有助于说明代码一次性执行的“创建对象”和“引用点”操作之间的区别:
// This creates an object ; but we don't hold a reference to it.
public class TestClass {
public static void main(String[] args) {
for (int n=0;n<100;n++) {
new Object();
}
}
}
对比一下:
// This creates a reference ; but no object is created
// This is identical to setting the reference to 'null'.
public class TestClass {
public static void main(String[] args) {
for (int n=0;n<100;n++) {
Object o;
}
}
}