内部类在Java中的用途是什么?嵌套类和内部类是一样的吗?

2022-09-03 01:04:24

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

内部类在Java中的用途是什么?嵌套类和内部类是一样的吗?


答案 1

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

匿名课程:方便提高工作效率

它们可以轻松实现回调,而无需创建新的命名类。

button.addActionListener(
      new ActionListener() {
         public void actionPerformed( ActionEvent e ) {
              frame.dispose();
         }
      }
);

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

静态嵌套类:便于封装

静态嵌套类本质上与常规类类似,只是它们的名称是,您可以使用修饰符。因此,它提供了某种形式的封装,而这种封装无法通过顶级类完全实现。OuterClass.StaticNestedClass

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

内部类:便于所有权封装

内部类的实例可以访问其封闭类实例的字段。再想想链表,想象是一个内部类: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;
  }

}

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

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


答案 2

不,它们不一样:内部类是非的。static

JLS 8.1.3 内部类和封闭实例

内部类是未显式或隐式声明为静态的嵌套类。

另请参阅Joe Darcy的以下图表:

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

alt text


相关问题


推荐