如何使用变量创建对我的对象的引用?
所以我有一个名为“SNode
s”的节点阵列(它们是我自己创建的一个类,它们实际上只是一个基本节点,它包含一个字符串和一个指向下一个节点的指针)。如何使用变量创建对我的对象的引用?
我有一个方法叫做insertValue()
,它接受你想要放入一个值的索引和你想要SNode
包含的字符串。但是,如果通过的索引已包含SNode
,我希望新值成为SNode
的“下一个”节点(实质上是在每个索引空间中创建一个链接的节点列表)。
private int insertValue(int arrayPos, String element){//Checks for collisions with another SNode, and inserts the SNode into the apppropriate spot in the array
SNode targetNode = array[arrayPos];//What I want to be a reference to the node at the desired position in the array
while (targetNode != null){//If an SNode already exists in that position, keeps iterating down until it gets to a non-existant SNode.
targetNode = targetNode.getNext();//getNext is a method in my SNode that just returns a reference to that SNode's "nextNode" variable.
}
targetNode = new SNode(element);
return arrayPos;
}//end insertValue
我的问题是我运行此方法后,它不会创建所需的排列位置的新节点,甚至当阵列点为空第一次运行。
如果我改变targetNode = new SNode(element);
到array[arrayPos] = new SNode(element);
这显然插入SNode
入阵就好了,这样使我相信所发生的事情是新SNode
正处于变量targetNode
创建的,但targetNode
没有链接到实例化后的数组位置。我假设它基本上是将数据从第2行的数组位置复制到变量中,但随后变成了它自己的独立实体。
那么我怎么有targetNode
实际参考和影响SNode
? (当我重复上下贯通的节点在已经占据阵列空间链表这样的方式,targetNode指向正确的)
注:为了简单起见,我已经离开了在SNode
中使用setNext()
方法的行将链接列表中的前一个节点链接到其下一个节点。
你有一个误解。变量和数组元素都不包含对象。他们将引用对象。此外,变量和数组位置本身不是对象,因此Java中没有办法引用它。最接近你可以得到的是你的变量或数组位置包含的值的副本(对对象的引用)。
因此,本...
SNode targetNode = array[arrayPos];
...副本array[arrayPos]
值入变量targetNode
。如果该值不是null
,则后面的变量引用与数组元素相同的对象,但该对象本身不会被复制。这很好,并正是你想要在这种情况下什么,当你走路
targetNode = targetNode.getNext();
链表,你不想修改array[arrayPos]
或任何节点的next
refernces的,因为那时你会失去链接列表的元素。
但是你不能两面都有。当你最终找到新SNode
的位置,并执行这个...
targetNode = new SNode(element);
...它没有参考记录的新SNode
无论它是你最近拷贝targetNode
的从价值。它只是在targetNode
中提供参考。
你想要做的是找到最后一个当前节点(如果有的话),并分配给它的next
引用(如果最初是null
,则直接指向数组元素)。
这里targetNode
涉及array[arrayPos]
引用的对象。
SNode targetNode = array[arrayPos];//What I want to be a reference to the node at the desired position in the array
但是当你写:
targetNode = targetNode.getNext();//getNext is a method in my SNode that just
你改变由targetNode
变量引用的对象。现在它指的是它的下一个节点。
然后,当你这样做:
targetNode = new SNode(element);
您创建一个新的对象,并将其分配给targetNode
变量,但最后却是从来没有关联到现有的节点。
它不会为下一个节点分配一个新节点。
要做到这一点,你可以写:
targetNode.setNext(new SNode(element));
是的,但即使数组点在第一次运行时也是空的(因此它跳过while循环,因为'targetNode == null'),它不会在那里放置一个新节点。但是,谢谢你指出这可能会让人困惑,我会编辑这个问题。 – Guy
不客气。它不起作用的原因是我已经解释过:'targetNode = new SNode(element);'创建一个新对象并将其分配给'targetNode'变量。但它意味着'targetNode'变量不再引用'array [arrayPos]'。所以它对'array [arrayPos]'没有影响。 – davidxxx
是的,那正是我的问题。那么我该如何拥有'targetNode'引用'array [arrayPos]'? – Guy
啊哈!好吧,所以*初始*时间我需要一个'if'语句来检查数组索引是否为空。如果是这样,我需要直接编辑数组索引来添加新的SNode.但在此之后,我可以使用'targetNode'指向它后面的链表对象,并且它将正常工作。谢谢,这完全解决了我的问题! – Guy