这是程序
public class Closure {
public String foo = "";
public static Closure process(final Closure t) {
System.out.println(t.toString() + " = " + t.foo);
t.foo = "bar";
new Runnable() {
public void run() {
System.out.println(t.toString() + " = " + t.foo);
t.foo = "baz";
}
}.run();
System.out.println(t.toString() + " = " + t.foo);
return t;
}
public static void main(String[] args) {
process(new Closure());
}
}
当我执行它时,所有3个打印显示变量t.foo的相同参考。这对于闭包来说是有意义的,它正如我们所期望的那样。
让我感到困惑的是,Java Strings是不可改变的。因此,如果我们重新分配字符串,参考不应该改变吗?
答案 0 :(得分:1)
当问题不包含任何闭包时,使用Closure
会有点混乱。
程序的输出应该是这样的(Ideone想要一个具有此名称而不是Closure的类)
Ideone@1e61582 =
Ideone@1e61582 = bar
Ideone@1e61582 = baz
正如您所看到的,参考foo
正在发生变化。您打印的参考t
不会按预期更改。
答案 1 :(得分:0)
不,因为您打印的是Closure
对象的引用,而不是String
的引用。
答案 2 :(得分:0)
foo属性是一个引用。这是对字符串在Java中不可变的含义的误解。