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


当前回答

内部类的优势——

一次性使用 支持和改进封装 readibility 私有字段访问

没有外部类的存在,内部类就不存在。

class car{
    class wheel{

    }
}

内部类有四种类型。

正常的内部类 局部内部类 匿名内部类 静态内部类

点——

from static inner class ,we can only access static member of outer class. Inside inner class we cananot declare static member . inorder to invoke normal inner class in static area of outer class. Outer 0=new Outer(); Outer.Inner i= O.new Inner(); inorder to invoke normal inner class in instance area of outer class. Inner i=new Inner(); inorder to invoke normal inner class in outside of outer class. Outer 0=new Outer(); Outer.Inner i= O.new Inner(); inside Inner class This pointer to inner class. this.member-current inner class outerclassname.this--outer class for inner class applicable modifier is -- public,default, final,abstract,strictfp,+private,protected,static outer$inner is the name of inner class name. inner class inside instance method then we can acess static and instance field of outer class.

10.内部类在静态方法中,那么我们只能访问的静态字段

外部类。

class outer{

    int x=10;
    static int y-20;

    public void m1() {
        int i=30;
        final j=40;

        class inner{

            public void m2() {
                // have accees x,y and j
            }
        }
    }
}

其他回答

我不知道性能上的差异,但正如你所说,静态嵌套类不是外围类实例的一部分。创建一个静态嵌套类似乎更简单,除非你真的需要它是一个内部类。

这有点像为什么在Java中我总是让我的变量是final的——如果它们不是final的,我知道它们有一些有趣的事情发生了。如果使用内部类而不是静态嵌套类,应该有一个很好的理由。

内部类的优势——

一次性使用 支持和改进封装 readibility 私有字段访问

没有外部类的存在,内部类就不存在。

class car{
    class wheel{

    }
}

内部类有四种类型。

正常的内部类 局部内部类 匿名内部类 静态内部类

点——

from static inner class ,we can only access static member of outer class. Inside inner class we cananot declare static member . inorder to invoke normal inner class in static area of outer class. Outer 0=new Outer(); Outer.Inner i= O.new Inner(); inorder to invoke normal inner class in instance area of outer class. Inner i=new Inner(); inorder to invoke normal inner class in outside of outer class. Outer 0=new Outer(); Outer.Inner i= O.new Inner(); inside Inner class This pointer to inner class. this.member-current inner class outerclassname.this--outer class for inner class applicable modifier is -- public,default, final,abstract,strictfp,+private,protected,static outer$inner is the name of inner class name. inner class inside instance method then we can acess static and instance field of outer class.

10.内部类在静态方法中,那么我们只能访问的静态字段

外部类。

class outer{

    int x=10;
    static int y-20;

    public void m1() {
        int i=30;
        final j=40;

        class inner{

            public void m2() {
                // have accees x,y and j
            }
        }
    }
}

你链接到的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所指出的,我认为如果你正在使用一个嵌套类,最好从它是静态的开始,然后根据你的使用情况决定它是否真的需要是非静态的。

简单的例子:

package test;

public class UpperClass {
public static class StaticInnerClass {}

public class InnerClass {}

public static void main(String[] args) {
    // works
    StaticInnerClass stat = new StaticInnerClass();
    // doesn't compile
    InnerClass inner = new InnerClass();
}
}

如果是非静态的,类不能被实例化,除非在上层类的实例中(所以在main是静态函数的例子中就不是这样)

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