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

bil*_*llu 15 java inner-classes

可能重复:
Java内部类和静态嵌套类

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

ewe*_*nli 14

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

匿名课程:方便生产力

它们很容易实现回调,没有创建新命名类的负担.

button.addActionListener(
      new ActionListener() {
         public void actionPerformed( ActionEvent e ) {
              frame.dispose();
         }
      }
);
Run Code Online (Sandbox Code Playgroud)

它们对于线程(例如匿名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;
  }

}
Run Code Online (Sandbox Code Playgroud)

Node属于a的每个实例LinkedList都可以直接访问它.列表与其节点之间存在隐式所有权关系 ; 该列表拥有其节点.如果使用常规类实现,相同的所有权关系将需要额外的代码.

请参阅使用内部和匿名类实现更好的Java代码


pol*_*nts 11

不,他们不一样:内在阶级不是static.

JLS 8.1.3内部类和封闭实例

一个内部类是不明确或隐含声明为静态的嵌套类.

另请参阅Joe Darcy的下图:

Joseph D. Darcy的Oracle Weblog - 嵌套,内部,成员和顶级类

替代文字


相关问题