Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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_Pass By Reference - Fatal编程技术网

Java引用不能用作指针?

Java引用不能用作指针?,java,pass-by-reference,Java,Pass By Reference,下面是我算法中的一段代码: public void insert(int element) { _insert(element, root); System.out.println(root); } private void _insert (int element, Node t) { if (t == null) { t = new Node(null, element);; return; } } 节点这里是一个预定义的类

下面是我算法中的一段代码:

public void insert(int element) {
    _insert(element, root);
    System.out.println(root);
}

private void _insert (int element, Node t) {
    if (t == null) {
        t = new Node(null, element);;
        return;
    }
}
节点
这里是一个预定义的类

调用公共方法
insert
时,将调用私有方法并检查树是否为空。如果是这样,将在
根位置创建一个新节点

输出应该是一个节点。然而,实际的输出是
null
,这意味着根不会被更新,尽管它作为t传递到私有方法中


这应该用C++在指针上工作。也许我误解了Java中的某些东西?

Java总是使用传递值进行方法调用。将引用类型传递给方法时,将创建引用的副本

下一行更改
t
以引用新对象,但不会更改原始变量
root

t = new Node(null, element);

可以更改方法以返回插入的节点,如下所示:

private Node _insert (int element, Node t) {
    if (t == null) {
        t = new Node(null, element);
    }
    return t;
}
这样称呼:

root = _insert(element, root);

在爪哇中,引用是C++指针和引用的混合体。有时,它们的行为就像C++指针和其他时间,就像C++引用。在分配时,作为参数传递给函数或在相等测试中使用,它们的行为类似指针,但是当访问成员时,它们的行为就像C++引用。java java C++中的T.X的定义总是类似于C/C++中的指针(或C++的T.X,但不像Java,C++引用从来不像指针那样运行)。 在java和一般的面向对象编程中,大多数人不会考虑用空变量来表示空列表,这是个好主意。初始化后,变量应始终引用功能完备的对象,因此,应通过对象的内部状态标识空列表;不是通过使用空引用。使用函数的返回值来重新分配一个节点,该节点本身作为参数传递给同一个函数,这更像是某种老式的C/C++黑客攻击,然后是正确的现代面向对象设计。因此,不是:

root = _insert(root, element);
你应该这样写:

MyList root = new MyList();
root._insert (element);
在你们班的某个地方,我的清单:

private void _insert (int element) { 
  if (this.endNode == null) { 
      this.endNode = new Node(); 
  } else {
      this.endNode.nextNode = new Node();
      this.endNote = this.endNote.nextNode;
  }

  this.endNode.element = element;
}
如果您希望_insert函数能够在链表中的任意位置插入元素,那么您应该超过节点的父节点(或者在第一个位置插入元素时为null),或者使用双链表


顺便说一句,Java已经有了一整套集合(包括泛型和非泛型)来表示树和列表,这些树和列表应该能够满足基本需求。

因此,如果我理解正确,就无法在Java中实现指针样式(不使用返回值传递)?@NSF:Java中没有按引用传递。可以将引用放在另一个对象中,并对该对象进行变异。但我展示的方法更简单、更清晰。@pst“引用副本”和“不同变量”是同一回事。@pst“感觉不对劲”和“错误我”与正确性无关,它们与你的感觉有关,Java的指定语义不是一个“实现细节”。当涉及到方法/函数调用时,传递Java引用的工作原理与传递C指针的工作原理完全相同(假设指针“有效”)。不要混淆java引用和C++引用。请参阅,其中描述了这种“现象”,并讨论了它与局部变量的关系。(通过引用值是java实现。)(不,上面的代码和C++指针一样不能工作,请参阅我的其他扩展注释。无论如何,指针-C风格可以用一个可变对象来仿真。我一般不会建议这样的副作用。”-(@)PST是的,你是对的。我在C++中检查了我的原始代码,它使用的是引用而不是指针。好的调用。不,它们总是像C++指针一样。不同语言之间的运算符不同。java中的<代码> .<代码> >与C++中的代码> > > >代码>操作完全相同。java中没有C++的等价代码,因为在java中对象不是值。如果你读了我的第一个答案,事实上。java中的运算符与C++中的->运算符相同,没有C++。java中的操作符就是我所说的,在这方面,它们的行为就像C++引用,但是当涉及到赋值和比较时,它们的行为就像指针;显然,它们并不总是像C++指针或C++引用那样,而是两者的混合。操作符的编写方式不是语义的一部分。