新关键字的本地使用情况

时间:2017-01-16 08:59:06

标签: java oop locale variable-assignment assignment-operator

如果已经分配了实例变量,我没想到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更像是将对象强制转换为同一个类。这种行为的实际用途是什么?

1 个答案:

答案 0 :(得分:3)

这是因为Java总是按值传递。变量Camera::ConvertScreenToWorld不反映数组元素,但会复制其引用值。因此,首先,c指向数组元素的值,但是当您使用c重新分配c时,变量c = new Foo()将指向其他内容。因此,数组元素本身不受影响。

  1. 在此代码中

    c

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

  2. 但是,当您将新的c实例分配给Foo时,数据不会反映出来,您只需将某些内容分配给c

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

  4. 我注意到你来自一个C世界,这解释了混乱。但是在Java中,始终会复制传递给foreach循环中的方法或元素引用的参数。 This post解释了有关此行为的更多详细信息。

相关问题