当我使用匿名内部类来创建节点时。当我打印所有键时,它们打印为0,而不是我在匿名类声明中指定的值。难道我做错了什么?这是我的代码:
public class LinkedListTest {
Node head;
public void addInOrder(final int value) {
if (head == null) {
head = new Node() {
int key = value;
};
}
else if(head.key > value) {
final Node temp = head;
head = new Node() {
int key = value;
Node next = temp;
};
}
else {
Node theNode = head;
while(theNode.key < value) {
if (theNode.next == null) {
theNode.next = new Node() {
int key = value;
};
return;
}
else if(theNode.next.key > value) {
final Node temp = theNode.next;
theNode.next = new Node() {
int key = value;
Node next = temp;
};
return;
}
theNode = theNode.next;
}
}
}
这是我的节点的类声明:
class Node {
int key;
Node next;
}
这是我的打印方法:
public void printAll(Node hasNode) {
if (hasNode != null) {
System.out.println(hasNode.key);
if (hasNode.next != null) {
printAll(hasNode.next);
}
}
}
答案 0 :(得分:3)
这是因为您没有为Node
中的字段赋值,而是将值赋给匿名子类中具有相同名称的字段。
将构造函数添加到class Node {
int key;
Node next;
Node(int key, Node next) {
this.key = key; this.next = next;
}
}
,并且不要创建匿名子类:
Node(int key) {
this(key, null);
}
或者,您可以添加第二个只接受密钥的构造函数:
new Node(key, null)
另一种方法就是调用{{1}}。
答案 1 :(得分:0)
正如Andy Turner回答的那样,您在匿名类中声明key
和next
作为匿名类的实例变量,并且您正在初始化这些实例变量,但它们与实例变量无关。来自班级Node
的同名。
如果它更容易理解,那么:
theNode.next = new Node() {
int key = value;
Node next = temp;
};
相当于这样的本地类:
class Foo extends Node {
int key = value;
Node next = temp;
};
theNode.next = new Foo();
或者您甚至可以将该课程从课程中取出,以便捕捉更清晰:
// outside the method
class Foo extends Node {
int key;
Node next;
Foo(int value, Node temp) { key = value; next = temp; }
};
// inside the method
theNode.next = new Foo(value, temp);
关键是,在所有这些情况下,您要为Foo
的实例变量赋值,而不是Node
的实例变量。
您可以在匿名类中执行初始化,以允许您分配Node
的实例变量。虽然匿名类没有构造函数(它们不需要它们),但可以在实例初始化程序中完成初始化:
theNode.next = new Node() {
{
key = value;
next = temp;
}
};
它通常以“双支撑初始化”样式编写:
theNode.next = new Node() {{
key = value;
next = temp;
}};