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

时间:2010-05-31 06:11:05

标签: java inner-classes

  

可能重复:
  Java inner class and static nested class

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

2 个答案:

答案 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

     

alt text


相关问题