为什么自动调用innerclass的重写方法?

时间:2018-02-07 10:27:46

标签: java class doubly-linked-list

我正在实施双向链表,下面是我的代码段。

public class DoublyLinkedList {

private Node head = null;
private Node tail = null;
private int size = 0;

private class Node{

    private Object data;
    private Node next;
    private Node previous;

    private Node(Object input) {
       this.data = input;
       this.next = null;
       this.previous = null;
    }// Node.Constructor

    public String toString() {
        return String.valueOf(this.data);
    }

  }// class Node

  public Node node(int k) {
      Node x = head;
      for(int i = 0; i < k; i++) {
         x = x.next;
      }
    return x; 
  }// DoublyLinkedList.node
}// class DoublyLinkedList

public static void main(String[] args) {

    DoublyLinkedList l = new DoublyLinkedList();
    l.addFirst(3);
    l.addFirst(4);
    l.addFirst(5);
    l.addFirst(6);
    System.out.println(l.node(0));
    System.out.println(l.node(1));
    System.out.println(l.node(2));
    System.out.println(l.node(3));
}

在这段代码中,没有Node类中的toString方法,node方法返回第k个节点的地址。但是,使用此toString方法,它返回数据第k个节点包含虽然我从未调用过此方法。为什么这个方法在innnerclass中自动调用?

2 个答案:

答案 0 :(得分:1)

Object#toString()已在Object类中定义,因此如果您没有覆盖toString,那么它将调用Object#toString(),并查看它在对象类中的样子。

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

因此,默认情况下,它将返回与类名连接的hasCode的HexString。但是当您在调用的Node类toString中覆盖Node#toString时。

答案 1 :(得分:1)

您可以在调试器中看到或稍微修改您的代码,看看发生了什么......

DoublyLinkedList l = new DoublyLinkedList();
l.addFirst(3);
Node n0 = l.node(0)
System.out.println(n0);

并且System.out.println(Object obj)的实施是

public void print(Object obj) {
    write(String.valueOf(obj));
}

String.valueOf(Object obj)

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

...并调用toString()(如果已定义)或默认来自java.lang.Object