Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按值传递-未删除树_Java_Oop_Pass By Reference_Pass By Value - Fatal编程技术网

Java 按值传递-未删除树

Java 按值传递-未删除树,java,oop,pass-by-reference,pass-by-value,Java,Oop,Pass By Reference,Pass By Value,可能重复: 我对JAVA传递值如何与对象一起工作感到有点困惑。例如,如果我将对象作为参数传递给方法。我知道它的地址是作为值传递的。好的,对象的副本保存在传递对象的原始位置表单,因为如果我在被调用的API中创建对对象的新引用并更改其中的某些内容,它不会反映在调用方API中 下面是一段典型的代码,我试图删除一棵树,但它仍然存在 public class DeleteTree { public static void main(String[] args) { Node root = n

可能重复:

我对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;
    }

}
公共类删除树{
公共静态void main(字符串[]args){
节点根=新节点(5);
对于(int i=0;i<10;i++){
如果(i==5)继续;
根.插入节点(i);
}
deleteTreeNonRecursive(根);
System.out.println(root.key);
}
公共静态void deleteTreenRecursive(节点根){
队列q=新的LinkedList();
q、 添加(根);
而(!q.isEmpty()){
节点温度=q.poll();
如果(temp.leftChild!=null)q.add(temp.leftChild);
如果(临时rightChild!=null)q.add(临时rightChild);
温度=零;
}
}
预期的O/p:空指针异常


实际O/p:5。

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

在Java中,您总是通过值将引用传递给该对象(该对象本身已分配到堆中)。不会发生重复,因为您只是在传递指针

在您的示例中,您只是设置了
temp=null
,但这实际上没有任何作用,因为temp是指向
节点的指针,但它是函数的一个局部变量,当您将其设置为
null
时,根本不会触及原始对象,因为您只是在修改引用的值而没有修改g引用的对象

要删除该树,您只需执行以下操作:

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

root = null;
节点根=新节点(5);
对于(int i=0;i<10;i++){
如果(i==5)继续;
根.插入节点(i);
}
root=null;

您希望出现空指针异常,在哪里?为什么?您没有在新引用“temp”中更改任何内容。您的问题与您的代码不匹配。感谢您的解释。因此,您的意思是,如果我要删除一棵树,我可以只删除根对象=null,它将由JVM GC自动删除,因为没有其余节点的引用。@ASingh:在没有引用之后,GC可能会也可能不会取消分配它。您不应该关心对象何时或是否被取消分配。