嵌套类的非法修饰符

时间:2016-09-05 20:22:49

标签: java

public class Deque<Item> implements Iterable<Item> {

    private int N; // size of the list
    private Node first;
    private Node last;


    public Deque() {


        private class Node {
            private Item item;
            private Node next;
            private Node prev;

        }
    }
}

我一直收到错误,我的私有类Node有一个非法的修饰符,只允许final或abstract。但Node类不能独立,所以我不认为需要静态。如何在私有类中声明项目和节点有什么问题吗?如何解决此错误?

2 个答案:

答案 0 :(得分:4)

你的逻辑基本上是健全的。主要的缺陷是你试图在构造函数中定义类,而你应该直接在Dequeue内定义它:

public class Deque<Item> implements Iterable<Item> {

    private class Node {
        private Item item;
        private Node next;
        private Node prev;
    }

    ...
}

允许在方法内定义一个类,但这不是你需要的。有关背景信息,请参阅Use of class definitions inside a method in Java

答案 1 :(得分:1)

您可以在块中定义类(如方法和构造函数),它们被称为Local classes

但是,就像您无法将本地变量声明为privateprotectedpublic一样,您也无法声明本地类使用访问修饰符 - 因为它没有意义。本地类只在定义方法中可见。

如果确实打算声明本地类,请删除访问修饰符。但是,由于您在类型Node的顶级类中声明字段,因此无法将其声明为本地类:只需将其移出构造函数。

只需了解关于“我不认为需要静态”的评论:我认为static 不需要。将static添加到嵌套类应该是您的默认操作,除非您确实需要从Deque实例引用包含Node实例。

问题是每个Node类都会有Deque的隐藏引用,以便您可以通过Deque访问Deque.this实例。如果您不需要此引用,则可以通过创建嵌套类static来减少不使用它所使用的内存。