按值传递 - 树未删除 [重复]

Pass by value - tree not deleted [duplicate]

提问人:ASingh 提问时间:1/23/2013 最后编辑:halferASingh 更新时间:9/24/2018 访问量:160

问:

这个问题在这里已经有答案了:
10年前关闭。

可能的重复项:
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:nullpointer 异常。

实际 O/P:5.

Java OOP 按引用传递

评论

0赞 user207421 1/23/2013
您期待空指针异常在哪里?为什么?您不会更改新引用“temp”中的任何内容。您的问题与您的代码不符。

答:

1赞 Swapnil 1/23/2013 #1

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

1赞 Jack 1/23/2013 #2

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

在您的示例中,您只是在设置,但这确实没有任何作用,因为 temp 是指向 a 的指针,但它是函数的局部变量,当您将其设置为原始对象时,根本没有触及,只是因为您只是修改引用的值而没有修改引用的对象。temp = nullNodenull

要删除树,这是您唯一需要的:

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

root = null;

评论

0赞 ASingh 1/23/2013
谢谢你的解释。所以,你的意思是说,如果我想删除一棵树..我只能使用根对象 = null,JVM GC 会自动删除它,因为其余节点没有引用。
0赞 newacct 1/23/2013
@ASingh:在没有引用后,GC 可能会也可能不会解除分配它。您不应该关心对象何时或是否被释放。