【问题标题】:What are the uses of inner classes in Java? Are nested classes and inner classes the same? [duplicate]Java内部类的用途是什么?嵌套类和内部类是一样的吗? [复制]
【发布时间】:2011-02-25 20:49:46
【问题描述】:

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

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

【问题讨论】:

    标签: java inner-classes


    【解决方案1】:

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

    JLS 8.1.3 Inner Classes and Enclosing Instances

    inner 类是没有显式或隐式声明为静态的嵌套类。

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

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


    相关问题

    【讨论】:

      【解决方案2】:

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

      匿名类:方便生产力

      它们很容易实现回调,无需创建新的 named 类。

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

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

      静态嵌套类:方便封装

      静态嵌套类本质上和普通类一样,只是它们的名字是OuterClass.StaticNestedClass,你可以使用修饰符。因此,它提供了某种形式的封装,而顶级类无法完全实现。

      LinkedList 为例,您希望类 Node(仅在内部使用)在包视图中不可见。使其成为静态嵌套类,使其完全位于LinkedList 内部。

      内部类:方便所有权封装

      内部类的instance 可以访问其封闭类instance 的字段。再想想链表,想象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 实例都可以直接访问它。列表与其节点之间存在隐含的所有权关系;该列表拥有它的节点。如果使用常规类实现相同的所有权关系,则需要额外的代码。

      Achieve better Java code with inner and anonymous classes

      【讨论】:

      • 我喜欢这个答案,从 .net 世界到没有代表存在的世界,内部类可以证明是有用的......
      猜你喜欢
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      相关资源
      最近更新 更多