Java内部类的用途是啥?嵌套类和内部类是一样的吗? [复制]
Posted
技术标签:
【中文标题】Java内部类的用途是啥?嵌套类和内部类是一样的吗? [复制]【英文标题】:What are the uses of inner classes in Java? Are nested classes and inner classes the same? [duplicate]Java内部类的用途是什么?嵌套类和内部类是一样的吗? [复制] 【发布时间】:2011-02-25 20:49:46 【问题描述】:可能重复:Java inner class and static nested class
Java 内部类的用途是什么?嵌套类和内部类是一样的吗?
【问题讨论】:
【参考方案1】:不,它们不一样:内部类不是static
。
JLS 8.1.3 Inner Classes and Enclosing Instances
inner 类是没有显式或隐式声明为静态的嵌套类。
另请参阅 Joe Darcy 的以下图表:
Joseph D. Darcy's Oracle Weblog - Nested, Inner, Member, and Top-Level Classes
相关问题
Java inner class and static nested class【讨论】:
【参考方案2】:另一个答案很好地解决了差异。关于它们的用法/相关性,这是我的看法:
匿名类:方便生产力
它们很容易实现回调,无需创建新的 named 类。
button.addActionListener(
new ActionListener()
public void actionPerformed( ActionEvent e )
frame.dispose();
);
它们对于线程(例如匿名Runnable
)和其他一些类似的模式也很方便。
静态嵌套类:方便封装
静态嵌套类本质上和普通类一样,只是它们的名字是OuterClass.StaticNestedClass
,你可以使用修饰符。因此,它提供了某种形式的封装,而***类无法完全实现。
以 LinkedList
为例,您希望类 Node
(仅在内部使用)在包视图中不可见。使其成为静态嵌套类,使其完全位于LinkedList
内部。
内部类:方便所有权和封装
内部类的instance 可以访问其封闭类instance 的字段。再想想链表,想象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
实例都可以直接访问它。列表与其节点之间存在隐含的所有权关系;该列表拥有它的节点。如果使用常规类实现相同的所有权关系,则需要额外的代码。
见Achieve better Java code with inner and anonymous classes
【讨论】:
我喜欢这个答案,从 .net 世界到没有代表存在的世界,内部类可以证明是有用的......以上是关于Java内部类的用途是啥?嵌套类和内部类是一样的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章