2016-01-31 64 views
1
public class IntList { 
    private IntNode _head; 
    public IntList() { 
     _head = null; 
    } 
} 

我创建了一个名为IntList的类。 IntList包含一个搜索具有指定int值的IntNode对象的方法。这是方法:将一个变量分配给另一个变量后,为什么更改一个变量不会改变另一个?

public boolean findElementInList(int value) { 
    IntNode currentNode = this._head; 

    while (currentNode.getValue() != value && 
      currentNode.getNext() != null) { 
     currentNode = currentNode.getNext(); 
    } 

    return (currentNode.getValue() == value); 
} 

的方法完成后,原_head实例变量是完整的 - 但为什么呢? currentNode指向方法中的_head(混叠),并且对currentNode所做的每个更改也应反映在_head(每次运行currentNode = currentNode.getNext();时)。

这是getNext()代码:

public IntNode getNext() {return _next;} 
+1

currentNode是头的另一个引用,并且您通过调用_head.getNext()将该引用更改为列表中的下一个元素,除非getNext()以某种方式修改头,否则头不会更改 – SomeDude

+0

getNext() '回来?请包括'IntNode'的代码。 – activedecay

回答

0

您在开始处将头部的值分配给currentNode。把它看作是2个不同的指针指向内存中的相同值。但是,您继续将列表中的下一个值分配给currentNode,而_head保持不变。顺便说一句,如果你改变你的头值,你将失去你的名单的头。

+0

谢谢!的确,在开始时我指向'_head',但是currentNode指向'currentNode.getNext()' – Yos

0

你永远不改变原有_head。你只是实例化currentNode,它指向_head。如果你想改变_head你应该在最后改变你的头不同的价值,而不是指向它。例如_head = ...

0

您的head实例变量保持不变,因为您不修改findElementInList方法中的任何内容。

举个例子:

喜欢的东西

_head.setValue(10); 

currentNode = this._head; 
currentNode.setValue(10); 

会修改你的头节点。在currentNode.setValue(10);的情况下,`this._head'的内容将因“别名”而被修改 - 两个变量都指向相同的位置。

重要说明:为currentNode分配新值根本不会修改this.head的值。它只让currentNode指向一个新节点。因此,

currentNode = currentNode.getNext(); 

让currentNode指向其后处理程序而不更改this._head的内容。这就是“指向对象的Java变量只是引用”的含义。

存在这样的情况,其中,分配给一个变量将改变变量值:

currentNode.setValue(10);

int x = 10; x = x + 1; // x == 11

会突变一些值。在第一种情况下,您将更改第二种情况下的对象内容,您使用的是不是对某种对象的引用的所谓“原始值”。

相关问题