新关键字的本地使用

Local usage of new keyword

没想到new在实例变量已经赋值的情况下不会改变实例变量。

我理解的对吗?

class Foo {
    String name = "Java";
}
class Main {
    public static void main(String args[]) {
        Foo foos[] = { new Foo(), new Foo() };
        foos[0].name = "bar";
        for (Foo c : foos) c = new Foo();
        for (Foo c : foos) System.out.println(c.name);
        for (Foo c : foos) c.name = "baz";
        for (Foo c : foos) System.out.println(c.name);
    }
}

输出

bar
Java
baz
baz

在上面的示例中,new 更像是将对象转换为相同的 class 已经是它了。这种行为的实际用途是什么?

因为Java总是pass-by-value。变量 c 不反映数组元素,但它的引用值被复制。所以起初,c 指向数组元素的值,但是当您使用 c = new Foo() 重新分配 c 时,变量 c 将指向其他内容。因此,数组元素本身不受影响。

  1. 在此代码中,

    for (Foo c : foos)
    

    对数组元素的引用(例如foos[0])被复制到c

  2. 但是当你将一个新的Foo实例分配给c时,它并没有被数组反映出来,你只是简单地分配了一些东西给c

    c = new Foo();
    
  3. 在下一个循环迭代中,下一个元素被重新分配给 c,将 c = new Foo() 创建的对象松散地留在内存中。很快就会被垃圾回收。

我注意到您来自 C 世界,这解释了困惑。但是在 Java 中,传递给方法的参数或 foreach 循环中的元素引用总是被复制。 This post 解释了有关此行为的更多详细信息。