0

我有一个使用“ListNode”类对象的链接列表

ListNode 具有以下非静态方法:

getValue()
setValue(Object obj)
getNext()
setNext(ListNode ln)

它的构造函数接受一个值和一个下一个。

在我的驱动程序类的主要方法中,创建我的链表:

ListNode head = new ListNode("Overflow!", null);
head = new ListNode("Stack", head);
head = new ListNode("in", head);
head = new ListNode("is", head);
head = new ListNode("This", head);

我有一个方法叫printList(ListNode ln).

我在我的主要方法中连续调用它两次,如下所示:

printList(head);
System.out.println();
printList(head);

我的方法如下所示:

public static void printList(ListNode head)
{
    while(head != null)
    {
        System.out.print(head.getValue()+" ");
        head = head.getNext();
    }
}

在我的方法中,每次在 while 循环中将引用更改为指向不同的对象。所以在我退出方法后,引用“head”应该指向一个空值,对吧?但是,当第二次调用 printList(head) 时,它会神奇地打印列表中的所有元素!

这是 jGrasp 控制台显示的内容:

 ----jGRASP exec: java StackOverflowQuestionExampleClass

This is in Stack Overflow! 
This is in Stack Overflow! 
 ----jGRASP: operation complete.

这是我的老师告诉我使用的 listnode 类:

//Thomas Bettge, TJHSST, 10-20-2006
    public class ListNode
   {
      private Object value;
      private ListNode next;
       public ListNode(Object v, ListNode n)
      {
         value=v;
         next=n;
      }
       public Object getValue()
      {
         return value;
      }
       public ListNode getNext()
      {
         return next;
      }
       public void setValue(Object newv)
      {
         value=newv;
      }
       public void setNext(ListNode newn)
      {
         next=newn;
      }
   }
4

2 回答 2

1

head是方法 print 中的本地引用。重新分配给它不会影响head方法外的引用。

于 2012-11-03T23:14:44.103 回答
1

混淆可能源于您有 2 个具有相同名称“head”的标签。printList 方法中的“head”参数是对传入对象的新引用。重新分配它不会影响原始引用的目标(从某种意义上说,t 不会导致它引用其他东西。一个旁白:改变被引用对象的状态会产生影响,因为它是同一个对象,不管引用它的是什么)。

可能会更清楚地查看您的代码,如下所示:

public void yourMainMethod() {
    ListNode head = new ListNode("Overflow!", null);
    head = new ListNode("Stack", head);
    head = new ListNode("in", head);
    head = new ListNode("is", head);
    head = new ListNode("This", head);

    printList(head);
    System.out.println();
    printList(head);
}

//note different name, to clarify this is a separate reference
public static void printList(ListNode node) {
    while(node != null)
    {
        System.out.print(node.getValue()+" ");
        node = node.getNext();

        //node.setValue(new Object());//note that this would change the state inside the ListNode passed in
    }
}
于 2012-11-04T01:24:31.030 回答