使用交换函数在Java中交换两个引用时出现意外的结果

com*_*e99 1 java

我有两个引用,引用一个指向对象a,引用b指向对象b,然后我调用一个交换函数试图让一个指向对象b,b指向对象a,它在交换函数中交换,但是主要功能的结果没有改变.那我该怎么办?

交换功能:

private void swap(Stack<TreeNode> a, Stack<TreeNode> b) {
    Stack<TreeNode> temp = new Stack<TreeNode>();
    temp = a;
    a = b;
    b = temp;
}
Run Code Online (Sandbox Code Playgroud)

Ósc*_*pez 5

交换的结果是方法的本地,一旦方法返回其调用点就不会有任何影响 - 你只是交换局部变量.调用该方法时,会传递对象引用的副本,而不是实际的对象本身.

Java具有按值传递的语义,在对象作为参数传递给方法的情况下,这意味着传递了引用的副本.看看这篇文章的一个例子.

还要注意的是,对象引用现有之前调用该方法,和现有的参考文献的方法,参数实际上是指向同一个对象,因此该对象的内容,你的方法里面做任何修改,留在原地,一旦方法返回.