我正在实施双向链表,下面是我的代码段。
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中自动调用?
答案 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
类