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

时间:2014-03-09 10:02:22

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

所以很好地记录了方法如何使用参数传递关于传递引用/传递值,但是如何使用变量赋值呢?

例如,我刚写了一些看起来像的代码:

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

现在,我如何知道parent循环中最后一次分配后current.getRight()不等于while?规则是什么?

2 个答案:

答案 0 :(得分:4)

  

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

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

  

现在,我如何知道parent循环中最后一次分配后current.getRight()不等于while?规则是什么?

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

但要注意这里的混乱。 nullparent可以容纳的值是对象引用。 (该句子中的“引用”与“引用传递”中的“引用”有 没有 。只是使用“引用”一词对于不同上下文中的许多不同的东西。)因此,这两个变量都可以通过在两个变量中具有相同的值(相同的对象引用)来引用相同的对象。

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

current

我们在内存中有一个Foo a = new Foo(); Foo b = a; 对象,Fooa变量都包含相同的值,这是对该对象的引用。但是这两个变量之间存在 no 连接。例如,如果我们添加这个:

b

...现在我们在内存中有两个b = new Foo(); 个对象,Foo引用(指向)其中一个,a指向另一个。这样做对b中的值完全没有影响。 (正好是aab时的方式。)

答案 1 :(得分:1)

这是一个可能有助于显示值/引用传递方式的示例:

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

我将其置于评论中,但他们更难注意到。