Java Groovy变量的作用域、赋值和引用

Java Groovy变量的作用域、赋值和引用,java,groovy,scope,variable-assignment,Java,Groovy,Scope,Variable Assignment,我想帮助理解Groovy在函数之间传递时如何管理作用域和变量。假设我在main方法中声明def foo,并将其作为参数传递给私有void方法changeStuff。然后我可以进行如下更改: public static void main(args) { def foo = [:]; changeStuff(foo); println(foo); } private static void changeStuff(foo) { foo.bar = "new stuff"; } 打

我想帮助理解Groovy在函数之间传递时如何管理作用域和变量。假设我在main方法中声明
def foo
,并将其作为参数传递给私有void方法changeStuff。然后我可以进行如下更改:

public static void main(args) {
  def foo = [:];
  changeStuff(foo);
  println(foo);
}
private static void changeStuff(foo) {
  foo.bar = "new stuff";
}
打印的结果是
[bar:newstuff]
,但我很难用其他方式操作foo。请参见以下两个示例:

public static void main(args) {
  def foo = [:];
  changeStuff(foo);
  println(foo);
}
private static void changeStuff(foo) {
  def newStuff = [:]
  newStuff.extra = "extra stuff";
  foo = newStuff;
}
打印:
[:]

public static void main(args) {
  def foo = "before";
  changeStuff(foo);
  println(foo);
}
private static void changeStuff(foo) {
  foo = "after";
}


我知道这里有一些我不完全理解的概念,可能与
def
?非常感谢您对我可以在哪些方面了解到更多信息的任何总结或指导。

我在groovy方面的经验非常有限,因此我可能会有点走火入魔

在您提到的第一种情况下,您通过引用
changeStuff
传递
foo
,并且在方法内部,您直接修改映射,因此可以从
main
方法看到更改

在第二种情况下,将
changeStuff
方法中的参数
foo
分配给另一个映射。但是,
main
方法中的变量
foo
仍然指向您创建的第一个映射,因此在打印它时会指向空映射

第三种情况与第二种情况相同。另外,您还必须知道Java(可能还有Groovy)中的
String
对象是不可变的。因此,当“修改”一个
字符串时,实际上每次都要创建一个新实例。

Groovy的行为类似于java。看见