在java中无法访问匿名内部类成员

时间:2015-12-09 21:17:40

标签: java inner-classes anonymous-class anonymous-inner-class

当我使用匿名内部类来创建节点时。当我打印所有键时,它们打印为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);
        }
    }
}

2 个答案:

答案 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回答的那样,您在匿名类中声明keynext作为匿名类的实例变量,并且您正在初始化这些实例变量,但它们与实例变量无关。来自班级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;
}};