接口中的内部类与类中的内部类

这两个内类声明之间有什么区别?还评论优点/缺点?

情况 A:类中的类。

public class Levels {   
  static public class Items {
    public String value;
    public String path;

    public String getValue() {
      return value;}
  }
}

和案例 B:接口内的类。

public interface Levels{

  public class Items {
    public String value;
    public String path;

    public String getValue() {
      return value;}
  }
}

进行了更正:对 getvalue 方法的放置。

更多信息:我能够在另一个完全不实现接口的类中实例化 Items 类,在 A 和 B 两种情况下。

public class Z{//NOTE: NO INTERFACE IMPLEMENTED here!!!!
 Levels.Items items = new Levels.Items();
}

由于接口未实例化,因此接口内的所有元素都可以通过点表示法访问,而无需实例化 LEVELS 接口,因为您无法实例化接口 - 有效地使接口内定义的类能够渗透到静态引用中。

因此,在 B 不是静态的情况下说 Items 类是没有意义的。由于 A 和 B 这两种情况都以相同的方式实例化,因此我不是在寻找静态、内部或嵌套的语义。不要再给我关于语义的答案了。我想要编译器,运行时和行为差异/优势,或者如果没有,那就这么说。请不要再回答语义问题了!!!!!JVM或.NET VM规范内部的专家请回答这个问题,而不是教科书语义学家。


答案 1

内部类是嵌套类,非静态类称为内部类。有关详细信息,请查看此处static

但是,我喜欢引用同一链接的摘录。

静态嵌套类与其外部类(和其他类)的实例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是嵌套在另一个顶级类中的顶级类,以便于打包。

在第二种情况下,你没有使用这个词。你认为它会隐含地因为它是一个接口。你假设这一点是对的。staticstatic

您可以在界面中实例化内部类,就像静态嵌套类一样,因为它实际上是一个嵌套类。static

Levels.Items hello = new Levels.Items();

因此,上述声明在您的两种情况下都有效。您的第一种情况是静态嵌套类,在第二种情况下,您没有指定 ,但即使这样,它也将是一个静态嵌套类,因为它在接口中。因此,除了一个嵌套在类中,另一个嵌套在接口中这一事实之外,没有任何区别static

通常,类中的内部类(而不是接口中的类)将按如下方式实例化。

Levels levels = new Levels();
Levels.Items items = levels.new Items();

此外,“非静态”内部类将对其外部类具有隐式引用。“静态”嵌套类不是这种情况。


答案 2

静态内部类大多类似于顶级类,只是内部类可以访问封闭类的所有静态变量和方法。封闭的类名有效地追加到内部类的包命名空间中。通过将类声明为静态内部类,您可以传达该类以某种方式与封闭类的上下文密不可分地联系在一起。

非静态内部类不太常见。主要区别在于,非静态内部类的实例包含对封闭类实例的隐式引用,因此可以访问该封闭类实例的实例变量和方法。这导致了一些看起来奇怪的实例化习语,例如:

Levels levels = new Levels(); // first need an instance of the enclosing class

// The items object contains an implicit reference to the levels object
Levels.Items items  = levels.new Items(); 

与静态内部类相比,非静态内部类与其封闭类的联系要紧密得多。它们具有有效的用法(例如,迭代器通常作为它们迭代的数据结构类中的非静态内部类实现)。

当你真正只需要静态内部类行为时,声明一个非静态内部类是一个常见的错误。


推荐