【问题标题】:Changes to parameters passed to a static function in java [duplicate]更改传递给java中的静态函数的参数[重复]
【发布时间】:2014-02-24 05:40:20
【问题描述】:
class Util{

   public static void F(Point p, Point q) {
      p.x = 42; 
      p = q;
   }

}

…
Point a = new Point(10,20);

Point b = new Point(30,40);

Util.F(a,b);

System.out.println(a.x + " " + b.x);

如果有人能解释一下为什么输出是42 30

提前致谢!

【问题讨论】:

  • 如果b.x = 42 那么所有Java代码都会崩溃,甚至更糟的是整个universe!!
  • 谢谢,我想如果函数是静态的,那会改变一些东西。

标签: java function parameter-passing


【解决方案1】:

引用通过值传递http://javadude.com/articles/passbyvalue.htm

用比喻来解释:

假设有一个红色按钮。
当我点击红色按钮时,会出现一个球。
现在,为了快速获得更多球,为新按钮分配了相同的功能:单击时会出现相同的球。
然后,一个人来改变这个新按钮,让另一个球出现!

您对第一个按钮有何期待?要显示原来的还是新的?
当然是原来的!因为虽然按钮指向同一个球,但它们是完全独立的,这解释了为什么要在第二个按钮上应用更改不会改变第一个目标。
只有当第二个按钮MUTATED第一个球(不改变它!),例如将它涂成蓝色而不是红色,那么是的,第一个按钮将指向同一个蓝色球,因为它是。 .一样的!

将原始 button 替换为您的 ab references,并将 ball 替换为 x 创建的 @ 值987654325@.
p.x = 42第二个球的赋值。
p方法参数是第二个按钮(因为传值/复制)。

不要忘记:MUTATIONS(例如p.x = 42)对调用者环境可见,但在 REPLACEMENTS(赋值)的情况下不可见

我希望你现在明白为什么输出是42 30 而不是30 30,正如你所预料的那样;)

【讨论】:

    【解决方案2】:

    方法F 将作为第一个参数传递给42 的对象中字段x 的值更改为42,而它不会更改作为第二个参数传递的对象中字段的任何状态。

    所以,你做了什么:你创建了对象a,你在它的构造函数中传递了什么值并不重要:方法Fa.x更改为42

    您还创建了对象bx 状态等于30。方法 F 没有改变它的值,所以这是你输出的第二部分。

    字符串代码行p = q 怎么样 - 它没有做任何有价值的事情。它只是将变量p 的引用更改为对引用变量q 的对象的引用。它不会改变对象本身的状态。

    【讨论】:

      【解决方案3】:

      pq 是引用的值副本。在F 中,分配p = q 只会更改p 指向的内容,而不是实际对象本身,调用者中的任何值。

      p.x = 42 将字段x 更改为在p 引用的对象中具有值42

      综上所述,ax 字段将由Util.F 更改,但b 不会以任何方式更改。

      【讨论】:

        【解决方案4】:

        当你做p = q 不会改变点a 的值时,它只是将临时变量p 的引用更改为q。 但是 p.x=42 引用了 p 内部的一个值,所以实际上改变了它

        【讨论】:

          猜你喜欢
          • 2012-02-21
          • 2020-04-20
          • 1970-01-01
          • 2019-04-25
          • 2017-02-19
          • 2022-01-26
          • 1970-01-01
          • 2020-08-09
          • 2011-02-15
          相关资源
          最近更新 更多