我查看了LinkedList的Java代码,注意到它使用了一个静态嵌套类Entry。

public class LinkedList<E> ... {
...

 private static class Entry<E> { ... }

}

为什么要使用静态嵌套类,而不是普通的内部类?

我能想到的唯一原因是,Entry不能访问实例变量,所以从OOP的角度来看,它有更好的封装。

但我想可能还有其他原因,可能是表现。可能是什么?

请注意。我希望我的术语是正确的,我将它称为静态内部类,但我认为这是错误的:http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html


当前回答

从http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html:

如果需要访问,请使用非静态嵌套类(或内部类) 到封闭实例的非公共字段和方法。使用静电 嵌套类,如果您不需要此访问。

其他回答

使用静态嵌套类而不是非静态类在某些情况下可以节省空间。例如:在一个类中实现一个比较器,比如Student。

public class Student {
  public static final Comparator<Student> BY_NAME = new ByName();
  private final String name;
  ...
  private static class ByName implements Comparator<Student> {
    public int compare() {...}
  }
}

然后静态确保Student类只有一个Comparator,而不是每次创建新的Student实例时都实例化一个新的Comparator。

从http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html:

如果需要访问,请使用非静态嵌套类(或内部类) 到封闭实例的非公共字段和方法。使用静电 嵌套类,如果您不需要此访问。

首先,非静态内部类有一个额外的隐藏字段,指向外部类的实例。因此,如果Entry类不是静态的,那么除了拥有它不需要的访问之外,它将携带四个而不是三个指针。

作为一个规则,我想说,如果你定义了一个类,基本上是作为数据成员的集合,就像C中的“struct”,考虑让它静态。

你链接到的Sun页面在这两者之间有一些关键的区别:

A nested class is a member of its enclosing class. Non-static nested classes (inner classes) have access to other members of the enclosing class, even if they are declared private. Static nested classes do not have access to other members of the enclosing class. ... Note: A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.

不需要LinkedList。Entry是顶级类,因为它只被LinkedList使用(还有一些其他接口也有名为Entry的静态嵌套类,例如Map。入口-相同的概念)。因为它不需要访问LinkedList的成员,所以它是静态的是有意义的——这是一种更简洁的方法。

正如Jon Skeet所指出的,我认为如果你正在使用一个嵌套类,最好从它是静态的开始,然后根据你的使用情况决定它是否真的需要是非静态的。

在构建器模式中使用静态内部类。静态内部类可以实例化只有私有构造函数的外部类。你不能对内部类做同样的事情,因为你需要在访问内部类之前创建外部类的对象。

class OuterClass {
    private OuterClass(int x) {
        System.out.println("x: " + x);
    }
    
    static class InnerClass {
        public static void test() {
            OuterClass outer = new OuterClass(1);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        OuterClass.InnerClass.test();
        // OuterClass outer = new OuterClass(1); // It is not possible to create outer instance from outside.
    }
}

这将输出x: 1