为什么java中数据结构的内部类都是静态的?

这是LinkedList的内部Node

private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

这是HashMap的内部Node

static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
    TreeNode<K,V> parent;  // red-black tree links
    TreeNode<K,V> left;
    TreeNode<K,V> right;
    TreeNode<K,V> prev;    // needed to unlink next upon deletion
    boolean red;
    TreeNode(int hash, K key, V val, Node<K,V> next) {
        super(hash, key, val, next);
    }
}
阅读 3.1k
2 个回答

static的inner class,其实就是一个普通的class,只是和它的outer class打包在一起,写起来和命名上方便一点,仅此而已。 如果这里不用static,反而复杂了,非static的inner class对其outer class是有引用的,需要考虑更多的使用上的问题。 总之,应该优先使用static的inner class。

新手上路,请多包涵

声明为static是为了 这个内部类 可以被其他类的内部类继承(如 LinkedHashMap的内部类Entry继承自HashMap的Node类),如果不声明为static,则无法继承

对一个非static的内部类来说,这个内部类实际上是归属于一个外部类的对象,在创建一个内部类对象时,是用外部类对象.new的方式去创建的,声明为static之后,这个内部类才直属外部类。

声明为default是专属java.util包的其他类使用,从另一个角度说,如果是protected或public,则其他外部类继承这个外部类就可以使它的内部类继承这个外部类的非static内部类,这时不需要static关键字也可以继承,那么default和static在这里不并用也没有意义

类库中非static的内部类,主要是为了使用 外部类.this 的方式在内部类中操作外部类对象或者在内部类中能够操作外部类的属性,这些内部类都是private声明,因为非static声明的内部类无法直接被其他内部类继承,内部类也没有必要在外部被访问,所以理所当然的使用private

有些已经是private了为什么还要加上static,才是真正的定义上的原因,非static的内部类实际上归属于一个外部类的对象,加static之后,这个内部类才直属于外部类,是归属于类级别的内容,且不需要访问外部类的内容,static的内部类应该属于标准的内部类,更符合它的定义和意义

推荐问题