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代码