我查看了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


当前回答

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

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

其他回答

这里有一些不明显的内存保留问题需要考虑。由于非静态内部类维护对其“外部”类的隐式引用,如果内部类的一个实例被强引用,那么外部实例也会被强引用。当外部类没有被垃圾收集时,这可能会导致一些令人费解的问题,即使看起来没有任何东西引用它。

静态与普通的原因之一与类加载有关。不能在其父类的构造函数中实例化内部类。

PS:我一直认为“嵌套”和“内部”是可以互换的。术语之间可能有细微的差别,但大多数Java开发人员都能理解。

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

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

非静态内部类会导致内存泄漏,而静态内部类会防止内存泄漏。如果外部类包含大量数据,则会降低应用程序的性能。