可能重复:
Java 内部类和静态嵌套类
Java内部类的用途是什么?嵌套类和内部类是一样的吗?
另一个答案很好地解决了差异。关于它们的用法/相关性,这是我的观点:
它们很容易实现回调,无需创建新的命名类。
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
属于 a 的每个实例LinkedList
都可以直接访问它。列表与其节点之间存在隐含的所有权关系;该列表拥有它的节点。如果使用常规类实现相同的所有权关系,则需要额外的代码。
不,它们不一样:内部类是 non- static
。
JLS 8.1.3 内部类和封闭实例
内部类是没有显式或隐式声明为静态的嵌套类。
另请参阅 Joe Darcy 的以下图表:
Joseph D. Darcy 的 Oracle 博客 - 嵌套类、内部类、成员类和顶级类