Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables_Object - Fatal编程技术网

Java 对象更新和变量更新有点混乱

Java 对象更新和变量更新有点混乱,java,variables,object,Java,Variables,Object,很快的问题。 我正在研究三叉树的删除方法。我的方法很简单,我通过用node.left对象替换node对象来删除和连接 public void delete(int key, Node node) { if (node == null) { throw new RuntimeException(); } else if (key < node.key) { delete(key, node.left) ; } else if (key &g

很快的问题。 我正在研究三叉树的删除方法。我的方法很简单,我通过用node.left对象替换node对象来删除和连接

 public void delete(int key, Node node) {
    if (node == null) {
      throw new RuntimeException();
    } else if (key < node.key) {
       delete(key, node.left) ;
    } else if (key > node.key) {
       delete(key, node.right);
    } else { 
      //found the node to delete, delete from here.
      if (node.mid != null) {
          node = node.mid;
      }
      else if (node.left == null) {
          node = node.right;
      }    
      else if (node.right == null) {
          node = node.left;
        //node.key=node.left.key;
      }
      else {
        node= findMin(node.right);
      } 
    }

  }  
但是如果我显式地编写node.key,那么它就可以工作

 else if (node.right == null){
          node.key=node.left.key;
      }
为什么会这样?
我永远无法理解对象和参考物,天啊。。。谢谢大家。

这是因为在第一种情况下,您根本没有更改用于跟踪下一个要处理的节点的密钥。

问题并不完全清楚,但我认为您必须查看java规范:java通过副本传递值。因此,如果指定的代码是一个方法,而节点是函数的一个参数,那么传递的对象将不会更改,引用的对象(在您的例子中是“key”)是


我希望有帮助

执行删除操作的方法中,
node
是实例变量还是局部变量?我假设它是方法中的局部变量。如果是这种情况,那么您只是在修改引用,而不是对象。例如,如果执行
Node someNode=new Node(),创建一个新节点对象,someNode引用指向该新对象。如果将某个节点传递给某个方法,该方法将收到对同一节点对象的引用。但在该方法中更改引用不会影响原始对象,也不会影响其他引用(someNode)。请使用完整的代码。。。仅仅这段代码是不够的。。。我们只能猜测,不能回答……对不起,我不太明白,你能再解释一下吗?我用node.left对象更改了整个node对象,为什么变量没有更改?我想你已经接近答案了。但正如我所知,复制的是“对象的引用”,而不是整个对象,对象应该是唯一的,并且可以更改。我错过了什么?现在我看到了功能:将“void delete”更改为“Node delete”,并返回节点。是的,java会传递引用,如果您更改引用,它会工作,但是您正在更改本地成员。举个例子:a->ObjectNode[location memory ab12345],删除接收引用b->ObjectNode[location memory ab12345];b随新节点b->NewObjectNode[location memory afff14]更改;a保持不变。更改无效?我应该把它变成什么类型?最后还要考虑java是通过值而不是引用来正式传递参数的。我终于明白了。本地“节点”是一个新的不同节点。因此,函数外部的原始“节点”没有改变。是这样吗?谢谢你。
 else if (node.right == null){
          node.key=node.left.key;
      }