所以很好地记录了方法如何使用参数传递关于传递引用/传递值,但是如何使用变量赋值呢?
例如,我刚写了一些看起来像的代码:
TreeNode<T> parent = null;
TreeNode<T> current = m_root;
while(current != null) {
parent = current;
current = current.getRight();
}
现在,我如何知道parent
循环中最后一次分配后current.getRight()
不等于while
?规则是什么?
答案 0 :(得分:4)
Java中用于“按引用传递”/“按值传递”变量赋值的规则是什么?
与将事物传递到方法相同:值被复制,没有对变量的引用。
现在,我如何知道
parent
循环中最后一次分配后current.getRight()
不等于while
?规则是什么?
你没有,他们都可以null
。但是如果其中一个不是 null
,你知道它们不相等,因为循环一直持续到current
为null
所以如果{{ 1}}不是parent
,它们不能相等。
但要注意这里的混乱。 null
和parent
可以容纳的值是对象引用。 (该句子中的“引用”与“引用传递”中的“引用”有 没有 。只是使用“引用”一词对于不同上下文中的许多不同的东西。)因此,这两个变量都可以通过在两个变量中具有相同的值(相同的对象引用)来引用相同的对象。
这与变量和方法参数完全相同。让我们使用一个更简单的例子:
current
我们在内存中有一个Foo a = new Foo();
Foo b = a;
对象,Foo
和a
变量都包含相同的值,这是对该对象的引用。但是这两个变量之间存在 no 连接。例如,如果我们添加这个:
b
...现在我们在内存中有两个b = new Foo();
个对象,Foo
引用(指向)其中一个,a
指向另一个。这样做对b
中的值完全没有影响。 (正好是a
和a
为b
时的方式。)
答案 1 :(得分:1)
这是一个可能有助于显示值/引用传递方式的示例:
http://blog.aaronshaw.net/2014/02/13/java-is-always-pass-by-value/
我将其置于评论中,但他们更难注意到。