java - new 关键字的本地使用

标签 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工作方式更像是将对象强制转换为同一个类。这种行为有什么实际用途?

最佳答案

这是因为 Java 始终是按值传递。变量c不反射(reflect)数组元素,但它的引用值被复制。因此,一开始,c指向数组元素的值,但是当您使用c = new Foo()重新分配c时,变量c 将指向其他内容。因此,数组元素本身不受影响。

  1. 在此代码中,

    for (Foo c : foos)
    

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

  2. 但是当您将新的 Foo 实例分配给 c 时,数组不会反射(reflect)它,您只是将一些内容分配给 c.

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

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

关于java - new 关键字的本地使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41672605/

相关文章:

java - JOptionPane.showInputDialog 找不到符号

java - 如何在 Spring 中使用 setter 注入(inject)和 java 配置?

php - 在流程之前验证集数据时,我应该使用哪个 SPL 异常?

java - 序列化 java.lang.Locale

html - 如何覆盖输入类型 ="file"浏览按钮的行为?

java - 使用单词定界符拆分字符串

java - 如何使用jaxb解析xml

python - 您可以在第一次访问对象属性时对其进行初始化吗?

php - 在不使用类的情况下返回具有 __toString 功能的对象

ios - 使用 iOS7 的 Swift ISO-8601 日期格式