新关键字的本地使用
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
将指向其他内容。因此,数组元素本身不受影响。
在此代码中,
for (Foo c : foos)
对数组元素的引用(例如foos[0]
)被复制到c
。
但是当你将一个新的Foo
实例分配给c
时,它并没有被数组反映出来,你只是简单地分配了一些东西给c
。
c = new Foo();
在下一个循环迭代中,下一个元素被重新分配给 c
,将 c = new Foo()
创建的对象松散地留在内存中。很快就会被垃圾回收。
我注意到您来自 C 世界,这解释了困惑。但是在 Java 中,传递给方法的参数或 foreach 循环中的元素引用总是被复制。 This post 解释了有关此行为的更多详细信息。
没想到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
将指向其他内容。因此,数组元素本身不受影响。
在此代码中,
for (Foo c : foos)
对数组元素的引用(例如
foos[0]
)被复制到c
。但是当你将一个新的
Foo
实例分配给c
时,它并没有被数组反映出来,你只是简单地分配了一些东西给c
。c = new Foo();
在下一个循环迭代中,下一个元素被重新分配给
c
,将c = new Foo()
创建的对象松散地留在内存中。很快就会被垃圾回收。
我注意到您来自 C 世界,这解释了困惑。但是在 Java 中,传递给方法的参数或 foreach 循环中的元素引用总是被复制。 This post 解释了有关此行为的更多详细信息。