当前位置: 首页 > 面试题库 >

接口与类中的内部类

司英彦
2023-03-14
问题内容

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

案例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方法。

进一步的信息:我能够在没有实现AT AT ALL接口的另一个类中实例化A和B的Items类。

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

由于未实例化接口,因此不通过实例化LEVELS接口就可以通过点表示法来访问接口内的所有元素,这仅仅是因为您无法实例化接口-
有效地使接口内定义的类可渗透静态引用。

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


问题答案:

静态内部类与顶级类非常相似,除了内部类可以访问封闭类的所有 静态
变量和方法。封闭的类名有效地附加到内部类的包名称空间。通过将一个类声明为静态内部类,您在传达该类在某种程度上与封闭类的上下文紧密相关。

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

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();

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

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



 类似资料:
  • 使用(方法1)单独的侦听器类(可能是内部类)的好处/缺点是什么: 与(方法2)实现接口 与(方法3)相比,为每个需要侦听器的元素设置一个匿名类。 问:这些方法的优点和缺点是什么?是否有性能优势,或者任何推荐一个而不是另一个的设计模式?或者任何其他好处? 我可以看到: 第一种方法是清洁 注意:我看到一个关于嵌套类vs实现ActionListener的问题;但大多数答案似乎给出了患者使用的方法,而不是

  • 问题内容: 因此,当研究lambda表达式并用它们代替Java中的EventHandlers的匿名内部类时,我遇到了一些匿名内部类,这些使我停下来思考。例如,当为通常实现ActionListener的东西编写匿名内部类时,我们会编写 我对此感到困惑,因为ActionListener是一个接口,所以我认为有必要做类似的事情… 但这甚至无法编译。我想我这样做的原因显然是如果我们使用私有内部类,而使用

  • 问题内容: 据我所知,我们无法实例化接口,那么这是怎么发生的呢? 问题答案: 您无法实例化接口,但是可以为实现该接口的类的对象提供接口的引用,因此在代码中,您正在实现接口并创建该类的对象并提供该类的引用。

  • 问题内容: 我将如何为正在实现接口的内部类编写构造函数?我知道我可以上一门全新的课,但是我认为必须有一种方法可以做到这一点: 当我输入此内容时,它不会将AbstractAction方法识别为构造函数(编译器要求返回类型)。有人有主意吗? 问题答案: 只需在扩展类的名称后面插入参数即可: 另外,您可以使用初始化块:

  • 为什么需要接口? 我们来看一下这个代码,对于眼神不好使的人来说简直就是遭罪,当然我这里只是简单的给了几个属性,假如有20个属性呢?20个使用这种结构的函数呢? function somefunc1({ x = 0, y = 0 }: { x: number, y: number }) { // ... } function somefunc2({ x = 0, y = 0, z = 0

  • TypeScript中的这些语句(与)之间有什么区别?