【问题标题】:What is the rule in Java for 'pass by reference' / 'pass by value' for variable assignment?Java中变量赋值的“按引用传递”/“按值传递”的规则是什么?
【发布时间】:2014-04-12 10:00:45
【问题描述】:

因此,关于按引用传递/按值传递,方法如何与参数传递一起工作已经有很好的记录,但是变量赋值呢?

例如,我刚刚写了一些代码,如下所示:

TreeNode<T> parent = null;
TreeNode<T> current = m_root;
while(current != null) {
    parent = current;
    current = current.getRight();
}

现在,我怎么知道parentwhile 循环的最后一次赋值之后不等于current.getRight()?规则是什么?

【问题讨论】:

  • 你怎么知道while循环中的first赋值后null不等于current
  • 规则很简单:始终按值传递,Java 中不存在按引用传递。但是:引用也是按值传递的。请注意,按值传递引用与按引用传递不同。

标签: java variable-assignment pass-by-reference pass-by-value


【解决方案1】:

Java 中变量赋值的“按引用传递”/“按值传递”的规则是什么?

与将事物传递给方法相同:被复制,没有对变量的引用。

现在,我怎么知道parentwhile 循环中的最后一个赋值之后不等于current.getRight()?规则是什么?

你不知道,他们都可能是null。但是如果其中一个不是null,你知道它们不相等,因为循环一直持续到currentnull,所以如果parent 不是@987654329 @,他们不能相等。

但请注意这里的混淆。 parentcurrent 可以保存的值是对象引用。 (那句话中的“reference”与“pass-by-reference”中的“reference”没有关系。只是使用了“reference”这个词用于不同上下文中的许多不同事物。)因此,这两个变量都可以引用同一个对象,方法是在两个变量中具有相同的值(相同的对象引用)。​​

这对于变量和方法参数是完全相同的。让我们用一个更简单的例子:

Foo a = new Foo();
Foo b = a;

我们在内存中有一个Foo 对象,ab 变量都包含相同的值,即对该对象的引用。但是这两个变量之间没有没有联系。例如,如果我们添加这个:

b = new Foo();

...现在我们在内存中有两个Foo 对象,a 指向(指向)其中一个,b 指向另一个。这样做对a 中的值完全没有影响。 (如果abints 就是这样。)

【讨论】:

  • 如果在设置Foo b = a之后,我要写b.bar = 2;,这也会改变a.bar返回的值吗?
  • @KeirSimmons:大部分是正确的,是的。它不会改变它,它只是改变它。在这种情况下,b.bara.barsame 属性。想象一下,两个人看着一张上面有一个圆圈的纸。然后其中一个人在圆圈中写下数字 2。其他人看到 2。人是参考(ab);纸是对象;圆圈是财产; 2 是值。
【解决方案2】:

以下示例可能有助于说明按值/引用传递的工作原理:

http://blog.aaronshaw.net/2014/02/13/java-is-always-pass-by-value/

我会把它放在评论中,但它们更难被注意到。

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 2010-09-05
    • 2016-11-28
    相关资源
    最近更新 更多