关于这个关键字(java)

时间:2012-02-29 20:33:07

标签: java

我对以下程序的输出有疑问。输出为null。这也是我的想法。我想它,因为显示之前调用的方法只是修改头部的副本而不是头部本身。我假设我可以使用this.head =这对吗?

下面是代码:

public class List {
    private Node head;
    public List (){
        int max=3;
        int i;
        head=null;
        Node aNode=new Node(0);
        for (i=0; i<max; i++) {
            aNode.setNum(i);
            add (aNode);
            aNode.setNext(null);
            }
        }
    public void add(Node aNode) {
        Node temp;
        if(head==null)
            head=aNode;
        else {
            temp=head;
            while(temp.getNext()!=null)
                temp=temp.getNext();
            temp.setNext(aNode);
            }
        }
    public void display() {
        Node temp=head;
        while(temp!=null) {
            System.out.println(temp.getNext());
            temp=temp.getNext();
            }
        }
    }


public class Node {
    private int num;
    private Node next;
    public Node (int n) {num=n; next=null;}
    public int getNum() {return num;}
    public void setNum(int n) {num=n;}
    public void setNext(Node n) {next=n;}
    public Node getNext() {return next;}
    }

public class Driver {
    public static void main(String args[]) {
        List aList=new List();
        aList.display();
        }
}

3 个答案:

答案 0 :(得分:2)

add依赖于接收节点,其中next为空。所以在for循环中移动Node aNode = new Node();

一些卫生言论。

  • (Unimportant)使用current代替temp或其他任何内容。
  • 类中的字段默认为null / 0 / 0.0 / false。

答案 1 :(得分:1)

在我回答你的问题之前,这是一份附注......

  

我在思考它,因为在显示之前调用的方法只是修改头部的副本而不是头部本身。

这是不正确的。

这就是为什么......

    public void display() {

      // Basically, this says, make temp a REFERENCE of head...NOT A COPY!!!!
      Node temp=head;
      while(temp!=null) {
          System.out.println(temp.getNext());
          temp=temp.getNext();
      }
    }

现在,为了回答你的问题,temp为null的原因是因为head为null。 head为null的原因是因为你永远不会初始化它。

从你的构造函数......

    public List (){
      int max=3;
      int i;

      // Here you're saying "set head to null".
      // So when you call display, head is NULL.  You MUST initialize this.
      head=null;

      Node aNode=new Node(0);
      for (i=0; i<max; i++) {
        aNode.setNum(i);
        add (aNode);
        aNode.setNext(null);
      }
    }

答案 2 :(得分:0)

从构造函数中查看此代码:

Node aNode=new Node(0);
for (i=0; i<max; i++) {
    aNode.setNum(i);
    add (aNode);
    aNode.setNext(null);
    }

您创建一个新节点,然后继续尝试将该节点添加到列表中。你需要第一行在for循环中,所以你创建了很多节点。构造函数完成后,您的列表只包含一个节点,值为3.然后,在display()中:

System.out.println(temp.getNext());

首先在第一个节点上调用getNext()。由于只有一个节点,getNext()会返回null,这就是您打印出来的内容。你应该用

替换这一行
System.out.println(temp);

该错误与this关键字完全无关。您只需要this.foo(当foo是您班级的某个数据成员时),以便在您拥有成员和本地变量或具有相同名称的参数时消除歧义。