Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中内部类的用途是什么?嵌套类和内部类是相同的吗?_Java_Inner Classes - Fatal编程技术网

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

Java中内部类的用途是什么?嵌套类和内部类是相同的吗?,java,inner-classes,Java,Inner Classes,可能重复: Java中内部类的用途是什么?嵌套类和内部类是一样的吗?不,它们不一样:内部类是非静态的 内部类是不是显式或隐式声明为静态的嵌套类 也可参考Joe Darcy的下图: 相关问题 另一个答案很好地解决了这一差异。关于它们的用法/相关性,我的观点如下: 匿名类:方便提高生产力 它们便于轻松实现回调,而无需创建新的命名类 它们对于线程(例如匿名Runnable)和其他一些类似模式也很方便 静态嵌套类:便于封装 静态嵌套类本质上类似于常规类,只是它们的名称是OuterClass.S

可能重复:


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

不,它们不一样:内部类是非静态的

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

也可参考Joe Darcy的下图:


相关问题

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

匿名类:方便提高生产力 它们便于轻松实现回调,而无需创建新的命名类

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

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

例如,考虑一个
链接列表
,您希望其类
节点
(仅在内部使用)在包视图中不可见。将其设置为静态嵌套类,使其完全位于
链接列表的内部

内部类:便于所有权封装 内部类的实例可以访问其封闭类实例的字段。再想想链表,想象一下
节点
是一个内部类:

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

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


请参见

我喜欢这个答案,从.net世界到不存在委托的世界,内部类可以证明是有用的。。。
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;
  }

}