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

17
2个回答

15

另一个答案已经很好地解释了它们之间的区别。关于它们的使用/相关性,这是我的看法:

匿名类:方便提高生产力

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

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;
  }

}

每个属于LinkedList的Node实例都可以直接访问它。列表和其节点之间存在隐式的所有权关系;列表拥有其节点。如果使用常规类实现,相同的所有权关系将需要额外的代码。
请参见内部类和匿名类:实现更好的Java代码

1
我喜欢这个答案,从 .net 的世界来到一个没有委托存在的世界,内部类可以证明是有用的... - Omar Salem

13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接