没想到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
将指向其他内容。因此,数组元素本身不受影响。
在此代码中,
for (Foo c : foos)
对数组元素的引用(例如
foos[0]
)被复制到c
。但是当您将新的
Foo
实例分配给c
时,数组不会反射(reflect)它,您只是将一些内容分配给c
.c = new Foo();
在下一次循环迭代中,下一个元素将重新分配给
c
,将c = new Foo()
创建的对象松散地保留在内存中。很快就会被垃圾收集。
我注意到您来自 C 世界,这解释了这种困惑。但在 Java 中,传递给方法的参数或 foreach 循环中的元素引用始终会被复制。 This post解释了有关此行为的更多详细信息。
关于java - new 关键字的本地使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41672605/