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

每个内部类都需要一个封闭的实例吗?

伏德义
2023-03-14
问题内容

术语“ 内部类” 通常被认为是“需要一个封闭实例的嵌套类”。但是,JLS声明如下:

8.1.3。内部类和封闭实例

[…]

内部类包括本地(第14.3节),匿名(第15.9.5节)和非静态成员类(第8.5节)。

[…]

内部类的声明发生在静态上下文中的实例没有词法包围的实例。

也,

15.9.5。匿名类声明

[…]

匿名类始终是内部类(第8.1.3节);从来没有static(§8.1.1,§8.5.1)。

众所周知,可以在静态上下文中声明匿名类:

class A {
  int t() { return 1; }
  static A a =  new A() { int t() { return 2; } };
}

为了含蓄地描述它,

new A() {} 是在静态上下文中定义的,没有封闭实例的嵌套类,但它不是静态嵌套类,而是一个内部类。

我们在日常使用中是否都给这些术语分配了不适当的含义?

作为相关的关注点,此历史规范文档将术语“
顶级” 定义为 inner 的反义词:

作为static类成员的类和作为包成员的类都称为顶级类。它们与内部类的不同之处在于顶级类只能直接使用其自己的实例变量。

在通常用法中, 顶级 被视为 nested 的反面。


问题答案:

从规范的角度来看,问题中提出的区别是完全合理的:

  • 内部类具有对其施加的限制,这与封闭实例的问题无关(例如,它可能没有静态成员);

  • 静态嵌套类的概念基本上只是命名空间;这些类可以正确地称为 顶级类 ,以及我们通常认为的顶级类。

恰好发生这样的情况,即static从嵌套类声明中删除会同时做两件事:

  1. 它使类需要一个封闭的实例;
  2. 它使班级 内部化

我们很少将 内部 视为限制。我们只关注 包含实例的 关注点,这一点更加明显。但是,从规范的角度来看,这些限制是至关重要的。

我们缺少的是一个 需要封闭实例的类 的术语。JLS并没有定义这样的术语,因此我们(似乎没有意识到)劫持了一个相关的术语,但实际上是本质上不同的术语。



 类似资料:
  • 考虑类<代码> OuterClass < />代码> <代码> InnerClass < /代码> 第二个类,它试图扩展

  • 目前,我有一个类的集合,其中包含一个纹理、一个VAO和一个VBO。由于所有的状态切换和使用少量三角形调用,绘制数千个这样的对象会导致性能下降。 因此,现在我将更改我的实现,以便创建一系列1MIB VBO(从一个开始,一旦它满了,创建第二个1MIB VBO并继续填充它)。每个VBO需要单独的VAO吗?VBO已经使用了交错的顶点数据,所以我不是在谈论使用多个VBO来处理顶点、法线、纹理库等。

  • 问题内容: 每个Java程序都要求至少存在一个类。 以上说法总是正确的吗? 问题答案: 是的,您至少需要一个类才能拥有一个程序,但是 不需要 ,您不需要任何方法(与其他答案相反)。 需要一个类的原因是因为在Java中,所有代码都在类内部。因此,要获取任何代码,您需要一个类。但是,代码不一定需要包含在方法中。它也可以在初始化器中。因此,这是一个没有方法的完整Java程序: 那给… 编辑:从Java

  • 因此,我将从一个代码库构建一组应用程序,并使用productFlavors自定义每个应用程序。 每种口味都需要有自己的Google Analytics跟踪ID,所以我开始为每种口味生成一个新的google-services.json,我发现Google Developer控制台有一个限制。 问题是,如何对所有口味使用相同的json文件?(每种口味都有自己的applicationID)

  • 在阅读java Doc时,我得到了以下东西。 内部类C是类O的直接内部类,如果O是C的直接词汇封闭类,并且C的声明不发生在静态上下文中 所以如果我写信 我的问题是在这两个内部类中,哪一个是O的直接内部类? 我也有一些观点。 2.如果类O是C的第n-1个词汇封闭类的直接封闭类,则它是C的第n个词汇封闭类。 3.类O的直接内部类C的实例i与O的实例关联,称为i的直接封闭实例。对象的直接封闭实例(如果有

  • 问题内容: 所以我在Rails应用程序中有一个表单,该表单使用自定义FormBuilder给我一些自定义字段标签 现在,此部分位于表单的区域中,该区域将被AJAX回调替换。我最终响应AJAX请求从控制器执行的操作是: 但是,如果我这样做,则表单将中断,因为我在form_for中使用的FormBuilder对象不再可用。我有什么办法可以在用于AJAX回调的部分内部使用自定义FormBuilder对象