Java中内部类的用途是什么?

What are the uses of inner classes in Java? Are nested classes and inner classes the same?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Java inner class and static nested class

Java中内部类的用法是什么?嵌套类和内部类是相同的吗?


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

匿名类:方便生产力

它们很容易实现回调,而不需要创建新的命名类。

1
2
3
4
5
6
7
button.addActionListener(
      new ActionListener() {
         public void actionPerformed( ActionEvent e ) {
              frame.dispose();
         }
      }
);

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

静态嵌套类:便于封装

静态嵌套类本质上类似于常规类,只是它们的名称是OuterClass.StaticNestedClass,您可以使用修饰符。因此,它提供了一些顶级类无法实现的封装形式。

例如,考虑一个LinkedList,您希望类Node(仅在内部使用)在包视图中不可见。使其成为静态嵌套类,以便它完全位于LinkedList的内部。

内部类:便于所有权和封装

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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代码


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

JLS 8.1.3 Inner Classes and Enclosing Instances

An inner class is a nested class that is not explicitly or implicitly declared static.

另请参阅Joe Darcy的下图:

Joseph D. Darcy's Oracle Weblog - Nested, Inner, Member, and Top-Level Classes

alt text

相关问题

  • Java内部类和静态嵌套类