【问题标题】:Why does this output remain unchanged after returning to the main? [duplicate]为什么回到main后这个输出保持不变? [复制]
【发布时间】:2018-12-10 04:59:38
【问题描述】:

既然它通过引用传递对象 myOtherSample 并使其指向对象 s2,那么输出不应该变成:4 4.95 4 0 吗?

【问题讨论】:

  • 并使它指向对象 s2 不能做那部分,这就是原因。 s.j = p; 会这样做。 s = s2; 更新了fs 的值,但无法更新原调用者的引用。
  • 不创建 s2,而是将值分配给 s 本身并尝试

标签: java reference parameter-passing


【解决方案1】:

它实际上并没有按照您的想法通过引用传递。最好理解引用变量(mySample、myOtherSample、s 和 s2)实际上只是保存对象在内存中的位置。因此,s 是与 myOtherSample 完全不同的变量。它只是指向内存中的同一个对象,因为 myOtherSample 是 f 的参数。当您将 s = 设置为 s2 时,s 不再指向与 myOtherSample 相同的对象。但是,myOtherSample 不受影响,因为它是一个完全独立的变量。这个概念有时会很棘手,也许可以看看绘制箱形箭头图会有所帮助。

【讨论】:

    【解决方案2】:

    既然它通过引用传递对象 myOtherSample 并使其指向对象 s2,那么输出不应该变成:4 4.95 4 0 吗?

    Java 总是按值传递:Is Java "pass-by-reference" or "pass-by-value"?

    您创建了一个示例对象,并在f 函数之外使myOtherSample 指向它。通过调用f(myOtherSample,i)myOtherSample 值(其值为地址的指针)被传递给在f 函数范围内定义的s。所以现在指针s指向Sample对象,在这里你可以使用指针s改变那个Sample对象的j值。

    但是之后指针s被重新分配给在f函数(s=s2)内部创建的新Sample对象,如果你使myOtherSample指向的Sample对象不会改变指针s 现在指向的对象的任何更改。

    这就是您的代码中发生的情况。你应该了解更多关于 Java 隐式pointer

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 2015-07-22
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      相关资源
      最近更新 更多