2012-12-11 53 views
0

我是新来的java。 这个问题可能不太清楚。让我解释一下使用代码。 下面的代码是一个打印出链接列表中的值的函数。 该函数的第一行创建一个引用,以指向HeadNode引用指向的同一个对象。因此,对currentNode的任何更改都会影响HeadNode指向的对象。 现在,在while循环中,我正在改变currentNode,但是我观察到linkedList在我退出函数后没有改变。为什么?如何在不改变函数参数值的函数中创建参考?

static void PrintLinkedList(ListNode HeadNode) 
    { 
     ListNode currentNode = HeadNode; 
     while(currentNode != null) 
     { 
      System.out.println(currentNode.getData()); 
      currentNode = currentNode.getNext(); 
     } 
    } 

UPDATE:

把这个quesiton了我的理由是,当我实现了一个函数来扭转链表,我tempNode下面的代码执行后成为空:

static ListNode ReverseLinkedList(ListNode headNode) 
    { 
     ListNode headNodeTemp = headNode; 
     headNodeTemp.setNext(null); 
     ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why?? 
     ListNode currentNode = headNodeTemp; 
     while(tempNode != null) 
     {... 

回答

2

因此,对currentNode的任何更改都会影响HeadNode指向的对象。

不,currentNode是对对象的引用HeadNode也是指。你永远不会改变那个物体,你所改变的只是currentNode所指的那个物体。

currentNode = currentNode.getNext(); 

使currentNode指向下一个对象,它不改变任何对象。

更改的对象,你需要调用一个方法或设置属性,

currentNode.mutate(); 
currentNode.property = 17; 

将改变指向的对象,当对象是通过HeadNode查询这些变化将是可见的。

currentNode = currentNode.getNext(); 

只是使currentNode指向另一个对象。

static ListNode ReverseLinkedList(ListNode headNode) 
{ 
    ListNode headNodeTemp = headNode; 
    headNodeTemp.setNext(null); 

这里,我们称之为改变了所指对象的方法。按照名称,它将next字段设置为null。而对象headNodeTemp指向的是对象headNode指向。

ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why?? 
    ListNode currentNode = headNodeTemp; 
    while(tempNode != null) 
    {... 

你应该移动

ListNode tempNode = headNode.getNext(); 

线以上setNext(null)线。

static ListNode ReverseLinkedList(ListNode headNode) 
{ 
    ListNode headNodeTemp = headNode; 
    ListNode tempNode = headNode.getNext(); 
    headNodeTemp.setNext(null); 
    ListNode currentNode = headNodeTemp; 
    while(tempNode != null) 
    {... 
+0

但currentNode引用该对象。因此,currentNode中的任何更改都会更改该对象。对? – user1701840

+0

不,''currentNode'只是一个保存对象地址的变量。 'currentNode'的改变改变'currentNode'指向的内容。要改变'currentNode'指向的对象,你必须调用一个方法或设置一个属性。 'currentNode.mutate();'会改变对象。 –

+0

请阅读我的,我希望澄清它。如果没有,请ping我。如果你不想改变对象,你不能调用任何改变它的方法。但我认为这可能是一个问题。 –

0

您正在混淆对象和引用。

currentNode = x不会更改currentNode指向的对象。相反,它将currentNode变量更改为指向不同的对象。

这不会影响碰巧指向旧对象的任何其他字段或变量。

0

与其他帖子一致。所有参数都是Java中的传值 - 演示:

public static void main(String[] args) { 

    List a = new ArrayList(); 
    a.add("Fred"); 

    changeA(a); 
    // contents of a is "Fred" not "Barney" (change to 'a' not reflected back here) 
    // because all arguments are Pass-By-Value 

    addToA(a); 
    // contents of a is "Fred" AND "Barney" 

    int b = 10;  

    changeB(b); 
    // b = 10 (not 20) 
} 

static void changeA(List a) { 
    a = new ArrayList(); // a is now a different object 
    a.add("Barney"); 
} 

static void addToA(List a) { 
    a.add("Barney"); 
} 

static void changeB(int b) { 
    b = 20; 
}