0

可能重复:
Java、按值传递、引用变量

我对 JAVA 按值传递究竟如何与对象一起工作有点困惑。例如,如果我将一个对象作为参数传递给该方法。我知道它的地址是作为值传递的。好的,对象的副本是否保留在传递对象的原始位置表单中,因为如果我在被调用的 API 中创建对对象的新引用并更改其中的某些内容,它不会反映在我的调用者中API。

下面是一段典型的代码,我尝试删除一棵树,但它仍然存在。

public class DeleteTree {

public static void main(String[] args) {

    Node root = new Node(5);
    for(int i = 0 ; i < 10 ; i++){
        if(i == 5) continue;
        root.insertNode(i);
    }

    deleteTreeNonRecursive(root);
    System.out.println(root.key);

}

public static void deleteTreeNonRecursive(Node root){

    Queue<Node> q = new LinkedList<Node>();
    q.add(root);
    while(!q.isEmpty()){
        Node temp = q.poll();
        if(temp.leftChild != null)q.add(temp.leftChild);
        if(temp.rightChild != null)q.add(temp.rightChild);
        temp = null;
    }

}

预期的 O/P:空指针异常。

实际 O/P: 5。

4

2 回答 2

1

Java始终使用按值传递。当涉及到对象引用时,它是传递的引用值。当您传递对象引用时,它是传递的引用值的副本。使用它,您始终可以访问该对象并更改其属性(在适用的情况下),但是将该引用分配给另一个对象或 null 显然不会对调用方法中的原始引用产生任何影响。

于 2013-01-23T04:08:57.687 回答
1

在 Java 中,您总是按值传递对对象的引用(它本身已分配到堆上)。不会发生重复,因为您只是在传递指针。

在您的示例中,您只是在设置temp = null,但这确实什么也没做,因为 temp 是指向 a 的指针,Node但它是函数的局部变量,当您将其设置null为原始对象时,根本不会因为您只是在修改值而被触及在不修改被引用对象的情况下进行引用。

要删除树,您只需要这样做:

Node root = new Node(5);
    for(int i = 0 ; i < 10 ; i++){
        if(i == 5) continue;
        root.insertNode(i);
    }

root = null;
于 2013-01-23T04:10:27.183 回答