【发布时间】:2018-12-10 04:59:38
【问题描述】:
【问题讨论】:
-
并使它指向对象 s2 不能做那部分,这就是原因。
s.j = p;会这样做。s = s2;更新了f中s的值,但无法更新原调用者的引用。 -
不创建 s2,而是将值分配给 s 本身并尝试
标签: java reference parameter-passing
【问题讨论】:
s.j = p; 会这样做。 s = s2; 更新了f 中s 的值,但无法更新原调用者的引用。
标签: java reference parameter-passing
它实际上并没有按照您的想法通过引用传递。最好理解引用变量(mySample、myOtherSample、s 和 s2)实际上只是保存对象在内存中的位置。因此,s 是与 myOtherSample 完全不同的变量。它只是指向内存中的同一个对象,因为 myOtherSample 是 f 的参数。当您将 s = 设置为 s2 时,s 不再指向与 myOtherSample 相同的对象。但是,myOtherSample 不受影响,因为它是一个完全独立的变量。这个概念有时会很棘手,也许可以看看绘制箱形箭头图会有所帮助。
【讨论】:
既然它通过引用传递对象 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。
【讨论】: