Java中内部类的用途是什么?嵌套类和内部类是否相同?
答案 0 :(得分:14)
另一个答案很好地解决了这个差异。关于它们的用法/相关性,我的观点如下:
它们很容易实现回调,没有创建新的命名类的负担。
button.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
frame.dispose();
}
}
);
它们对于线程也很方便(例如匿名Runnable
)和其他一些类似的模式。
静态嵌套类基本上类似于常规类,除了它们的名称是OuterClass.StaticNestedClass
,你可以使用修饰符。因此它提供了某种形式的封装,这种封装无法通过顶级类完全实现。
考虑一个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;
}
}
属于Node
的每个LinkedList
实例都可以直接访问它。列表与其节点之间存在隐含的所有权关系;该列表拥有其节点。如果使用常规类实现,相同的所有权关系将需要额外的代码。
请参阅Achieve better Java code with inner and anonymous classes
答案 1 :(得分:11)
不,他们不一样:内部阶级不是 - static
。
JLS 8.1.3 Inner Classes and Enclosing Instances
内部类是一个嵌套类,未显式或隐式声明为静态。
请参阅Joe Darcy的以下图表:
Joseph D. Darcy's Oracle Weblog - Nested, Inner, Member, and Top-Level Classes