Java中内部类的用途是什么? 嵌套类和内部类是一样的吗?

可能重复:
Java内部类和静态嵌套类

Java中内部类的用途是什么? 嵌套类和内部类是一样的吗?

不,他们不一样:内部阶级是非static

JLS 8.1.3内部类和封闭实例

内部类是未显式或隐式声明为静态的嵌套类。

另请参阅Joe Darcy的下图:

Joseph D. Darcy的Oracle Weblog – 嵌套,内部,成员和顶级类

替代文字


相关问题

  • Java内部类和静态嵌套类

另一个答案很好地解决了这个差异。 关于它们的用法/相关性,这是我的看法:

匿名课程:方便生产力

它们很容易实现回调,没有创建新命名类的负担。

 button.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { frame.dispose(); } } ); 

它们也适用于线程(例如匿名Runnable )和一些其他类似的模式。

静态嵌套类:用于封装的方便

静态嵌套类本质上类似于常规类,除了它们的名称是OuterClass.StaticNestedClass并且您可以使用修饰符。 因此它提供了某种forms的封装,这种封装无法通过顶级类完全实现。

想想一个LinkedList的例子,你希望在包视图中看不到类Node (仅在内部使用)。 使它成为一个静态嵌套类,以便它完全在LinkedList内部。

内部类:方便所有权封装

内部类的实例可以访问其封闭类实例的字段。 再想想链表,想象Node是一个内部类:

 public class LinkedList { private Node root = null; public class Node { private Object obj; private Node next; ... public void setAsRoot() { root = this; } } public Node getRoot() { return root; } public void setRoot( Node node ) { root = node; } } 

属于LinkedList每个Node实例都可以直接访问它。 列表与其节点之间存在隐式所有权关系 ; 该列表拥有其节点。 如果使用常规类实现,相同的所有权关系将需要额外的代码。

请参阅使用内部和匿名类实现更好的Java代码